3

我的 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 |
+-----+      +------------+     +-----+
4

2 回答 2

2

您应该定义一个人工制品,它将是一个imagedefinitions.json为 ECS 标准部署操作或imageDetail.jsonAmazon ECS 蓝/绿部署操作命名的 json 文件。此处的参考资料中对此进行了说明。

就我而言,由于我正在进行标准部署,因此我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

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

于 2020-04-03T04:31:50.350 回答
0

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

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

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

于 2020-04-02T20:25:47.957 回答