AWS CodePipeline:如何将 CodeBuild 构建的 ECR Image 作为剩余阶段的工件?

AWS CodePipeline: How to make ECR Image build by CodeBuild as an artifact for the remaining stages?

我的 CodePipeline 当前有一个 Github 源和一个构建图像并将其推送到 ECR 的 CodeBuild:

+---------------+      +-----------+     +-----+
| GitHub Source +----->+ CodeBuild +---->+ ECR |
+---------------+      +-----------+     +-----+

我想向管道添加一个 CodeDeploy 步骤,它将把映像推送到 ECR 并将其部署到 ECS 上。但是我的 CodeBuild 步骤没有产生任何工件(它上传到 ECS,我不知道如何将 ECR 图像定义为工件)。所以我无法将 CodeDeploy 连接到管道。知道怎么做吗?

+---------------+      +-----------+     +-----+      +------------+     +-----+
| GitHub Source +----->+ CodeBuild +---->+ ECR +----->+ CodeDeploy +---->+ ECS |
+---------------+      +-----------+     +-----+      +------------+     +-----+

我能想到的唯一解决方案是制作第二条管道,将 ECR 作为源,并进行部署。

     Pipeline 1
+---------------+      +-----------+     +-----+
| GitHub Source +----->+ CodeBuild +---->+ ECR |
+---------------+      +-----------+     +-----+

 Pipeline 2
+-----+      +------------+     +-----+
| ECR +----->+ CodeDeploy +---->+ ECS |
+-----+      +------------+     +-----+

不确定您如何对 ECR 图像进行版本控制,但您可以使用 git 散列对它们进行版本控制,该散列可在代码构建中作为环境变量 $CODEBUILD_RESOLVED_SOURCE_VERSION 获得(注意:输入工件需要成为此 env 变量可用的来源)。

然后在您的 CodeDeploy 步骤中,也使用输入工件作为源,然后将 $CODEBUILD_RESOLVED_SOURCE_VERSION 指定为您希望 CodeDeploy 部署的映像标签。

一个额外的好处,使用 git 散列作为容器版本允许您从图像标签引用 git 拉取请求,这有利于提高可见性。

您应该为 ECS 标准部署操作定义一个名为 imagedefinitions.json 的 json 文件或为 Amazon ECS Blue/Green 部署操作定义一个名为 imageDetail.json 的文件。在参考文献 here.

中有解释

在我的例子中,因为我进行的是标准部署,所以我在构建结束时向 buildspec.yml 添加了两个额外的命令:

  phases: 
    build: 
      commands: 

        ...Build and push to ECR...

        echo Generating imagedefinitions.json
        echo '[{"name":"<CONTAINER-NAME>","imageUri":"'<IMAGE-URI>"}]' > imagedefinitions.json
  artifacts:
    files:
      - imagedefinitions.json

然后将文件添加为工件。