AWS CodeBuild
用户指南 (API 版本 2016-10-06)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

适用于 CodeBuild 的 Amazon ECR 示例

此示例使用 Amazon Elastic Container Registry (Amazon ECR) 映像存储库中的 Docker 映像生成示例 Go 项目。

重要

运行此示例可能会导致您的 AWS 账户产生相关费用。这些费用包括可能针对 AWS CodeBuild 和 AWS 资源以及与 Amazon S3、AWS KMS、CloudWatch Logs 和 Amazon ECR 相关的操作收取的费用。有关更多信息,请参阅 CodeBuild 定价Amazon S3 定价AWS Key Management Service 定价Amazon CloudWatch 定价Amazon Elastic Container Registry 定价

运行示例

要运行此示例,请:

  1. 要创建 Docker 映像并将其推送到 Amazon ECR 中的映像存储库,请完成 Docker 示例的“运行示例”部分的步骤。

  2. 创建 Go 项目:

    1. 按照本主题的Go 项目结构Go 项目文件部分的说明创建文件,然后将其上传到 Amazon S3 输入存储桶或者 AWS CodeCommit、GitHub 或 Bitbucket 存储库。

      重要

      请不要上传 (root directory name),而只上传 (root directory name) 中的文件。

      如果您使用的是 Amazon S3 输入存储桶,请务必创建一个包含文件的 ZIP 文件,然后将其上传至输入存储桶。请不要将 (root directory name) 添加到 ZIP 文件中,而只添加 (root directory name) 中的文件。

    2. 请按照 直接运行 AWS CodeBuild 中的步骤创建构建项目、运行构建并查看相关构建信息。

      如果您使用 AWS CLI 创建构建项目,则 create-project 命令的 JSON 格式输入可能与此类似。(请将占位符替换为您自己的值。)

      { "name": "sample-go-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID-account-ID-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:2.0", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
    3. 要获取构建输出项目,请打开您的 Amazon S3 输出存储桶。

    4. GoOutputArtifact.zip 文件下载到您的本地计算机或实例,然后提取该文件的内容。在提取出来的内容中,获取 hello 文件。

  3. 如果满足以下条件之一,则必须向 Amazon ECR 中的映像存储库添加权限,以便 AWS CodeBuild 可以将其 Docker 映像拉取到以下构建环境中:

    • 您的项目使用 CodeBuild 凭证来拉取 Amazon ECR 映像。这是由 ProjectEnvironment 的 imagePullCredentialsType 属性中的 CODEBUILD 值指示的。

    • 您的项目使用了跨账户 Amazon ECR 映像。在这种情况下,您的项目必须使用其服务角色拉取 Amazon ECR 映像。要启用此行为,请将 ProjectEnvironment 的 imagePullCredentialsType 属性设置为 SERVICE_ROLE。​

    1. Open the Amazon ECR console at https://console.amazonaws.cn/ecr/.

    2. 在存储库名称列表中,选择您创建或选择的存储库的名称。

    3. 在导航窗格中,选择 Permissions (权限),选择 Edit (编辑),然后选择 Add statement (添加声明)

    4. 对于 Statement name (声明名称),输入标识符(例如 CodeBuildAccess)。

    5. 对于 Effect (效果),选择 Allow (允许)。这表示您希望允许访问另一个 AWS 账户。

    6. 对于 Principal (委托人),执行以下操作之一:

      • 如果您的项目使用 CodeBuild 凭证来拉取 Amazon ECR 映像,请在 Service principal (服务委托人) 中输入 codebuild.amazonaws.com​。

      • 如果您的项目使用跨账户 Amazon ECR 映像,对于 AWS account ID (AWS 账户 ID),输入您要授予访问权限的 AWS 账户的 ID。

    7. 跳过 All IAM entities (所有 IAM 实体) 列表。

    8. 对于 Action (操作),选择所有仅拉取操作 ecr:GetDownloadUrlForLayerecr:BatchGetImageecr:BatchCheckLayerAvailability

    9. 选择 Save

      此策略显示在 Permissions (权限) 中。委托人是您在此过程的步骤 3f 中输入的 Principal (委托人)

      • 如果您的项目使用 CodeBuild 凭证来拉取 Amazon ECR 映像,Service principal (服务委托人) 下为 "codebuild.amazonaws.com"​。

      • 如果您的项目使用跨账户 Amazon ECR 映像,AWS account ID (AWS 账户 ID) 下是您要授予访问权限的 AWS 账户的 ID。

        下面的示例策略使用了跨账户 Amazon ECR 映像。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "CodeBuildAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AWS-account-ID:root" }, "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] }
  4. 请按照 直接运行 AWS CodeBuild 中的步骤创建构建项目、运行构建并查看相关构建信息。

    如果您使用 AWS CLI 创建构建项目,则 create-project 命令的 JSON 格式输入可能与此类似。(请将占位符替换为您自己的值。)

    { "name": "amazon-ecr-sample-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID-account-ID-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "account-ID.dkr.ecr.region-ID.amazonaws.com/your-Amazon-ECR-repo-name:latest", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
  5. 要获取构建输出项目,请打开您的 Amazon S3 输出存储桶。

  6. GoOutputArtifact.zip 文件下载到您的本地计算机或实例,然后提取 GoOutputArtifact.zip 文件的内容。在提取出来的内容中,获取 hello 文件。

Go 项目结构

此示例假定有这样一个目录结构。

(root directory name) |-- buildspec.yml `-- hello.go

Go 项目文件

此示例将使用这些文件。

buildspec.yml (在 (root directory name))

version: 0.2 phases: install: runtime-versions: golang: 1.12 build: commands: - echo Build started on `date` - echo Compiling the Go code... - go build hello.go post_build: commands: - echo Build completed on `date` artifacts: files: - hello

hello.go (在 (root directory name))

package main import "fmt" func main() { fmt.Println("hello world") fmt.Println("1+1 =", 1+1) fmt.Println("7.0/3.0 =", 7.0/3.0) fmt.Println(true && false) fmt.Println(true || false) fmt.Println(!true) }

相关资源