【问题标题】:CDK pipeline for multiple branches at the same time同时用于多个分支的 CDK 管道
【发布时间】:2021-10-25 04:04:06
【问题描述】:

我希望始终为开发和主分支部署 CI-CD 管道。开发人员在需要时手动创建功能分支的管道。

我正在使用来自https://github.com/awslabs/aws-simple-cicd的管道

在 project-config.json 中,我们有:

"Backend": [
  {
    "pipelineName": "backend",
    "ccRepoName": "backend",
    "branch": "master",
    "type": "BitBucket",
    "cron": ""
  }
],

步骤 1. 为分支 master 部署管道

步骤 2. 编辑 project-config.json 并更改分支名称:

 "Backend": [
      {
        "pipelineName": "backend",
        "ccRepoName": "backend",
        "branch": "develop",
        "type": "BitBucket",
        "cron": ""
      }
    ],

步骤 3. 为开发分支部署管道

在这个阶段,它会删除 master 分支的管道并部署到 develop 分支。我们如何才能同时保持多个分支的管道?

【问题讨论】:

    标签: aws-cdk aws-codepipeline


    【解决方案1】:

    您可以根据要构建的分支定义多个管道堆栈

    我已使用以下方法(使用 Python)成功完成此操作

    # app.py
    from aws_cdk import core
    from my_project.pipeline_stack import PipelineStack
    
    app = core.App()
    
    PipelineStack(app, "project-master-branch",
        branch="main"
    )
    
    PipelineStack(app, "project-develop-branch",
        branch="develop"
    )
    

    PipelineStack 看起来像

    # my_project/pipeline_stack.py
    
    from aws_cdk import (
        core,
        pipelines,
        aws_codepipeline as codepipeline,
        aws_codepipeline_actions as cpactions
    )
    
    class PipelineStack(core.Stack):
        def __init__(self, scope: core.Construct, id: str, branch: str, **kwargs) -> None:
            super().__init__(scope, id, **kwargs)
    
            source_artifact = codepipeline.Artifact()
            cloud_assembly_artifact = codepipeline.Artifact()
    
            pipeline = pipelines.CdkPipeline(
                self,
                "Pipeline",
                cloud_assembly_artifact=cloud_assembly_artifact,
                pipeline_name=f"my-pipeline-{branch}",
                source_action=cpactions.BitBucketSourceAction(
                    ... # your Bitbucket details
                    branch=branch  # taking the main or develop branch
                ),
                synth_action=pipelines.SimpleSynthAction(
                    source_artifact=source_artifact,
                    cloud_assembly_artifact=cloud_assembly_artifact,
                    install_command="npm i -g aws-cdk",
                    synth_command="cdk synth",
                    ... # other options you can provide
                )
            )
    

    这将创建两个代码管道,它们响应和部署以响应对 maindevelop 的更改

    【讨论】:

      【解决方案2】:

      maafk 提供的答案是一个很好的答案。但是,在我们的案例中,出于合规性原因,我们不能为从同一个 AWS 账户预置的各种环境提供不同的管道。因此,在我们的环境中,我们有一个开发 AWS 账户、一个暂存账户和一个生产账户。开发、暂存和生产环境的每个管道都需要从其自己的 AWS 账户进行预置。此外,我们的生产帐户需要与没有连接的其他帐户完全隔离,与开发帐户和暂存帐户完全隔离。最重要的是,我们的开发人员需要为不同的开发分支创建管道。我们没有简单的方法来管理这一切,除非最终跨多个 aws 帐户创建各种类型的管道,我们只需要一个用于生产,一个用于暂存。我们提出了以下解决方案,该解决方案通常允许部署任意数量的管道,而无需在 cdk 源代码中签入任何与分支相关的绑定。

      我们正在创建一个 CodePipeline,如下所示:

      const branch = this.node.tryGetContext("branch");
      
      new CodePipeline(this, createResourceName(this.node, "CodePipeline"), {
        pipelineName: createResourceName(this.node, "CodePipeline"),
        synth: new CodeBuildStep("Synth", {
          input: ...,
          env: { // The trick is to create an environment variable where the branch name is stored.
            "BRANCH": branch,
          },
          commands: [
            "npm ci",
            "npm run build",
            "npx cdk synth -c branch=$BRANCH", // During synthesis the environment variable is passed in as the branch name to the cdk context.
          ]
        })
      });
      
      // This is just for generating resource names based on the pipeline branch
      export function createResourceName(node: ConstructNode, resourceName: string) {
        const branch = node.tryGetContext("branch");
        return `${branch}-${resourceName}`;
      }
      

      这里的技巧是在综合过程中如何解析分支变量。它实际上是从 cdk 上下文中查找的。开发人员第一次从新的 dev 分支(例如分支“bug123”)配置管道时,cdk 应用程序使用如下命令部署:cdk deploy -c branch=bug123。这通常从本地工作站执行。在综合期间,从 cdk 上下文中检索分支。同时,第一次部署在负责合成 CDK 应用的 CodeBuild 项目中创建了一个名为 BRANCH 的环境变量。这就像在石头上写下管道的分支名称。

      管道第二次运行时,例如因为开发人员将一些代码签入分支,运行用于合成应用程序的命令是管道命令部分中定义的命令:npx cdk synth -c branch=$BRANCH。由于环境变量是在第一次部署时设置的,所以现在将相同的分支名称传递给 cdk 上下文。结果,cdk 代码中的分支变量再次从上下文解析为创建管道时使用的原始分支名称。

      这样,可以创建多个分支并为每个分支部署新的管道,而无需担心或维护源代码中分支和管道之间的任何映射。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-02
        • 1970-01-01
        相关资源
        最近更新 更多