教程:CodePipeline 持续部署
本教程帮助您通过将 Amazon ECS 与 CodePipeline 结合使用来创建一个完整的端到端持续部署 (CD) 管道。
先决条件
您必须先部署一些资源,然后才能使用本教程创建您的 CD 管道。以下是您在开始操作之前需要的资源:
注意
所有这些资源均应在同一 AWS 区域内创建。
-
一个包含您的 Dockerfile 和应用程序源的源代码控制存储库 (本教程使用 CodeCommit)。有关更多信息,请参阅 AWS CodeCommit 用户指南 中的创建 CodeCommit 存储库。
-
一个 Docker 映像存储库 (本教程使用 Amazon ECR),其包含您从 Dockerfile 和应用程序源构建的映像。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南 中的创建存储库和推送映像。
-
一个 Amazon ECS 任务定义,该定义引用了在您的映像存储库中托管的 Docker 映像。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的创建任务定义。
-
一个 Amazon ECS 集群,该集群运行了使用您的前述任务定义的服务。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的创建集群和创建服务。
在满足这些先决条件后,您可以继续完成本教程并创建您的 CD 管道。
步骤 1:将构建规范文件添加至您的源存储库
本教程使用 CodeBuild 构建您的 Docker 映像并将该映像推送至 Amazon ECR。将 buildspec.yml
文件添加至您的源代码存储库以指示 CodeBuild 如何执行此操作。下面的示例构建规范将执行以下操作:
-
构建前阶段:
-
登录 Amazon ECR。
-
将存储库 URI 设置为您的 ECR 映像并添加包含源的 Git 提交 ID 的前七个字符的映像标签。
-
-
构建阶段:
-
构建 Docker 映像并使用 Git 提交 ID 将该映像标记为
latest
。
-
-
构建后阶段:
-
使用两个标签将该映像推送至 ECR 存储库。
-
将名为
imagedefinitions.json
的文件写入到包含您的 Amazon ECS 服务的容器名称以及该映像和标签的构建根目录。您的 CD 管道的部署阶段将使用此信息来创建您的服务的任务定义的新修订,然后它会将该服务更新为使用此新任务定义。CodeDeploy ECS 作业辅助角色需要imagedefinitions.json
文件。
-
version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) - REPOSITORY_URI=
012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $REPOSITORY_URI:latest . - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $REPOSITORY_URI:latest - docker push $REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... - printf '[{"name":"hello-world
","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json
针对以下任务定义编写了构建规范,该规范由本教程的 Amazon ECS 服务使用。REPOSITORY_URI
值对应于 image
存储库 (没有任何映像标签),此文件末尾附近的
值对应于该服务的任务定义中的容器名称。
hello-world
{ "taskDefinition": { "family": "hello-world", "containerDefinitions": [ { "name": "
hello-world
", "image": "012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
:6a57b99", "cpu": 100, "portMappings": [ { "protocol": "tcp", "containerPort": 80, "hostPort": 80 } ], "memory": 128, "essential": true } ] } }
将 buildspec.yml
文件添加至您的源存储库
-
打开文本编辑器,然后将上述构建规范复制并粘贴到新文件中。
-
针对您的 Docker 映像将
REPOSITORY_URI
值 (
) 替换为 Amazon ECR 存储库 URI(没有任何映像标签)。将012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
替换为引用您的 Docker 映像的服务的任务定义中的容器名称。hello-world
-
提交您的
buildspec.yml
文件并将其推送至源存储库。-
添加文件。
git add .
-
提交更改。
git commit -m "Adding build specification."
-
推送提交。
git push
-
步骤 2:创建持续部署管道
使用 CodePipeline 向导创建您的管道阶段并将源存储库连接到您的 ECS 服务。
创建管道
-
通过以下网址打开 CodePipeline 控制台:https://console.amazonaws.cn/codepipeline/。
-
在 Welcome 页面上,选择 Create pipeline。
如果这是您第一次使用 CodePipeline,则会显示一个介绍页面,而不是欢迎页面。选择 Get Started Now。
-
在 Step 1: Name 页面上,对于 Pipeline name,键入您的管道的名称,然后选择 Next step。在本教程中,管道名称为 hello-world。
-
在 步骤 2: 源 页面上,对于源提供商,选择 CodeCommit。
-
对于存储库名称,选择要用作您的管道的源位置的 CodeCommit 存储库的名称。
-
对于 Branch name,选择要使用的分支,然后选择 Next step。
-
-
在步骤 3: 构建页面上,选择 CodeBuild,然后选择创建新构建项目。
-
对于 Project name,为您的构建项目选择唯一名称。在本教程中,项目名称为 hello-world。
-
对于 Operating system,选择 Ubuntu。
-
对于 Runtime,选择 Docker。
-
对于版本,选择 aws/codebuild/docker:17.09.0。
-
选择 Save build project。
-
选择下一步。
注意
该向导为您的构建项目创建一个名为 code-build-
build-project-name
-service-role 的 CodeBuild 服务角色。记下此角色名称,因为稍后您要将 Amazon ECR 权限添加至该角色。
-
-
在 步骤 4: 部署页面上,对于部署提供商,选择 Amazon ECS。
-
对于集群名称,选择您的服务正在其中运行的 Amazon ECS 集群。在本教程中,该集群为 default。
-
对于 Service name,选择要更新的服务,然后选择 Next step。在本教程中,服务名称为 hello-world。
-
-
在 Step 5: Service Role 页面上,选择 Create role。在介绍要为您创建的角色的 IAM 控制台页面上,选择允许。
-
选择下一步。
-
在 Step 6: Review 页面上,审查您的管道配置,然后选择 Create pipeline 以创建管道。
注意
既然管道已创建好,它将尝试经历不同的管道阶段。但是,由此向导创建的默认 CodeBuild 角色无权执行包含在
buildspec.yml
文件中的所有命令,因此构建阶段失败。下一部分将为构建阶段添加权限。
步骤 3:向 CodeBuild 角色添加 Amazon ECR 权限
CodePipeline 向导为 CodeBuild 构建项目创建了一个名为 code-build-build-project-name
-service-role 的 IAM 角色。在本教程中,该名称为 code-build-hello-world-service-role。由于 buildspec.yml
文件调用了 Amazon ECR API 操作,因此该角色必须具有一个允许权限进行这些 Amazon ECR 调用的策略。以下过程帮助您将适当权限附加到该角色。
向 CodeBuild 角色添加 Amazon ECR 权限
-
通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/。
-
在左侧导航窗格中,选择 Roles。
-
在搜索框中,键入 code-build-,然后选择已由 CodePipeline 向导创建的角色。在本教程中,角色名称为 code-build-hello-world-service-role。
-
在 Summary 页面上,选择 Attach policy。
-
选中 AmazonEC2ContainerRegistryPowerUser 策略左侧的框,然后选择 Attach policy。
步骤 4:测试您的管道
您的管道应具有运行端到端本机 AWS 持续部署所需的一切。现在,通过将代码更改推送至您的源存储库来测试管道的功能。
测试您的管道
-
对您的已配置源存储库进行代码更改,然后提交并推送更改。
-
通过以下网址打开 CodePipeline 控制台:https://console.amazonaws.cn/codepipeline/。
-
从列表中选择您的管道。
-
监视管道经历不同阶段的进度。您的管道应完成且您的 Amazon ECS 服务运行通过您的代码更改创建的 Docker 映像。