3. CI/CD 流水线基础:Jenkins/GitLab CI 核心组件与流水线语法

在微服务架构中,CI/CD 流水线是代码从提交到部署的“高速公路”。本章聚焦 Jenkins 与 GitLab CI 两大主流工具,剖析其核心组件与声明式流水线语法,为后续并发瓶颈分析与调优奠定基础。

3.1 核心组件对比

Jenkins 与 GitLab CI 在架构设计上存在本质差异,理解这些差异有助于在微服务场景下做出正确选型。

维度 Jenkins GitLab CI
架构模式 Master + Agent(分布式) Runner(无中心化协调器)
配置存储 Web UI / Jenkinsfile(SCM) .gitlab-ci.yml(SCM 强制)
流水线定义 Declarative / Scripted Pipeline YAML 声明式(Stages / Jobs)
并发执行单元 Executor(Agent 上的线程) Runner 并发数(concurrent)
插件生态 丰富(2000+ 插件) 内置集成(Docker/K8s/SonarQube)
微服务适配 多分支 Pipeline + 共享库 多项目 Pipeline + 触发链
选型建议: 若团队已深度使用 GitLab,优先选择 GitLab CI 以减少运维复杂度;若需要高度自定义或对接遗留系统,Jenkins 的插件生态更具优势。

3.2 Jenkins 核心组件与流水线语法

3.2.1 核心组件

  • Master: 调度中心,负责管理 Job、分配任务给 Agent、存储配置与构建历史。
  • Agent(Node): 实际执行构建任务的节点,可以是物理机、虚拟机或容器。
  • Executor: Agent 上的并发执行槽位,每个 Executor 同时只能运行一个任务。
  • Pipeline: 由 Stage(阶段)和 Step(步骤)组成的自动化流程定义。
  • 共享库(Shared Library): 封装通用逻辑(如构建、部署、测试),供多个 Pipeline 复用。

3.2.2 声明式 Pipeline 语法

声明式 Pipeline 是 Jenkins 2.x 推荐的流水线定义方式,结构清晰,适合微服务多阶段构建。

pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        stage('Build') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        stage('Test') {
            parallel {
                stage('Unit Test') {
                    steps {
                        sh 'mvn test'
                    }
                }
                stage('Integration Test') {
                    steps {
                        sh 'mvn verify -Pintegration'
                    }
                }
            }
        }
        stage('Deploy') {
            when {
                branch 'main'
            }
            steps {
                sh 'kubectl apply -f k8s/deployment.yaml'
            }
        }
    }
    post {
        failure {
            emailext(
                subject: "Pipeline Failed: ${env.JOB_NAME}",
                body: "Build ${env.BUILD_NUMBER} failed.",
                to: "team@example.com"
            )
        }
    }
}
关键语法点:
  • agent:指定执行节点,支持 any、label、docker。
  • stages:顺序执行阶段,parallel 实现阶段内并行。
  • when:条件执行,常用于分支过滤。
  • post:构建后处理,支持 always、success、failure。

3.3 GitLab CI 核心组件与流水线语法

3.3.1 核心组件

  • GitLab Runner: 执行 CI 任务的代理,支持 Docker、Kubernetes、Shell 等执行器。
  • Pipeline: 由一次提交触发的完整 CI/CD 流程,包含多个 Stage。
  • Job: 最小的执行单元,属于某个 Stage,可定义脚本、镜像、缓存等。
  • Stage: 逻辑分组,同一 Stage 的 Job 默认并行执行。
  • Artifact: 构建产物,可在 Job 之间传递或供下载。

3.3.2 .gitlab-ci.yml 语法

GitLab CI 使用 YAML 定义流水线,天然支持并行、缓存与依赖管理。

stages:
  - build
  - test
  - deploy

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .m2/repository/

build-job:
  stage: build
  image: maven:3.8.6-openjdk-11
  script:
    - mvn clean package -DskipTests
  artifacts:
    paths:
      - target/*.jar

unit-test-job:
  stage: test
  image: maven:3.8.6-openjdk-11
  script:
    - mvn test
  needs: ["build-job"]

integration-test-job:
  stage: test
  image: maven:3.8.6-openjdk-11
  script:
    - mvn verify -Pintegration
  needs: ["build-job"]

deploy-job:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl apply -f k8s/deployment.yaml
  only:
    - main
注意: GitLab CI 中 needs 关键字用于控制 Job 间的依赖顺序,避免不必要的等待。在微服务多模块构建中,合理使用 needs 可显著缩短流水线总耗时。

3.4 流水线执行流程对比

下图展示了 Jenkins 与 GitLab CI 在微服务构建场景下的典型执行流程差异。

Jenkins vs GitLab CI 流水线执行流程对比 Jenkins vs GitLab CI 流水线执行流程对比 Jenkins 流水线 Stage 1: Checkout (SCM) Stage 2: Build (Maven) 并行: Unit Test 并行: Integration Test Stage 4: Deploy (仅 main 分支) Post: 失败邮件通知 GitLab CI 流水线 Stage: build (build-job) Stage: test (unit-test) Stage: test (integration-test) Stage: deploy (仅 main 分支) Artifact 传递 + 缓存复用 流程差异说明 • Jenkins 使用 parallel 块在阶段内实现并行,需 Agent 提供多个 Executor。 • GitLab CI 通过 Stage 内多个 Job 天然并行,使用 needs 控制依赖。 • 两者均支持条件部署(仅 main 分支),但 GitLab CI 的 only/except 语法更简洁。

3.5 微服务场景下的流水线设计要点

在微服务架构中,CI/CD 流水线需要额外关注以下方面:

  • 多仓库管理: 每个微服务独立仓库,使用多分支 Pipeline 或触发链串联。
  • 构建缓存: 利用 Maven/Gradle 缓存、Docker 层缓存减少重复下载。
  • 并行构建: 无依赖的微服务可并行构建,依赖服务需等待上游产物。
  • 环境隔离: 每个 Job 使用独立容器或 Agent,避免依赖冲突。
  • 产物管理: 使用 Artifact 或容器镜像仓库传递构建产物。