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
然后将文件添加为工件。
我的 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
然后将文件添加为工件。