【CI/CD·入门篇】核心概念全解:构建、测试、集成、交付、部署与回滚
前言上一篇我们了解了 CI/CD 的整体面貌但构建测试部署这些词看似简单实际操作中有很多细节和坑。本篇逐一拆解流水线中的核心概念让你在后续搭建流水线时清楚知道每个阶段在做什么、为什么要做、怎么做。一、构建Build从源码到产物什么是构建构建是将人类可读的源代码转化为机器可执行的产物的过程。不同语言栈的构建方式不同| 语言/框架 | 构建工具 | 产物类型 | 示例命令 ||-----------|---------|---------|---------|| Java | Maven / Gradle | JAR / WAR |mvn clean package|| Go | go build | 二进制文件 |go build -o app .|| Node.js | npm / yarn / pnpm | dist 目录 |npm run build|| Python | pip / poetry | wheel / egg |python setup.py bdist_wheel|| 前端 | webpack / vite | 静态文件 |npm run build|构建阶段的关键实践1. 确定性构建同一个代码版本不管在谁的机器上构建结果应该一致。实现方式# 固定基础镜像版本 FROM node:18.19.0-alpine AS builder WORKDIR /app # 先复制 lock 文件利用 Docker 缓存层 COPY package-lock.json ./ RUN npm ci # ci 模式严格按 lock 文件安装不用 package.json COPY . . RUN npm run build**踩坑提示**用 npm install 而非 npm ci 会导致不同时间构建出不同的依赖版本。CI 环境必须用 npm ci或 yarn install --frozen-lockfile。2. 构建缓存大型项目全量构建可能需要10-20分钟。利用缓存可以大幅提速# GitLab CI 缓存示例 build: cache: key: ${CI_COMMIT_REF_SLUG} paths: - .m2/repository # Maven 本地仓库 - node_modules/ # Node 依赖 script: - mvn clean package -DskipTests3. 构建产物的版本管理每次构建出的产物应该有一个唯一标识通常用 Git commit hash 构建时间VERSION$(git rev-parse --short HEAD)-$(date %Y%m%d%H%M) docker build -t myapp:${VERSION} .二、测试Test流水线的守门员测试金字塔/\ / \ E2E 测试少量 /----\ 速度慢、成本高、维护难 / \ / 集成 \ 集成测试适量 / 测试 \ 验证模块间交互 /------------\ / \ / 单元测试大量\ 速度快、覆盖率高 -------------------- CI 中跑得最多的CI 中的测试策略| 测试类型 | CI 中执行 | 说明 ||---------|----------|------|| 单元测试 | 每次提交 | 必须跑覆盖率应 70% || 集成测试 | 每次提交/每日 | 模块间接口验证 || E2E 测试 | 每日/发版前 | 全链路验证慢但重要 || 性能测试 | 每周/发版前 | 基线性能对比 || 安全测试 | 每次提交 | SAST/DAST 扫描 |测试报告与质量门禁CI 流水线不仅要跑测试还要对结果做决策——这就是质量门禁Quality Gate# GitHub Actions 示例测试覆盖率低于 70% 则失败 - name: Run tests with coverage run: mvn test - name: Check coverage run: | COVERAGE$(grep -oP line-rate\K[0-9.] target/site/jacoco/jacoco.xml) echo Coverage: ${COVERAGE} # 转换为百分比 PERCENT$(awk BEGIN {print ${COVERAGE} * 100}) if [ $(awk BEGIN {print ($PERCENT 70)}) -eq 1 ]; then echo Coverage ${PERCENT}% is below 70% threshold exit 1 fi**培训要点**不要一上来就设90%覆盖率门禁这会逼着团队写无意义的测试来凑数。从50%开始逐步提高每季度提升5-10个百分点。三、集成Integration代码合并的艺术持续集成的核心集成不是把代码打包那么简单它的核心是让多人协作的代码尽早、频繁地合并。常见的分支策略与集成方式1. Git Flow适合发版周期长的项目master ──────────●──────────────●──── (生产) \ / / \ / / develop ──●───●────●───●──●──●──── (开发主干) \ / feature ●───●──●─● (功能分支)2. GitHub Flow适合持续部署的项目master ──●──●──●──●──●──●──●── (直接就是生产) \ │ │ / PR ──●──┘ │ └──● │ PR ──────●3. Trunk-Based Development最适合 CI/CDmain ──●──●──●──●──●──●──●──●──●── (所有人频繁合并到 main) \ / \ /\ / short ●─● ●─● ●─● (短生命周期分支1天)**踩坑提示**功能分支存活时间越长合并冲突越大。Trunk-Based Development 要求分支生命周期不超过24小时这对测试自动化要求很高但收益最大。集成触发机制# GitLab CIPR 合并到主干时触发完整流水线 workflow: rules: - if: $CI_PIPELINE_SOURCE merge_request_event when: always - if: $CI_COMMIT_BRANCH main when: always - when: never # 其他情况不触发四、交付与部署Delivery Deployment从代码到线上持续交付 vs 持续部署持续交付Continuous Delivery: 代码 → CI → 测试通过 → 可发布状态 → [人工点击] → 生产环境 持续部署Continuous Deployment: 代码 → CI → 测试通过 → 自动部署 → 生产环境部署策略| 策略 | 原理 | 适用场景 ||------|------|---------|| 滚动部署Rolling | 逐步替换旧实例 | 无状态服务 || 蓝绿部署Blue-Green | 两套环境切换 | 需要快速回滚 || 金丝雀发布Canary | 少量流量先试新版本 | 风险较高的变更 || 影子部署Shadow | 新版本接收流量但不处理 | 性能验证 |部署配置示例Kubernetes 滚动更新apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 4 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # 滚动过程中最多多出1个Pod maxUnavailable: 0 # 滚动过程中不允许减少可用Pod template: spec: containers: - name: app image: myapp:v2 readinessProbe: # 就绪探针只有健康检查通过才接收流量 httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5**踩坑提示**maxUnavailable: 0 readinessProbe 是零停机部署的关键组合。如果缺少就绪探针Kubernetes 会把流量打到还没启动完的 Pod 上导致用户看到 502。五、回滚Rollback出问题后的救命稻草回滚的两种方式1. 重新部署旧版本推荐# 重新部署上一个版本 kubectl rollout undo deployment/myapp # 回滚到指定版本 kubectl rollout undo deployment/myapp --to-revision3 # 查看部署历史 kubectl rollout history deployment/myapp2. 蓝绿切换瞬间回滚# 当前流量在蓝色环境出问题后瞬间切回绿色 kubectl patch service myapp -p {spec:{selector:{version:green}}}数据库变更的回滚难题代码可以一键回滚但数据库变更DDL往往不可逆-- 正向迁移 ALTER TABLE orders ADD COLUMN status VARCHAR(20); -- 回滚迁移需要提前写好 ALTER TABLE orders DROP COLUMN status;**踩坑提示**数据库迁移必须遵循扩展-收缩Expand-Contract模式。先加新列兼容旧代码部署新代码验证无误后再删旧列。千万不要一步到位改表结构。六、本篇要点回顾1.构建要确定性——同一份代码每次构建结果一致2.测试遵循金字塔——大量单元测试 适量集成测试 少量E2E3.集成要频繁——分支生命周期越短越好4.部署要选对策略——无状态用滚动高风险用金丝雀5.回滚要提前准备——尤其是数据库变更用扩展-收缩模式下一篇预告《CI vs CD vs Continuous Deployment三个层次的区别与联系》——我们用三个实际的流水线配置来展示三个层次的具体差异。

相关新闻

告别下载限速:3步解锁九大网盘直链下载权限

告别下载限速:3步解锁九大网盘直链下载权限

告别下载限速:3步解锁九大网盘直链下载权限 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷…

2026/9/13 15:18:26 阅读更多 →
如何彻底掌控Windows安全防护:Defender Control完整实践指南

如何彻底掌控Windows安全防护:Defender Control完整实践指南

如何彻底掌控Windows安全防护:Defender Control完整实践指南 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control …

2026/9/24 11:02:42 阅读更多 →
DeepSeek + Codex

DeepSeek + Codex

DeepSeek V4 Flash 昨天发布了、并且原生支持 Responses API&#xff0c;并且对 Codex 完成了适配&#xff0c;这个格式是 oai 的新版通用格式。DeepSeek 官方更是直接提供了一键部署脚本 &#x1f4a1; macOS / Linux 用户在终端中执行&#xff1a; bash <(curl -fsSL http…

2026/9/25 16:17:01 阅读更多 →

最新新闻

OAuth2四种授权模式详解:Spring Security 6落地实践与避坑指南

OAuth2四种授权模式详解:Spring Security 6落地实践与避坑指南

做OAuth2服务端和客户端开发这几年&#xff0c;我最大的感受是&#xff1a;很多人对四种授权模式的理解还停留在“背流程”的阶段&#xff0c;面试能画出授权码模式的时序图&#xff0c;但真到了项目里配 Spring Security 6&#xff0c;遇到 redirect_uri 不匹配、scope 校验不…

2026/9/27 0:52:05 阅读更多 →
SpringBoot基于OJ的Java课程实验管理系统设计与实现

SpringBoot基于OJ的Java课程实验管理系统设计与实现

做Java方向毕业设计或者课程设计的同学&#xff0c;对“SpringBoot基于OJ的Java课程实验管理系统”这类题目应该不陌生。我最初看到这个题的时候&#xff0c;第一反应是&#xff1a;这不就是套了个课程管理壳的在线判题系统&#xff08;Online Judge&#xff09;吗&#xff1f;…

2026/9/27 0:52:05 阅读更多 →
哈夫曼编码刷题到实战:贪心策略、优先队列与无损压缩

哈夫曼编码刷题到实战:贪心策略、优先队列与无损压缩

每日一题做到第三天&#xff0c;不少刷题群里已经有人开始“怎么又是树”的哀嚎了。今天这道题叫哈夫曼编码&#xff0c;题目描述通常很简单&#xff0c;但真正让人卡住的&#xff0c;往往不是题目本身&#xff0c;而是它背后连着的一条完整知识链&#xff1a;贪心策略、优先队…

2026/9/27 0:52:05 阅读更多 →
Coder:自托管远程开发操作系统与AI编码代理实践

Coder:自托管远程开发操作系统与AI编码代理实践

1. Coder不是IDE插件&#xff0c;而是一套可私有部署的远程开发操作系统很多人第一次听说Coder&#xff0c;是在VS Code Marketplace里看到那个叫“Coder”的扩展图标&#xff0c;点进去发现它既不写代码也不补全语法&#xff0c;只有一行小字写着“Connect to a Coder workspa…

2026/9/27 0:52:05 阅读更多 →
基于碳交易的微电网优化调度建模与Matlab实现

基于碳交易的微电网优化调度建模与Matlab实现

做微电网优化调度这个方向有几年了&#xff0c;早些年大家一提优化&#xff0c;默认就是经济调度&#xff1a;光伏、风电、储能、柴油机、市电&#xff0c;怎么搭配能让日运行成本最低。但碳交易机制上线后&#xff0c;这个题的边界变了——系统不仅要满足负荷平衡&#xff0c;…

2026/9/27 0:52:05 阅读更多 →
Python f-string性能原理与工程实践指南

Python f-string性能原理与工程实践指南

1. 为什么我彻底停用了.format()和%&#xff0c;只用 f-string&#xff1f;三年前我还在带一个刚转行的实习生&#xff0c;他写了一段爬虫日志记录代码&#xff1a;log_msg "Request to {url} failed with status {code}, retrying {count} times".format(urlendpoi…

2026/9/27 0:51:05 阅读更多 →

日新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集&#xff1a;Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集&#xff1a;Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →