首页 > 解决方案 > 基于上游动作变量的条件代码管道?

问题描述

我知道我可以基于 Condition 有条件地执行 aws codepipeline 操作,但我想将操作执行基于动态设置的变量。

这可能吗?

这是我的用例:我正在使用具有多个工作区的 monorepo。每个微服务一个。我有一个 lambda 函数,它可以确定在每次代码推送中修改了哪些服务源代码。它使用此信息设置一个变量。基于这个变量,我想有条件地调用微服务代码构建项目。

标签: aws-codepipelineaws-serverless

解决方案


我知道我可以基于 Condition 有条件地执行 aws codepipeline 操作

我会在这里做出区分,您可以使用 cloudformation 修改管道定义,并重新部署管道。

代码管道偏向于基于主干的单个 repo 开发,所以你试图反对它,让你的生活变得困难。

据我所知,如果你必须这样做:

  1. 将条件逻辑移动到每个代码构建项目中,它们会运行,但会根据条件逻辑执行或不执行某些操作。

  2. 管道可以自我更新。

注意RestartExecutionOnUpdate设置了一个条件。

  Pipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      RestartExecutionOnUpdate: !If [ RestartPipelineOnUpdate, true, false ]
      RoleArn: !ImportValue CodePipelineRoleArn
      Name: !Ref CodePipelineName

然后管道可以有一个动作,用它自己的定义部署堆栈 - 非常元。

        - !If
          - ShouldUpatePipelineStackOnChange
          - Name: UpdatePipeline
            Actions:
              - Name: CreateChangeSet
                ActionTypeId:
                  Category: Deploy
                  Owner: AWS
                  Provider: CloudFormation
                  Version: "1"
                Configuration:
                  ActionMode: CREATE_UPDATE 
                  StackName: !Ref AWS::StackName
                  TemplatePath: !Sub ${PipelineCodeArtifactName}::${ThisTemplateName}
                  Capabilities: CAPABILITY_NAMED_IAM
                  RoleArn: !GetAtt PipelineStackCloudFormationExecutionRole.Arn
                InputArtifacts:
                  - Name: !Sub ${PipelineCodeArtifactName}
                RunOrder: 1
          - !Ref AWS::NoValue

如果你有类似的东西:

  • Cloudformation 参数在控制代码构建项目是否运行的参数存储中设置为动态值。
  • 管道调用设置这些参数值的 Lambda。
  • Lambda 在“UpdatePipeline”操作之前运行。

“UpdatePipeline”将重新部署堆栈。如果检测到更改,管道定义将得到更新,管道将重新启动。

理论上,上述方法可以工作。


推荐阅读