AWS CodePipeline单分支提交触发全阶段部署的条件管控咨询
问题背景
现有单微服务CICD架构设计如下:
- 每个微服务配套3套基于AWS LightSail实例搭建的部署环境,分别为dev、p4d、prod
- 部署环境与微服务Git仓库分支一一映射:dev分支对接dev环境、p4d分支对接p4d环境、master分支对接prod环境
- 每个微服务独立搭建AWS CodePipeline,统一管理该服务全环境CICD部署流程
- 流水线初始设计3个串行部署阶段:
- Dev阶段:映射Git dev分支,预期仅dev分支发生变更时触发dev环境部署
- P4D阶段:映射Git p4d分支,预期仅p4d分支发生变更时触发p4d环境部署
- Prod阶段:映射Git master分支,预期仅master分支发生变更时触发prod环境部署
现存问题
当前只要向Git dev分支推送代码变更,CodePipeline就会被触发,自动拉取各分支对应代码完成三个环境的全量部署,完全不符合设计预期。需要实现分支维度的条件部署管控:对应分支变更时仅触发关联环境的部署,例如dev分支变更时仅部署dev环境,不触发P4D、Prod环境部署,最终用单条流水线覆盖单个微服务三个环境的CICD管理。
解决方案
问题核心原因是流水线未配置分支触发过滤,且各部署阶段没有加分支匹配的执行条件,任意分支推送都会触发整条流水线全阶段执行,按以下步骤调整即可实现预期效果:
- 调整源阶段配置
移除三个部署阶段各自独立配置的Git源拉取动作,将源阶段改为单源配置:仅保留1个Git仓库拉取动作,触发规则设置为仅监听dev、p4d、master三个分支的推送事件,过滤其他无关分支的触发请求。 - 为每个部署阶段配置分支匹配条件
利用CodePipeline原生的阶段条件判断功能,基于源阶段输出的分支名变量#{SourceVariables.BranchName}配置各阶段执行规则:- Dev阶段:设置执行条件为
#{SourceVariables.BranchName} == 'dev',仅当条件成立时才执行dev环境部署动作,否则直接标记该阶段跳过 - P4D阶段:设置执行条件为
#{SourceVariables.BranchName} == 'p4d',仅当条件成立时才执行p4d环境部署动作,否则直接标记该阶段跳过 - Prod阶段:设置执行条件为
#{SourceVariables.BranchName} == 'master',仅当条件成立时才执行prod环境部署动作,否则直接标记该阶段跳过
- Dev阶段:设置执行条件为
- 关闭不必要的自动拉取配置
检查所有源动作的配置,关闭定时拉取代码的选项,避免无代码推送时自动触发流水线。
注意:不要在单条流水线中为不同环境分别配置独立的Git源动作,该模式下任意一个源动作检测到版本变化都会触发整条流水线全量执行,是导致当前跨环境误部署的主要诱因。
内容的提问来源于stack exchange,提问作者user2797835
相关产品推荐
相关产品推荐

