对我来说,使用 CodePipeline 的全部意义在于使用 CodeDeploy 自动部署 ECS 服务(蓝/绿部署)。
CodePipeline 有以下阶段:
包含 Bitbucket webhook 的“源”。
“Build”包含 CodeBuild 步骤(在 ECR 上构建并推送 Docker 映像)。
“部署”包含 ECS(蓝色/绿色),将使用 CodeDeploy 部署设计的服务。
我不明白的是,在我的例子中,taskdef.json 和 appsec.yaml 的目的。
我仅手动执行的操作(因此当前没有 CodePipeline)是使用相同的任务定义重新部署 ECS 服务。我实际上不必每次都更新我的任务定义,因为我推送的 docker 镜像始终具有相同的标签(暂存或生产),所有其他镜像都未标记,因此只有一个可用。
那么为什么必须输入这些文件,即使当我手动输入时,我也不会更改任何内容,只需不断单击“下一步”?
另外,我如何将其包含在 CodeBuild 步骤中?
在管道上,您可以使用 AWS CodeCommit 输入 taskdef.json 文件以及 appspec.yml。每次部署时,CodePipeline 都会获取最新的可用输入。
例如,您更改了环境变量值。这在taskdef.json 文件中进行。您需要做的就是使用新版本的 taskdef.json 推送提交。这将使用新的 taskdef.json 触发新的部署,并使用带有您在 CodePipilie/CodeDeploy 上指定的标签的最新 ECR 映像。
本教程介绍了如何将所有内容组合在一起:https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html
我终于找到怎么做了。我首先做的是将 taskdef.json 和 appspec.yaml 文件包含在我的 Git 项目中。由于我不需要“自动更新”或“生成”这些文件,因此我只是采用 JSON 格式获取最后一个任务定义,并将其放入 taskdef.json 中。
对于 appspec.yaml,您可以在 ECS 服务上进行手动部署时以 JSON 格式获取它,在最后一页上总结了所有内容。
然后,您需要更新 CodeBuild 项目以将两个工件上传到 S3 上,然后在管道中,部署任务可以使用这些工件。
这个网站帮助我很好地设置了一切。
如果有人需要它并且正在使用 CodeBuild,另一种选择是动态创建它们:
文件:buildspec.yml
版本:0.2 阶段: 预构建: 命令: - COMMIT_HASH = $(回显$ CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=最新} 建造: 命令: - docker build --platform linux/amd64 -f ./Dockerfile -t $REPOSITORY_URL:$IMAGE_TAG 。 构建后: 命令: - aws ecr 获取登录密码 --region us-east-1 | docker登录--用户名AWS--密码-stdin $REPOSITORY_URL - docker 推送 $REPOSITORY_URL:$IMAGE_TAG - > aws ecs 描述任务定义 --任务定义 cv-dev-任务定义-web | jq '.taskDefinition' | jq '.taskDefinition' | jq 'del(.taskDefinitionArn,.revision,.registeredAt,.registeredBy,.requiresAttributes)' | jq '.containerDefinitions[0].image = "$REPOSITORY_URL:$IMAGE_TAG"' > task-definition.json - > 回声' 版本:0.0 资源: - 目标服务: 类型:AWS::ECS::服务 特性: 任务定义: 负载均衡器信息: 容器名称:“web” 集装箱港口:80 容量提供商策略: - 容量提供商:“$ECS_CAPACITY_PROVIDER” 基数:1 重量:100 ' > appspec.yml 文物: 文件: -appspec.yml - 任务定义.json