如何通过 CodePipeline 使用 GitHub Enterprise 部署 Amazon ECS 应用程序?

上次更新时间:2020 年 2 月 11 日

我想通过 AWS CodePipeline 使用 GitHub Enterprise 部署 Amazon Elastic Container Service (Amazon ECS) 应用程序。

简短描述

选择以下任一方案:

  • 通过将 Git 与 CodePipeline 集成,使用 AWS Lambda 和 Amazon API Gateway 创建自定义 Webhook。
  • 完成下面解决方法部分描述的步骤,将 GitHub Enterprise 作为 AWS CodeBuild 项目的源集成。

在下面的解决方法中,您将以您的 GitHub Enterprise 存储库为源创建一个 CodeBuild 项目。

此解决方法的原理如下:

  • 该项目包含两个 buildspec.yml 文件。第一个文件用于 CodeBuild,它会创建构件并将构件移动到 Amazon Simple Storage Service (Amazon S3)。另一个文件用于 CodePipeline。该文件将会构建一个 Docker 镜像并推送到 Amazon Elastic Container Registry (Amazon ECR)。
  • 某个 Amazon S3 存储桶将会收到每个构建创建的新 cb-artifact.zip 文件。
  • 在 CodePipeline 中,您将有一个源、构建和部署阶段。源阶段指向 Amazon S3 对象 (cb-artifact.zip)。构建阶段将会构建一个 Docker 镜像并推送到 Amazon ECR。部署阶段将会更新 Amazon ECS 服务上的任务定义版本。

解决方法

以 GitHub Enterprise 为源创建新的 CodeBuild 项目

1.    打开 CodeBuild 控制台

2.    选择创建构建项目

3.    对于项目名称,为您的项目输入一个唯一的名称。

4.    对于部分的源提供商,选择 GitHub Enterprise

5.    对于 GitHub Enterprise 个人访问令牌,输入从您的 GitHub 账户生成的令牌,然后选择保存令牌

注意:您必须仅输入并保存个人访问令牌一次。所有未来的 CodeBuild 项目都将使用此令牌。

6.    对于 Repository URL,输入存储库的路径,包括存储库的名称。

7.    展开其他配置

8.    要在连接到您的 GitHub Enterprise 项目存储库时忽略 SSL 警告,选择启用不安全的 SSL

注意:最佳实践是仅为测试目的启用不安全的 SSL,而不要为生产环境启用此设置。

9.    在主要源 Webhook 部分,选中每次向此存储库推送代码更改时重新构建复选框。

10.    对于环境镜像,选择托管镜像

11.    对于操作系统,选择 Amazon Linux 2

12.    对于 运行时,选择标准

13.    对于镜像,选择 aws/codebuild/amazonlinux2-x86_64-standard:2.0

14.    对于镜像版本,选择始终使用此运行时版本的最新镜像

15.    对于环境类型,选择 Linux

16.    将如果您希望构建 Docker 镜像或希望让您的构建包获得提升权限,请启用此标记复选框留空。

17.    对于服务角色,选择新服务角色

注意:更新新的服务角色并添加权限以便 CodeBuild 访问您存储该 zip 文件的 Amazon S3 存储桶。

18.    对于构建规范部分的构建规范,根据您的需求选择使用构建规范文件插入构建命令。请参阅以下示例构建规范

version: 0.2
  phases:
    install:
      runtime-versions:
        docker: 18
    build:
      commands:
          - echo Uploading Artifacts to S3
  artifacts:
      files:
          - '**/*'

注意:同一项目有两个 buildspec.yml 文件。这两个文件存储在项目的不同文件夹中。第一个文件的路径定义为 codebuild/buildspec.yml

19.    对于构建中的类型,选择 Amazon S3

20.    对于存储桶名称,从列表中选择一个存储桶或者新建一个。

重要提示:使用现有的 Amazon S3 存储桶或创建新的 Amazon S3 存储桶启用并启用版本控制。Amazon S3 存储桶用于存储每个构建创建的 zip 文件。每个新构建都会将一个新的 zip 文件推送到 Amazon S3 存储桶。每个新的 zip 文件都会触发代码管道。

21.    对于名称,选择 cb-artifact.zip

22.    对于路径命名空间类型,保留默认选项。

23.    对于构件封装,选择 zip

24.    选择创建构建项目

注意:在 CodeBuild 控制台中创建的新角色将命名为 codebuild-YourProjectName-service-role

以 Amazon S3 存储桶为源创建新代码管道

1.    打开 CodePipeline 控制台

2.    选择创建管道

3.    对于管道名称,输入您的管道名称。

4.    对于服务角色,选择新服务角色

5.    选择下一步

6.    对于部分的源提供商,选择 Amazon S3

7.    对于存储桶,选择包含构建创建的 zip 文件并且具有您的存储桶名称的存储桶。

8.    对于 S3 对象键,输入 cb-artifact.zip

9.    选择 Next

10.    选择创建管道

为构建阶段创建新的 CodeBuild 项目

1.    对于构建提供商,选择 AWS CodeBuild,然后选择创建项目

注意:您将被重定向到 CodeBuild 项目创建页面。

2.    对于项目名称,为您的项目输入一个唯一的名称。

3.    对于环境镜像,选择托管镜像

4.    对于操作系统,选择 Amazon Linux 2

5.    对于 运行时,选择标准

6.    对于镜像,选择 aws/codebuild/amazonlinux2-x86_64-standard:2.0

7.    对于镜像版本,选择始终使用此运行时版本的最新镜像

8.    对于环境类型,选择 Linux

9.    选中如果您希望构建 Docker 镜像或希望让您的构建包获得提升权限,请启用此标记复选框。

10.    对于服务角色,选择新服务角色

11.    对于构建规范部分的构建规范,根据您的需求选择使用构建规范文件插入构建命令。请参阅以下示例构建规范:

version: 0.2
phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - YOUR_ACCOUNT_ID=$(aws sts get-caller-identity --output text --query 'Account')
      - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - REPOSITORY_URI=$(echo $ACCOUNT_ID).dkr.ecr.eu-central-1.amazonaws.com/ECR-REPO-NAME
      - 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":"YourContainerName","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json

注意:如果您使用上述示例代码,请更新 ECR-REPO-NAMEYourContainerName 参数。

重要提示:同一项目有两个 buildspec.yml 文件。这两个文件存储在项目的不同文件夹中。第二个文件的路径定义为 codepipeline/buildspec.yml。构建规范所生成文件的默认文件名为 imagedefinitions.json。如果您选择使用不同的文件名,您必须在创建管道部署阶段时提供该名称。

12.    选择继续 CodePipeline 操作

13.    将环境变量变量命名空间留空。

14.    对于输出构件,添加一个唯一的名称(例如 BuildArtifact)以供稍后使用。

15.    选择完成

使用 Amazon ECS 部署集群和服务

完成上一部分描述的步骤后,您将被重定向至 CodePipeline 控制台。

1.    在 CodePipeline 控制台的部署部分,对于部署提供商,选择 Amazon ECS

2.    对于输入构件,选择 BuildArtifact

3.    对于集群名称,选择您要部署的集群。

4.    对于服务名称,选择您要部署的服务。

5.    选择下一步,然后选择创建管道

6.    创建构建项目和管道后,在 AWS Identity and Access Management (IAM) 控制台中更新服务角色。

注意:在 CodeBuild 控制台中创建的更新服务角色将命名为 codebuild-YourProjectName-service-role。此角色不具有将镜像推送到 Amazon ECR 的权限。有关更多信息,请参阅步骤 3:向 CodeBuild 角色添加 Amazon ECR 权限


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?