CI/CD流水线设计:测试与生产环境用单流水线还是分离流水线?
CI/CD流水线选型疑问:分离流水线vs单流水线
当前基础情况
本人从事基础设施工作,首次负责设计搭建CI/CD流水线,个人仅用过Git、专业经验有限。当前基于AWS CodePipeline搭建的基础流程为:
GitLab Private(分支合并)→CodeBuild→Approval→CodeDeploy
核心选型疑问
纠结应为测试与生产环境创建分离流水线,还是采用单流水线覆盖双环境,目前有两种候选模式:
模式1:测试与生产分离流水线
- GitLab Private(合并至develop分支)→CodeBuild→Approval→CodeDeploy(测试环境)
- GitLab Private(合并至main分支)→CodeBuild→Approval→CodeDeploy(生产环境)
目前已通过CloudFormation临时实现该模式,调整成本较低
模式2:单流水线覆盖双环境
- GitLab Private(合并至develop分支)→CodeBuild→Approval→CodeDeploy(测试环境)→Approval→CodeDeploy(生产环境)
应用团队额外需求
- 为测试与生产环境维护独立的配置文件(与构建产物分离)
- 尽可能复用测试环境的构建产物部署至生产
个人当前思路
- 配置文件可存储在不同路径,通过
${DEPLOYMENT_GROUP_NAME}这类变量按环境管控 - 模式1下,因使用相同源代码,构建产物理论上应一致,但无法保证CodeBuild容器行为100%相同
额外背景
- 分支设计采用GitLab Flow,因团队仅1-2人、每年仅几次SI工作(使用频次低),仅保留feature、develop、main分支
- 此为试点项目,团队多数成员(含本人)Git专业经验有限
行业最佳实践与选型建议
优先推荐模式1(分离流水线)
- 契合当前GitLab Flow分支策略:develop分支对应测试环境流水线、main分支对应生产环境流水线,分支与环境一一对应,对Git经验有限的团队更直观,能大幅降低误操作风险
- 环境隔离性更强:测试与生产流水线的配置、资源完全独立,避免测试流程的变动影响生产环境,排查问题时也更聚焦
- 适配现有基础:已经通过CloudFormation实现,后续只需优化细节,无需大改
针对需求的优化方案
- 独立配置文件管理:按环境划分配置存储路径(例如
s3://config-bucket/test/和s3://config-bucket/prod/),在CodeDeploy阶段通过${DEPLOYMENT_GROUP_NAME}变量拉取对应环境的配置,确保配置与构建产物完全分离 - 复用构建产物:在develop分支的CodeBuild完成后,将构建产物上传到S3的共享存储区(例如
s3://build-artifacts/${COMMIT_ID}/);当main分支需要部署时,直接拉取该共享产物而非重新构建。可在CodeBuild的buildspec.yml中添加上传逻辑,同时在main分支的流水线中跳过CodeBuild阶段,直接拉取指定构建产物,既保证产物一致性,又满足复用需求
- 独立配置文件管理:按环境划分配置存储路径(例如
模式2的适用场景(当前不推荐)
- 模式2更适合高频迭代、需要严格绑定“测试通过才能进生产”逻辑的场景,但对Git经验有限的团队来说,流程过长易引发误操作(比如误触生产部署),且流水线配置更复杂,排查问题时需追溯全流程,维护成本更高
内容的提问来源于stack exchange,提问作者7ch
相关产品推荐
相关产品推荐

