3. 流水线集成基础:CI/CD流水线概念、Jenkins/GitLab CI核心组件、流水线阶段划分
3.1 CI/CD流水线核心概念
持续集成与持续交付(CI/CD)是现代软件交付的基石。流水线(Pipeline)将代码从提交到部署的整个过程自动化、标准化,确保每次变更都能快速、可靠地到达目标环境。
核心定义:CI/CD流水线是一系列自动化阶段的集合,代码变更依次通过每个阶段,经过验证、构建、测试与部署,最终交付给用户。
| 概念 | 目标 | 关键活动 | 产出物 |
|---|---|---|---|
| 持续集成(CI) | 频繁合并代码,尽早发现集成问题 | 代码合并、静态分析、单元测试、编译构建 | 可部署的构建产物(Artifact) |
| 持续交付(CD) | 确保构建产物随时可部署到生产环境 | 自动化测试、环境部署、验收测试 | 经过验证的发布候选版本 |
| 持续部署(CD) | 将通过验证的版本自动部署到生产 | 蓝绿部署、金丝雀发布、滚动更新 | 生产环境中的运行服务 |
实践要点:在蓝绿发布场景中,CI阶段负责构建两个完全相同的环境镜像,CD阶段则控制流量在蓝绿环境间的切换与回滚。
3.2 流水线阶段划分与流程
一个标准的生产级流水线通常划分为以下阶段,每个阶段都有明确的入口条件与出口标准:
- 代码检出(Checkout):从Git仓库拉取指定分支的源代码。
- 静态分析(Static Analysis):执行代码规范检查、安全漏洞扫描(SAST)。
- 单元测试(Unit Test):运行开发者编写的单元测试用例,确保函数级正确性。
- 构建与打包(Build & Package):编译代码,生成Docker镜像或JAR/WAR包。
- 镜像推送(Image Push):将构建产物推送至制品仓库(如Harbor、Nexus)。
- 集成测试(Integration Test):在预发布环境部署,执行API测试、契约测试。
- 部署准备(Deploy Prep):准备蓝绿环境、更新配置、执行数据库迁移。
- 生产部署(Production Deploy):执行蓝绿切换或滚动更新。
- 健康检查与回滚(Health Check & Rollback):验证服务健康,失败时自动触发回滚。
3.3 Jenkins核心组件与架构
Jenkins作为最成熟的CI/CD引擎,其核心组件构成了流水线执行的基础设施:
| 组件 | 角色 | 关键特性 |
|---|---|---|
| Jenkins Master | 调度中心,管理任务与资源 | Web UI、REST API、任务调度、插件管理 |
| Jenkins Agent(Node) | 执行实际构建任务的Worker | 支持Docker、Kubernetes动态扩缩容 |
| Pipeline(流水线) | 定义CI/CD流程的DSL脚本 | Declarative Pipeline(声明式)与Scripted Pipeline(脚本式) |
| Stage(阶段) | 流水线中的逻辑分组单元 | 可视化进度、失败定位、并行执行 |
| Step(步骤) | 阶段内的最小执行单元 | sh、git、docker、archiveArtifacts等 |
| Plugin(插件) | 扩展Jenkins功能的生态组件 | Kubernetes、Git、Blue Ocean、SonarQube |
蓝绿发布中的Jenkins实践:使用Declarative Pipeline定义
environment块管理蓝绿环境变量,通过input步骤实现人工审批门禁,利用retry和timeout控制回滚超时。
// Jenkins Declarative Pipeline 示例(蓝绿发布片段)
pipeline {
agent any
environment {
BLUE_ENV = 'blue-cluster'
GREEN_ENV = 'green-cluster'
ACTIVE_ENV = "${env.ACTIVE_ENV ?: 'blue'}"
}
stages {
stage('Checkout') {
steps { git 'https://git.example.com/app.git' }
}
stage('Build & Push') {
steps {
sh 'docker build -t app:${BUILD_NUMBER} .'
sh 'docker push registry.example.com/app:${BUILD_NUMBER}'
}
}
stage('Deploy to Inactive') {
steps {
script {
def targetEnv = (ACTIVE_ENV == 'blue') ? GREEN_ENV : BLUE_ENV
sh "kubectl apply -f k8s/${targetEnv}/deployment.yaml"
}
}
}
stage('Health Check') {
steps {
timeout(time: 5, unit: 'MINUTES') {
sh 'curl -f http://inactive-app.example.com/health'
}
}
}
stage('Switch Traffic') {
input { message '确认切换流量?' }
steps {
sh 'kubectl patch service app -p \'{"spec":{"selector":{"env":"green"}}}\''
}
}
}
post {
failure {
echo '触发回滚流程...'
sh 'kubectl rollout undo deployment/app'
}
}
}
3.4 GitLab CI核心组件与架构
GitLab CI将CI/CD能力深度集成在代码仓库中,其核心组件与Jenkins形成互补:
| 组件 | 角色 | 关键特性 |
|---|---|---|
| GitLab Runner | 执行CI任务的Worker进程 | 支持Docker、Kubernetes、Shell、SSH执行器 |
| .gitlab-ci.yml | 流水线定义文件(仓库根目录) | YAML语法、Stage/Job结构、变量、缓存 |
| Stage(阶段) | 流水线的执行阶段 | 顺序执行,同一Stage的Job可并行 |
| Job(任务) | 阶段内的具体执行单元 | 定义script、artifacts、environment、rules |
| Artifact(制品) | Job产出的文件或目录 | 可在后续Job间传递,支持过期策略 |
| Environment(环境) | 部署目标环境的抽象 | 支持手动部署、滚动更新、回滚操作 |
GitLab CI优势:天然与Merge Request集成,可在MR页面直接查看流水线状态;支持
needs关键字实现DAG(有向无环图)流水线,提升并行效率。
# .gitlab-ci.yml 示例(蓝绿发布片段)
stages:
- build
- test
- deploy-blue
- deploy-green
- switch
- rollback
variables:
DOCKER_IMAGE: registry.example.com/app:${CI_COMMIT_SHORT_SHA}
build:
stage: build
script:
- docker build -t ${DOCKER_IMAGE} .
- docker push ${DOCKER_IMAGE}
artifacts:
paths:
- k8s/
unit-test:
stage: test
script:
- npm test
needs: [build]
deploy:blue:
stage: deploy-blue
script:
- kubectl apply -f k8s/blue/deployment.yaml
environment:
name: blue
url: https://blue.app.example.com
only:
- main
deploy:green:
stage: deploy-green
script:
- kubectl apply -f k8s/green/deployment.yaml
environment:
name: green
url: https://green.app.example.com
only:
- main
switch:production:
stage: switch
script:
- kubectl patch service app -p '{"spec":{"selector":{"env":"green"}}}'
environment:
name: production
url: https://app.example.com
when: manual
only:
- main
rollback:
stage: rollback
script:
- kubectl rollout undo deployment/app
when: on_failure
3.5 Jenkins与GitLab CI对比
| 维度 | Jenkins | GitLab CI |
|---|---|---|
| 安装方式 | 独立部署(WAR/Docker/Helm) | 集成在GitLab中,或独立Runner |
| 流水线定义 | Jenkinsfile(Groovy DSL) | .gitlab-ci.yml(YAML) |
| 插件生态 | 超过1800个插件,高度可扩展 | 内置功能丰富,插件较少 |
| 并行能力 | Stage内并行、多Agent并行 | Stage内Job并行、DAG依赖 |
| 与代码仓库集成 | 需Webhook或插件连接 | 原生深度集成 |
| 蓝绿发布支持 | 通过Kubernetes插件、自定义脚本 | 通过Environment、手动Job、回滚API |
| 回滚机制 | post/failure块、rollback插件 | when: on_failure、环境回滚按钮 |
选型建议:如果团队已深度使用GitLab,优先选择GitLab CI以减少运维复杂度;如果已有Jenkins基础设施或需要高度定制化插件,Jenkins仍是更灵活的选择。在蓝绿发布场景中,两者都能通过Kubernetes API实现流量切换与回滚。
3.6 流水线集成最佳实践
- 阶段门禁(Stage Gate):每个阶段设置明确的准入准出条件,例如单元测试覆盖率必须≥80%才能进入构建阶段。
- 制品版本化:使用语义化版本号或Git Commit SHA标记构建产物,确保可追溯性。
- 环境隔离:开发、测试、预发布、生产环境使用独立的Kubernetes命名空间或集群,避免相互影响。
- 幂等性部署:确保同一版本多次部署结果一致,避免因环境状态差异导致部署失败。
- 回滚自动化:在流水线中预定义回滚步骤,当健康检查失败时自动执行,减少人工介入时间。
- 审计日志:记录每次部署的版本、时间、操作人、审批记录,满足合规要求。
本章小结:CI/CD流水线是蓝绿发布策略的执行载体。Jenkins与GitLab CI作为两大主流工具,分别以插件生态和原生集成为核心优势。理解流水线阶段划分、核心组件及最佳实践,是后续实现蓝绿环境切换与网络回滚的基础。