多阶段构建在ci/cd中高效执行的核心是阶段职责清晰、环境隔离可靠、产物传递可控、资源调度合理:build阶段用sdk镜像编译,test阶段用轻量镜像运行测试,scan阶段用专用工具镜像扫描,deploy阶段用带工具链镜像部署,并通过artifacts/needs显式管理依赖、resource_group或lock保障串行、docker分层与缓存优化镜像构建。

多阶段构建在 CI/CD 流水线中高效执行,核心在于**阶段职责清晰、环境隔离可靠、产物传递可控、资源调度合理**。不是简单把任务拆成几步,而是让每一步都跑在最适合的环境里,彼此不干扰,又能顺畅衔接。
按职责拆分阶段,避免混用环境
每个阶段应只做一件事,并使用专用环境:
-
Build 阶段:用含 SDK 的镜像(如
golang:1.21或node:20),专注编译、打包、生成二进制或静态资源 -
Test 阶段:切换到轻量运行时(如
alpine或python:3.11-slim),加载构建产物后执行单元测试、集成测试 -
Scan 阶段:独立镜像(如
anchore/cli或sonarsource/sonar-scanner-cli),专用于安全扫描或代码质量分析 -
Deploy 阶段:使用带部署工具链的镜像(如含
kubectl、helm、aws-cli),且与生产网络或权限模型对齐
用 artifacts + needs 显式管理阶段依赖
GitLab CI 和 Jenkins Pipeline 都支持显式声明阶段输入输出,避免“猜路径”或误删:
- Build 阶段必须明确定义
artifacts,例如:artifacts: paths: [dist/, bin/app] - 后续阶段通过
needs指定上游依赖,例如:needs: [build],确保 test 不会早于 build 执行 - Jenkins 中若跨 agent 执行,需配合
stash和unstash,或挂载共享存储(如 NFS、S3)传递产物
控制并行与互斥,防止资源冲突
不是所有阶段都适合并行,也不是所有任务都能并发跑:
- 对数据库迁移、配置中心变更等独占型操作,用
resource_group(GitLab)或lock步骤(Jenkins)强制串行 - 允许并行的阶段(如多个模块的单元测试),可设
parallel: 3或matrix策略分散负载 - Kubernetes 动态 Agent 要注意空闲超时,默认 5 分钟,人工审批类 stage 需显式设
idleMinutes: 30
用 Docker 多阶段构建压缩镜像、复用缓存
流水线中的构建阶段本身也可分层优化:
- Dockerfile 内部分为
builder和runtime阶段,最终镜像只含运行所需文件,体积更小、启动更快 - 把
COPY go.mod go.sum和go mod download单独成层,依赖不变时该层永久命中缓存 - 配合
--mount=cache挂载构建缓存目录(如/root/.cache/go-build),进一步缩短频繁构建耗时











