2. 流水线基础:CI/CD流水线概念、Jenkins/GitLab CI核心组件、流水线触发机制
2.1 CI/CD流水线核心概念
持续集成与持续交付(CI/CD)是现代软件交付的基石。流水线将代码从提交到部署的整个过程自动化,确保每次变更都经过一致的构建、测试和部署流程。在蓝绿发布场景中,流水线负责自动切换流量、验证新版本健康状态,并在必要时执行回滚。
| 阶段 | 核心活动 | 蓝绿发布中的关键作用 |
|---|---|---|
| 持续集成(CI) | 代码合并、静态分析、单元测试、构建制品 | 确保新版本(绿色)代码质量,生成可部署的容器镜像或二进制包 |
| 持续交付(CD) | 环境部署、集成测试、配置管理、制品发布 | 将绿色版本部署到空闲环境,执行网络配置与安全策略验证 |
| 持续部署(可选) | 自动上线、流量切换、监控告警 | 自动完成蓝绿切换,根据健康检查结果决定保留或回滚 |
关键理解: 蓝绿发布依赖流水线将“部署”与“切换”解耦。CI阶段保证制品可靠,CD阶段保证环境就绪,而切换动作通常由流水线中的手动确认步骤或自动化健康检查触发。
2.2 Jenkins核心组件与流水线结构
Jenkins作为最成熟的CI/CD引擎,其流水线以Pipeline as Code为核心,通过Jenkinsfile定义整个交付流程。在蓝绿发布场景中,Jenkins通过声明式语法管理多阶段任务。
2.2.1 核心组件
- Master节点: 调度任务、管理配置、提供Web UI。负责解析
Jenkinsfile并分配任务到Agent。 - Agent节点: 实际执行构建、测试、部署命令的工作节点。支持Docker、Kubernetes动态Agent。
- Pipeline: 由Stage(阶段)和Step(步骤)组成的自动化流程。每个Stage可包含多个并行Step。
- 插件生态: 如Kubernetes插件、Git插件、Blue Ocean UI、Credentials Binding等。
2.2.2 声明式Pipeline示例(蓝绿部署片段)
pipeline {
agent any
stages {
stage('Build & Push Image') {
steps {
sh 'docker build -t myapp:${BUILD_NUMBER} .'
sh 'docker push registry.example.com/myapp:${BUILD_NUMBER}'
}
}
stage('Deploy to Green') {
steps {
sh 'kubectl apply -f k8s/green-deployment.yaml'
sh 'kubectl set image deployment/myapp-green myapp=registry.example.com/myapp:${BUILD_NUMBER}'
}
}
stage('Health Check') {
steps {
sh 'kubectl rollout status deployment/myapp-green --timeout=120s'
}
}
stage('Switch Traffic') {
input {
message "确认切换流量到绿色环境?"
ok "确认切换"
}
steps {
sh 'kubectl patch service myapp -p \'{"spec":{"selector":{"version":"green"}}}\''
}
}
}
}
安全注意: Jenkins中存储的凭据(如Kubeconfig、镜像仓库密码)必须使用Credentials插件加密存储,避免明文出现在
Jenkinsfile或构建日志中。建议使用withCredentials块包裹敏感操作。
2.3 GitLab CI核心组件与流水线结构
GitLab CI将CI/CD深度集成在代码仓库中,使用.gitlab-ci.yml定义流水线。其天然与GitLab仓库、容器注册表、Kubernetes集成紧密,适合云原生蓝绿发布场景。
2.3.1 核心组件
| 组件 | 说明 | 蓝绿发布中的角色 |
|---|---|---|
| GitLab Runner | 执行CI任务的代理,支持Docker、Kubernetes、Shell等执行器 | 在Kubernetes集群中动态启动Runner,执行部署与测试 |
| Pipeline | 由多个Stage组成的有向无环图(DAG),每个Stage包含多个Job | 定义build、test、deploy-green、switch等阶段 |
| Job | 最小的执行单元,运行在独立容器中 | 每个Job执行一个原子操作,如构建镜像、运行健康检查 |
| Artifacts | Job产生的文件,可在后续Job或外部系统使用 | 传递测试报告、部署清单、网络策略文件 |
| Environment | 部署目标环境的抽象,支持手动确认和回滚 | 定义green和blue两个环境,实现流量切换与回滚 |
2.3.2 GitLab CI流水线示例(蓝绿部署片段)
stages:
- build
- deploy-green
- health-check
- switch
variables:
IMAGE_TAG: ${CI_COMMIT_SHORT_SHA}
GREEN_NAMESPACE: app-green
build:
stage: build
script:
- docker build -t registry.example.com/myapp:${IMAGE_TAG} .
- docker push registry.example.com/myapp:${IMAGE_TAG}
deploy-green:
stage: deploy-green
environment:
name: green
url: https://green.example.com
script:
- kubectl apply -f k8s/green-deployment.yaml
- kubectl set image deployment/myapp-green myapp=registry.example.com/myapp:${IMAGE_TAG}
- kubectl rollout status deployment/myapp-green --timeout=120s
health-check:
stage: health-check
script:
- curl -f https://green.example.com/healthz
switch:
stage: switch
when: manual
environment:
name: production
url: https://app.example.com
script:
- kubectl patch service myapp -p '{"spec":{"selector":{"version":"green"}}}'
Jenkins vs GitLab CI 对比: Jenkins适合复杂、高度定制化的流水线,插件生态丰富;GitLab CI更适合与代码仓库深度绑定的团队,配置简洁,原生支持Kubernetes和容器化执行。在蓝绿发布场景中,两者都能实现,但GitLab CI的Environment功能对切换和回滚有更好的原生支持。
2.4 流水线触发机制
流水线触发机制决定了何时以及如何启动自动化流程。在蓝绿发布中,合理的触发策略可以避免不必要的部署,同时确保关键变更及时上线。
2.4.1 常见触发方式
| 触发方式 | 描述 | 蓝绿发布适用场景 |
|---|---|---|
| 代码推送(Push) | 当代码被推送到特定分支时触发 | 开发分支推送触发CI,仅构建和单元测试;主分支推送触发完整CD流程 |
| 合并请求(MR/PR) | 当创建或更新合并请求时触发 | 在合并前执行集成测试和安全扫描,确保绿色版本质量 |
| 定时触发(Cron) | 按预设时间表触发 | 定期执行蓝绿环境健康巡检、证书更新、安全策略合规检查 |
| Webhook | 外部系统通过HTTP请求触发 | 镜像扫描完成、安全漏洞修复、配置管理变更后触发部署 |
| 手动触发 | 人工在UI或通过API启动 | 生产环境蓝绿切换、紧急回滚、运维窗口内的变更 |
2.4.2 触发策略最佳实践
- 分支策略对齐: 主分支(main/master)推送触发完整CD流水线(部署到绿色环境+健康检查);功能分支推送仅触发CI(构建+单元测试)。
- 标签触发: 当打上版本标签(如
v1.2.3)时,触发生产环境部署流水线,确保版本可追溯。 - 条件触发: 使用
only/except(GitLab CI)或when(Jenkins)控制特定阶段仅在满足条件时执行。例如,健康检查失败时自动触发回滚流水线。 - 手动闸门: 蓝绿切换阶段必须设置为手动触发,避免自动化切换导致意外。同时保留超时自动回滚机制。
安全触发建议: 对于涉及网络配置变更的流水线(如修改防火墙规则、更新负载均衡策略),建议使用Webhook结合工单系统触发,确保变更经过审批。同时,所有触发事件应记录审计日志,便于事后追溯。
2.5 流水线触发与执行流程(SVG架构图)
2.6 触发机制对比与选型建议
| 维度 | Jenkins | GitLab CI |
|---|---|---|
| 触发配置位置 | Jenkinsfile 或 Web UI 配置 | .gitlab-ci.yml 中的 rules / only / except |
| 多分支支持 | Multibranch Pipeline 插件 | 原生支持,自动检测分支 |
| 手动触发 | input 步骤或 Build Trigger |
when: manual + allow_failure: false |
| Webhook 灵活性 | Generic Webhook Trigger 插件 | 原生支持,可自定义变量传递 |
| 蓝绿发布推荐 | 适合复杂审批流、多环境联动 | 适合容器化、Kubernetes原生场景 |
选型建议: 如果团队已深度使用GitLab,优先选择GitLab CI,其Environment功能对蓝绿环境管理和回滚有原生支持。如果已有Jenkins基础设施或需要高度自定义的流水线逻辑(如动态并行、复杂条件判断),Jenkins是更成熟的选择。无论选择哪种,务必在流水线中集成网络配置验证和安全策略检查,确保蓝绿切换过程的安全可控。