3. 流水线集成基础:CI/CD流水线概念、Jenkins/GitLab CI核心组件、流水线阶段划分

3.1 CI/CD流水线核心概念

持续集成与持续交付(CI/CD)是现代软件交付的基石。流水线(Pipeline)将代码从提交到部署的整个过程自动化、标准化,确保每次变更都能快速、可靠地到达目标环境。

核心定义:CI/CD流水线是一系列自动化阶段的集合,代码变更依次通过每个阶段,经过验证、构建、测试与部署,最终交付给用户。
概念 目标 关键活动 产出物
持续集成(CI) 频繁合并代码,尽早发现集成问题 代码合并、静态分析、单元测试、编译构建 可部署的构建产物(Artifact)
持续交付(CD) 确保构建产物随时可部署到生产环境 自动化测试、环境部署、验收测试 经过验证的发布候选版本
持续部署(CD) 将通过验证的版本自动部署到生产 蓝绿部署、金丝雀发布、滚动更新 生产环境中的运行服务
实践要点:在蓝绿发布场景中,CI阶段负责构建两个完全相同的环境镜像,CD阶段则控制流量在蓝绿环境间的切换与回滚。

3.2 流水线阶段划分与流程

一个标准的生产级流水线通常划分为以下阶段,每个阶段都有明确的入口条件与出口标准:

  1. 代码检出(Checkout):从Git仓库拉取指定分支的源代码。
  2. 静态分析(Static Analysis):执行代码规范检查、安全漏洞扫描(SAST)。
  3. 单元测试(Unit Test):运行开发者编写的单元测试用例,确保函数级正确性。
  4. 构建与打包(Build & Package):编译代码,生成Docker镜像或JAR/WAR包。
  5. 镜像推送(Image Push):将构建产物推送至制品仓库(如Harbor、Nexus)。
  6. 集成测试(Integration Test):在预发布环境部署,执行API测试、契约测试。
  7. 部署准备(Deploy Prep):准备蓝绿环境、更新配置、执行数据库迁移。
  8. 生产部署(Production Deploy):执行蓝绿切换或滚动更新。
  9. 健康检查与回滚(Health Check & Rollback):验证服务健康,失败时自动触发回滚。
CI/CD流水线阶段划分(蓝绿发布场景) CI 阶段 代码检出 静态分析 单元测试 构建 & 打包 CD 阶段 镜像推送 集成测试 部署准备 部署阶段 蓝绿切换 健康检查 回滚(失败时) 完成 每个阶段失败时,流水线立即停止并发送告警,确保问题不流入下一阶段

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命名空间或集群,避免相互影响。
  • 幂等性部署:确保同一版本多次部署结果一致,避免因环境状态差异导致部署失败。
  • 回滚自动化:在流水线中预定义回滚步骤,当健康检查失败时自动执行,减少人工介入时间。
  • 审计日志:记录每次部署的版本、时间、操作人、审批记录,满足合规要求。
Jenkins与GitLab CI核心组件对比 Jenkins Master / Agent 架构 Jenkinsfile (Groovy) 1800+ 插件生态 共同目标 自动化构建 → 测试 → 部署 GitLab CI Runner 执行器 .gitlab-ci.yml (YAML) 原生Git集成
本章小结:CI/CD流水线是蓝绿发布策略的执行载体。Jenkins与GitLab CI作为两大主流工具,分别以插件生态和原生集成为核心优势。理解流水线阶段划分、核心组件及最佳实践,是后续实现蓝绿环境切换与网络回滚的基础。