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