如何配置AWS::CodePipeline::Pipeline实现多分支推送自动触发流水线
需求实现结论
该需求可实现,无需新增CodePipeline资源,仅需要调整现有CloudFormation模板的两类配置即可。
调整步骤
1. 调整流水线Source阶段配置
原生CodeCommit类型的源动作单实例仅支持指定单个分支,所以需要在Source阶段新增一个针对develop分支的源动作,两个分支的源动作并行配置,任意分支推送更新都会触发流水线启动:
CodePipeline: Type: 'AWS::CodePipeline::Pipeline' Properties: Name: !Sub '${Constructor}-${ApplicationID}-codepipeline' ArtifactStore: Location: !Ref CodePipelineS3BucketName Type: S3 RestartExecutionOnUpdate: true RoleArn: !Sub 'arn:aws:iam::${AWS::AccountId}:role/${CodePipelineRoleName}' Stages: - Name: Source Actions: # 原有master分支源配置,调整输出构件名做区分 - Name: Source-Master ActionTypeId: Category: Source Owner: AWS Provider: CodeCommit Version: 1 RunOrder: 1 OutputArtifacts: - Name: SourceArtifact-Master Configuration: BranchName: master PollForSourceChanges: false RepositoryName: !GetAtt - CodeCommitRepo - Name # 新增develop分支源配置 - Name: Source-Develop ActionTypeId: Category: Source Owner: AWS Provider: CodeCommit Version: 1 RunOrder: 1 OutputArtifacts: - Name: SourceArtifact-Develop Configuration: BranchName: develop PollForSourceChanges: false RepositoryName: !GetAtt - CodeCommitRepo - Name # 后续部署阶段如果两个分支构建逻辑完全一致,可任选一个源构件作为输入即可 - Name: Deploy-Dev Actions: - Name: Deploy-Dev ActionTypeId: Category: Build Owner: AWS Provider: CodeBuild Version: 1 RunOrder: 2 InputArtifacts: # 此处任选一个源构件即可,触发时对应分支的构件会自动注入 - Name: SourceArtifact-Master OutputArtifacts: - Name: DeployArtifactDev Configuration: ProjectName: !Ref CodeDeployDev - Name: Deploy-Int Actions: - Name: IntPromotionApproval ActionTypeId: Category: Approval Owner: AWS Provider: Manual Version: 1 RunOrder: 3 - Name: Deploy-Int ActionTypeId: Category: Build Owner: AWS Provider: CodeBuild Version: 1 RunOrder: 31 InputArtifacts: - Name: SourceArtifact-Master OutputArtifacts: - Name: DeployArtifactInt Configuration: ProjectName: !Ref CodeDeployInt
2. 调整EventBridge触发规则
你当前配置中PollForSourceChanges设为false,使用EventBridge事件触发流水线,默认规则仅匹配单个分支的推送事件,需要新增或调整规则的事件匹配逻辑,同时覆盖master和develop分支:
# 新增EventBridge规则资源,替换原有单分支触发规则 CodePipelineMultiBranchTrigger: Type: AWS::Events::Rule Properties: Description: Trigger CodePipeline on master/develop branch push EventPattern: source: - aws.codecommit detail-type: - CodeCommit Repository State Change resources: - !GetAtt CodeCommitRepo.Arn detail: event: - referenceCreated - referenceUpdated referenceType: - branch referenceName: - master - develop Targets: - Arn: !Sub arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:${CodePipeline} RoleArn: !Sub 'arn:aws:iam::${AWS::AccountId}:role/${CodePipelineTriggerRoleName}' Id: codepipeline-trigger-target
可选优化
如果需要针对两个分支走不同的部署逻辑,可以在CodeBuild项目中通过内置环境变量CODEBUILD_SOURCE_VERSION获取触发分支名,做分支判断逻辑即可。
内容的提问来源于stack exchange,提问作者valerio auricchio
相关产品推荐
相关产品推荐

