AWS CodePipeline:如何使 CodeBuild 构建的 ECR 映像作为剩余阶段的工件?

Posted

技术标签:

【中文标题】AWS CodePipeline:如何使 CodeBuild 构建的 ECR 映像作为剩余阶段的工件?【英文标题】:AWS CodePipeline: How to make ECR Image build by CodeBuild as an artifact for the remaining stages? 【发布时间】:2020-07-14 06:49:44 【问题描述】:

我的 CodePipeline 目前有一个 Github Source 和一个 CodeBuild,用于构建图像并将其推送到 ECR:

+---------------+      +-----------+     +-----+
| 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 |
+-----+      +------------+     +-----+

【问题讨论】:

【参考方案1】:

您应该定义一个工件,它将是一个名为 imagedefinitions.json 的 json 文件,用于 ECS 标准部署操作,或 imageDetail.json 用于 Amazon ECS 蓝/绿部署操作。参考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

然后将该文件添加为工件。

【讨论】:

【参考方案2】:

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

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

一个额外的好处是,使用 git hash 作为容器版本允许您从图像标签中引用 git pull 请求,这对可见性很有好处。

【讨论】:

以上是关于AWS CodePipeline:如何使 CodeBuild 构建的 ECR 映像作为剩余阶段的工件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS CodeDeploy/CodePipeline/S3 将 Gitlab-Ci 部署到 EC2

如何配置 AWS CodePipeline、CodeBuild 和 Elastic Beanstalk 以正确部署 Laravel 8 应用程序?

由于权限错误,无法在 AWS CodePipeline 中完成部署阶段

AWS:帮助在 Codepipeline 中设置 CodeDeploy

AWS CodeBuild + CodePipeline:“找不到匹配的工件路径”

AWS CodePipeline - 使用现有 Dockerrun.aws.json 部署到 Elastic Beanstalk