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架构图)

流水线触发与执行流程(蓝绿发布场景) 触发源 代码推送 (Push) 合并请求 (MR/PR) 定时 / Webhook 流水线引擎 Jenkins GitLab CI 解析 Pipeline as Code 分配 Agent / Runner 执行阶段 CI:构建 + 测试 CD:部署绿色环境 健康检查 + 切换 触发机制关键点 代码推送触发CI → 手动确认触发CD部署 → 健康检查通过后手动切换流量 → 失败自动回滚 步骤1:触发 代码变更 / 定时 / 手动 步骤2:CI 构建镜像 + 单元测试 步骤3:CD部署 部署到绿色环境 步骤4:切换 手动确认 回滚路径:健康检查失败 → 自动回滚到蓝色环境

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是更成熟的选择。无论选择哪种,务必在流水线中集成网络配置验证和安全策略检查,确保蓝绿切换过程的安全可控。