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 在微服务构建场景下的典型执行流程差异。
3.5 微服务场景下的流水线设计要点
在微服务架构中,CI/CD 流水线需要额外关注以下方面:
- 多仓库管理: 每个微服务独立仓库,使用多分支 Pipeline 或触发链串联。
- 构建缓存: 利用 Maven/Gradle 缓存、Docker 层缓存减少重复下载。
- 并行构建: 无依赖的微服务可并行构建,依赖服务需等待上游产物。
- 环境隔离: 每个 Job 使用独立容器或 Agent,避免依赖冲突。
- 产物管理: 使用 Artifact 或容器镜像仓库传递构建产物。