CI/CD 基础回顾:流水线核心阶段与工具选型

CI/CD(持续集成/持续交付)是现代 DevOps 实践的基石。在将 Terraform 基础设施即代码纳入发布流程之前,必须清晰理解 CI/CD 流水线的核心阶段以及主流工具的选型逻辑。本章将拆解流水线的四个关键阶段,并通过对比表格与架构图,帮助你在后续章节中精准定位 Terraform 的集成点。

3.1 流水线核心四阶段

一条标准的 CI/CD 流水线通常包含以下四个阶段,它们构成了从代码变更到生产交付的完整链路:

阶段 核心目标 典型产出物 常见失败原因
代码提交 (Commit) 触发流水线,确保代码进入版本控制 Git 提交记录、分支、标签 提交信息不规范、未通过 pre-commit 钩子
构建 (Build) 将源代码编译为可交付的制品 二进制文件、Docker 镜像、JAR 包 依赖缺失、编译错误、环境不一致
测试 (Test) 验证代码质量与功能正确性 测试报告、覆盖率数据、静态分析结果 测试环境不稳定、测试数据污染、超时
部署 (Deploy) 将制品发布到目标环境 部署版本号、环境状态快照、回滚点 配置错误、权限不足、基础设施状态漂移
关键认知: 在 Terraform 集成场景中,构建阶段通常对应 Terraform 配置的语法校验与格式化检查;测试阶段对应 plan 命令的预演与合规策略扫描;部署阶段则对应 apply 命令的执行与状态锁定。

3.2 流水线阶段流程关系

下图展示了四个阶段在 CI/CD 流水线中的串联关系,以及每个阶段可能产生的反馈回路:

CI/CD 流水线核心阶段流程 代码提交 Git Push / PR 构建 编译 / 打包 测试 单元 / 集成 / 安全 部署 Staging / Production 测试失败 → 回构建修复 部署失败 → 回代码提交修复 提示:每个阶段都应具备快速反馈能力,失败时立即阻断下游阶段,避免缺陷扩散。

3.3 主流 CI/CD 工具选型对比

GitLab CI、GitHub Actions 和 Jenkins 是目前市场占有率最高的三款 CI/CD 工具。它们在架构、配置方式和生态集成上存在显著差异,选型时需要结合团队规模、平台偏好和运维成本综合考量。

对比维度 GitLab CI GitHub Actions Jenkins
配置方式 .gitlab-ci.yml 仓库内声明 .github/workflows/*.yml 仓库内声明 Jenkinsfile 或 Web UI 配置
运行架构 GitLab Runner(可自托管) GitHub 托管 Runner / 自托管 Runner Master-Agent 分布式架构
插件/市场生态 内置功能丰富,插件较少 Marketplace 生态活跃,Action 复用度高 插件数量庞大(1000+),但质量参差
与 Terraform 集成 原生支持 Terraform 模板与状态管理 通过 HashiCorp 官方 Action 或社区 Action 通过 Terraform 插件或 Pipeline 步骤
适用场景 GitLab 全栈用户,单体或微服务 GitHub 重度用户,开源项目 大型企业,复杂流水线,高度定制
运维复杂度 低(SaaS 版本几乎免运维) 低(SaaS 版本几乎免运维) 高(需维护 Master 和 Agent 集群)
选型建议: 如果你的代码仓库已经托管在 GitLab 或 GitHub,优先选择其内置的 CI/CD 工具,可以降低集成成本。Jenkins 更适合需要深度定制流水线逻辑、或已有 Jenkins 基础设施积累的团队。

3.4 工具选型架构对比

下图从架构层面对比三种工具的 Runner/Agent 与代码仓库、制品仓库之间的交互关系:

CI/CD 工具选型架构对比 GitLab CI GitLab 仓库 GitLab Runner 制品仓库 (内置) GitHub Actions GitHub 仓库 GitHub 托管 Runner Actions Marketplace Jenkins Jenkins Master Jenkins Agent 插件系统 (1000+) 说明:GitLab CI 和 GitHub Actions 采用仓库内声明式配置,Jenkins 需要额外维护 Master-Agent 集群。

3.5 流水线配置示例对比

以下分别展示三种工具中实现“代码提交 → 构建 → 测试 → 部署”的最小化流水线配置片段:

GitLab CI (.gitlab-ci.yml)

stages:
  - build
  - test
  - deploy

build-job:
  stage: build
  script:
    - echo "Building application..."
    - make build

test-job:
  stage: test
  script:
    - echo "Running tests..."
    - make test

deploy-job:
  stage: deploy
  script:
    - echo "Deploying to production..."
    - make deploy
  only:
    - main

GitHub Actions (.github/workflows/ci.yml)

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: make build

  test:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: make test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - run: make deploy

Jenkins (Jenkinsfile)

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'make build'
            }
        }
        stage('Test') {
            steps {
                sh 'make test'
            }
        }
        stage('Deploy') {
            when {
                branch 'main'
            }
            steps {
                sh 'make deploy'
            }
        }
    }
}
注意: 以上示例仅为演示流水线结构,未包含 Terraform 相关步骤。在后续章节中,我们将逐步在 build 阶段加入 terraform fmt 和 terraform validate,在 test 阶段加入 terraform plan,在 deploy 阶段加入 terraform apply。

3.6 选型决策要点

  • 团队规模与技能: 小型团队优先选择 SaaS 化工具(GitLab CI / GitHub Actions),减少运维负担;大型团队可选择 Jenkins 以获得更高的定制自由度。
  • 平台绑定风险: 如果未来可能迁移代码仓库,Jenkins 的仓库无关性更具优势;如果长期锁定单一平台,原生 CI/CD 集成度更高。
  • Terraform 集成深度: GitLab CI 提供原生 Terraform 模板和状态管理集成;GitHub Actions 通过 HashiCorp 官方 Action 实现;Jenkins 需要额外安装 Terraform 插件或通过 Pipeline 步骤调用 CLI。
  • 成本考量: GitLab CI 和 GitHub Actions 的免费额度对中小项目足够;Jenkins 完全免费但需要自建服务器资源。