

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 内置 AWS CodeBuild
<a name="builds-working"></a>

*生成*表示根据一组输入项目（例如，Java 类文件集合）创建输出构件（例如 JAR 文件）时执行的一组操作。 AWS CodeBuild 

运行多个构建时，以下规则适用：
+ 如果可能，构建会同时运行。最大并发运行构建数会发生变化。有关更多信息，请参阅 [的配额 AWS CodeBuild](limits.md)。
+ 如果构建项目设置了并发构建限制，则正在运行的构建数量达到该项目的并发构建限制时，构建将返回错误。有关更多信息，请参阅[启用并发构建限制](create-project.md#enable-concurrent-build-limit.console)。
+ 如果构建项目未设置并发构建限制，则正在运行的构建数量达到该平台和计算类型的并发构建限制时，构建将排队。队列中的最大构建数为并发构建限制的 5 倍。有关更多信息，请参阅 [的配额 AWS CodeBuild](limits.md)。

  从队列中删除在超时值中指定的分钟数后，不会启动队列中的构建。默认超时值为 8 小时。运行构建时，可以使用介于 5 分钟到 8 小时之间的值覆盖构建队列超时。有关更多信息，请参阅[手动运行 AWS CodeBuild 构建](run-build.md)。

  无法预测排队的构建的开始顺序。

**注意**  
您可以访问生成包一年的历史记录。

在使用构建时，您可以执行以下任务：

**Topics**
+ [手动运行 AWS CodeBuild 构建](run-build.md)
+ [在 AWS Lambda 计算基础上运行构建](lambda.md)
+ [在预留容量实例集上运行构建](fleets.md)
+ [批量运行构建](batch-build.md)
+ [在批量构建中执行并行测试](parallel-test.md)
+ [缓存构建以提高性能](build-caching.md)
+ [调试内置 AWS CodeBuild](debug-builds.md)
+ [在 AWS CodeBuild 中删除构建](delete-builds.md)
+ [在中手动重试构建 AWS CodeBuild](retry-build.md)
+ [在 AWS CodeBuild 中自动重试构建](auto-retry-build.md)
+ [在 AWS CodeBuild 中停止构建](stop-build.md)
+ [在 AWS CodeBuild 中停止批量构建](stop-batch-build.md)
+ [自动触发 AWS CodeBuild 构建](build-triggers.md)
+ [在中查看版本详情 AWS CodeBuild](view-build-details.md)
+ [查看内置 IDs 列表 AWS CodeBuild](view-build-list.md)
+ [在中查看构建 IDs 项目的构建列表 AWS CodeBuild](view-builds-for-project.md)

# 手动运行 AWS CodeBuild 构建
<a name="run-build"></a>

您可以使用 AWS CodeBuild 控制台 AWS CLI、或 AWS SDKs 来运行内部版本 CodeBuild。

**Topics**
+ [使用 AWS CodeBuild 代理在本地运行构建](use-codebuild-agent.md)
+ [运行构建（控制台）](run-build-console.md)
+ [运行构建 (AWS CLI)](run-build-cli.md)
+ [运行批量构建 (AWS CLI)](run-batch-build-cli.md)
+ [开始自动运行构建（AWS CLI）](run-build-cli-auto-start.md)
+ [停止自动运行构建（AWS CLI）](run-build-cli-auto-stop.md)
+ [运行构建 (AWS SDKs)](run-build-sdks.md)

# 使用 AWS CodeBuild 代理在本地运行构建
<a name="use-codebuild-agent"></a>

您可以使用 AWS CodeBuild 代理在本地计算机上运行 CodeBuild 构建。有适用于 x86\$164 和 ARM 平台的代理。

您还可以进行订阅，这样便能在发布代理的新版本时收到通知。

## 先决条件
<a name="use-codebuild-agent.prerequisites"></a>

在开始之前，您需要执行以下操作：
+ 在本地计算机上安装 Git。
+ 在本地计算机上安装和设置 [Docker](https://www.docker.com/)。

## 设置构建映像
<a name="use-codebuild-agent.setup-image"></a>

您只需要在首次运行代理时或映像发生更改时设置构建映像。

**设置构建映像**

1. [如果你想使用精心策划的 Amazon Linux 2 镜像，你可以从 https://gallery.ecr 的亚马逊 ECR CodeBuild 公共存储库中提取它。 aws/codebuild/amazonlinux-x86\$164-standard，使用以下命令](https://gallery.ecr.aws/codebuild/amazonlinux-x86_64-standard)：

   ```
   $ docker pull public.ecr.aws/codebuild/amazonlinux-x86_64-standard:4.0
   ```

   或者，如果要使用另一个 Linux 映像，请执行以下步骤：

   1. 克隆 CodeBuild 镜像存储库：

      ```
      $ git clone https://github.com/aws/aws-codebuild-docker-images.git
      ```

   1. 切换到该映像目录。本示例使用 `aws/codebuild/standard:5.0` 映像：

      ```
      $ cd aws-codebuild-docker-images/ubuntu/standard/5.0
      ```

   1. 构建映像。这将需要花几分钟的时间。

      ```
      $ docker build -t aws/codebuild/standard:5.0 .
      ```

1. 下载代 CodeBuild 理。

   要下载 x86\$164 版本代理，请运行以下命令：

   ```
   $ docker pull public.ecr.aws/codebuild/local-builds:latest
   ```

   要下载 ARM 版本代理，请运行以下命令：

   ```
   $ docker pull public.ecr.aws/codebuild/local-builds:aarch64
   ```

1. <a name="codebuild-agent-sha"></a>该 CodeBuild 代理可从 [https://gallery.ecr 获得。 aws/codebuild/local-构建](https://gallery.ecr.aws/codebuild/local-builds)。

   x86\$164 版本代理的安全哈希算法（SHA）签名为：

   ```
   sha256:ccb19bdd7af94e4dc761e4c58c267e9455c28ec68d938086b4dc1cf8fe6b0940
   ```

   ARM 版本代理的 SHA 签名为：

   ```
   sha256:7d7b5d35d2ac4e062ae7ba8c662ffed15229a52d09bd0d664a7816c439679192
   ```

   您可以通过此 SHA 识别代理的版本。要查看代理的 SHA 签名，请运行以下命令并在 `RepoDigests` 下查找 SHA：

   ```
   $ docker inspect public.ecr.aws/codebuild/local-builds:latest
   ```

## 运行代 CodeBuild 理
<a name="use-codebuild-agent.run-agent"></a>

**运行代 CodeBuild 理**

1. 请切换到包含构建项目源的目录。

1. 下载 [codebuild\$1build.sh](https://github.com/aws/aws-codebuild-docker-images/blob/master/local_builds/codebuild_build.sh) 脚本：

   ```
   $ curl -O  https://raw.githubusercontent.com/aws/aws-codebuild-docker-images/master/local_builds/codebuild_build.sh
   $ chmod +x codebuild_build.sh
   ```

1. 运行 `codebuild_build.sh` 脚本并指定容器映像和输出目录。

   要运行 x86\$164 构建，请运行以下命令：

   ```
   $ ./codebuild_build.sh -i <container-image> -a <output directory>
   ```

   要运行 ARM 构建，请运行以下命令：

   ```
   $ ./codebuild_build.sh -i <container-image> -a <output directory> -l public.ecr.aws/codebuild/local-builds:aarch64
   ```

   *<container-image>*替换为容器镜像的名称，例如`aws/codebuild/standard:5.0`或`public.ecr.aws/codebuild/amazonlinux-x86_64-standard:4.0`。

   该脚本启动构建映像，并在当前目录中的项目上运行构建。要指定构建项目的位置，请在脚本命令中添加 `-s <build project directory>` 选项。

## 接收有关新 CodeBuild 代理版本的通知
<a name="receive-codebuild-agent-notifications"></a>

您可以订阅 Amazon SNS 通知，以便在 AWS CodeBuild 代理发布新版本时收到通知。

**订阅 CodeBuild 代理通知**

1. [在 v3/home 上打开亚马逊 SNS 控制台。https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/v3/home)

1. 在导航栏中，如果尚未选择 AWS 该区域，则将其更改为**美国东部（弗吉尼亚北部）**。您必须选择此 AWS 区域，因为您订阅的 Amazon SNS 通知是在该区域创建的。

1. 在导航窗格中，选择**订阅**。

1. 选择**创建订阅**。

1. 在**创建订阅**中，请执行以下操作：

   1. 对于**主题 ARN**，请使用以下 Amazon 资源名称（ARN）：

      ```
      arn:aws:sns:us-east-1:850632864840:AWS-CodeBuild-Local-Agent-Updates
      ```

   1. 对于**协议**，选择**电子邮件**或 **SMS**。

   1. 对于**端点**，选择要接收通知的位置（电子邮件或 SMS）。输入电子邮件、地址或电话号码，包括区号。

   1. 选择**创建订阅**。

   1. 选择**电子邮件**，可接收要求确认订阅的电子邮件。按照电子邮件中的指示完成订阅。

      如果您不希望再收到这些通知，请通过以下步骤取消订阅。

**取消订阅 CodeBuild 代理通知**

1. [在 v3/home 上打开亚马逊 SNS 控制台。https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/v3/home)

1. 在导航窗格中，选择**订阅**。

1. 选择订阅，并从**操作**中，选择**删除订阅**。请在提示您进行确认时选择**删除**。

# 运行构建（控制台）
<a name="run-build-console"></a>

要使用 AWS CodePipeline 运行 CodeBuild 中的构建，可跳过这些步骤并按照[ CodeBuild 搭配使用 CodePipeline](how-to-create-pipeline.md)中的说明操作。

1. 从 [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建项目**。

1. 在构建项目列表中，选择构建项目。

1. 您可以使用默认的构建项目设置运行构建，也可以仅覆盖此构建的构建设置。

   1. 如果要使用默认的构建项目设置运行构建，请选择**启动构建**。构建会立即开始。

   1. 如果要覆盖默认构建项目设置，请选择**使用覆盖启动构建**。在**启动构建**页面中，您可以覆盖以下内容：
      + **构建配置**
      + **源**：
      + **环境变量覆盖**

      如果您需要选择更为高级的覆盖，请选择**高级构建覆盖**。在该页面中，您可以覆盖以下内容：
      + **构建配置**
      + **源**：
      + **环境**
      + **Buildspec**
      + **构件**
      + **日志**：

      做出覆盖选择后，选择**启动构建**。

有关此构建的详细信息，请参阅[查看构建详细信息（控制台）](view-build-details.md#view-build-details-console)。

# 运行构建 (AWS CLI)
<a name="run-build-cli"></a>

**注意**  
要使用 CodePipeline 运行 AWS CodeBuild 中的构建项目，可跳过这些步骤并按照[创建使用 CodeBuild (AWS CLI) 的管道](how-to-create-pipeline-cli.md)中的说明操作。  
有关将 AWS CLI 与 CodeBuild 结合使用的更多信息，请参阅[命令行参考](cmd-ref.md)。

1. 使用以下方法之一运行 `start-build` 命令：

   ```
   aws codebuild start-build --project-name <project-name>
   ```

   如果您要运行的构建项目使用的是最新版本的构建输入项目和构建项目现有设置，请使用此方法。

   ```
   aws codebuild start-build --generate-cli-skeleton
   ```

   如果您要运行的构建具有早期版本的构建输入项目，或者如果您要覆盖构建输出项目、环境变量、构建规范或默认构建超时期限的设置，请使用此方法。

1. 如果您运行具有 `--project-name` 选项的 **start-build** 命令，请将 *<project-name>* 替换为构建项目的名称，然后跳至此过程中的第 6 步。要获取构建项目的列表，请参阅[查看构建项目名称](view-project-list.md)。

1. 如果您运行带 `--idempotency-token` 选项的 **start-build** 命令，则 `start-build` 请求将附带区分大小写的唯一标识符或令牌。令牌在发出请求后的 5 分钟内有效。如果您重复发出带相同令牌的 `start-build` 请求，但更改了参数，则 CodeBuild 会返回“参数不匹配”错误。

1. 如果您运行具有 **start-build** 选项的 `--generate-cli-skeleton` 命令，则采用 JSON 格式的数据将出现在输出中。将数据复制到本地计算机上或安装 `start-build.json` 的实例上某位置处的文件（如 AWS CLI）中。修改所复制的数据，使其符合以下格式，然后保存结果：

   ```
   {
     "projectName": "projectName",
     "sourceVersion": "sourceVersion",
     "artifactsOverride": {
       "type": "type",
       "location": "location",
       "path": "path",
       "namespaceType": "namespaceType",
       "name": "artifactsOverride-name",
       "packaging": "packaging"
     },
     "buildspecOverride": "buildspecOverride",
     "cacheOverride": {
       "location": "cacheOverride-location",
       "type": "cacheOverride-type"
     },
     "certificateOverride": "certificateOverride",
     "computeTypeOverride": "computeTypeOverride",
     "environmentTypeOverride": "environmentTypeOverride",
     "environmentVariablesOverride": {
       "name": "environmentVariablesOverride-name",
       "value": "environmentVariablesValue",
       "type": "environmentVariablesOverride-type"
     },
     "gitCloneDepthOverride": "gitCloneDepthOverride",
     "imageOverride": "imageOverride",
     "idempotencyToken": "idempotencyToken",
     "insecureSslOverride": "insecureSslOverride",
     "privilegedModeOverride": "privilegedModeOverride",
     "queuedTimeoutInMinutesOverride": "queuedTimeoutInMinutesOverride",
     "reportBuildStatusOverride": "reportBuildStatusOverride",
     "timeoutInMinutesOverride": "timeoutInMinutesOverride",
     "sourceAuthOverride": "sourceAuthOverride",
     "sourceLocationOverride": "sourceLocationOverride",
     "serviceRoleOverride": "serviceRoleOverride",
     "sourceTypeOverride": "sourceTypeOverride"
   }
   ```

   替换以下占位符：
   + *projectName*：必需的字符串。用于此构建项目的构建项目名称。
   + *sourceVersion*：可选字符串。要构建的源代码版本，如下所示：
     + 对于 Amazon S3，与您需要构建的输入 ZIP 文件的版本相对应的版本 ID。如果未指定 *sourceVersion*，则将使用最新版本。
     + 对于 CodeCommit，与您需要构建的源代码版本相对应的提交 ID。如果未指定 *sourceVersion*，则将使用分支的 HEAD 提交 ID。（您无法指定 *sourceVersion* 标签名称，但您可以指定标签提交 ID。）
     + 对于 GitHub，为提交 ID、拉取请求 ID、分支名称或与您要构建的源代码版本相对应的标签名称。如果指定了拉取请求 ID，则必须使用格式 `pr/pull-request-ID`（例如，`pr/25`）。如果指定了分支名称，则将使用分支的 HEAD 提交 ID。如果未指定 *sourceVersion*，则将使用分支的 HEAD 提交 ID。
     + 对于 Bitbucket，为提交 ID、分支名称或与您要构建的源代码版本相对应的标签名称。如果指定了分支名称，则将使用分支的 HEAD 提交 ID。如果未指定 *sourceVersion*，则将使用分支的 HEAD 提交 ID。
   + 以下占位符适用于 `artifactsOverride`。
     + *type*：可选。构建项目中定义覆盖此构建项目的构建输出项目类型。
     + *location*：可选。构建项目中定义覆盖此构建项目的构建输出项目位置。
     + *path*：可选。构建项目中定义覆盖此构建项目的构建输出项目路径。
     + *namespaceType*：可选。构建项目中定义覆盖此构建项目的构建输出项目路径类型。
     + *name*：可选。构建项目中定义覆盖此构建项目的构建输出项目名称。
     + *packaging*：可选。构建项目中定义覆盖此构建项目的构建输出项目打包类型。
   + *buildspecOverride*：可选。构建项目中定义覆盖此构建项目的构建规范声明。如果设置了该值，则它可以是内联构建规范定义，也可以是指向相对于内置 `CODEBUILD_SRC_DIR` 环境变量的值的替代构建规范文件的路径，或者是指向 S3 存储桶的路径。S3 存储桶必须与构建项目位于同一 AWS 区域中。使用其 ARN 指定 buildspec 文件（例如，`arn:aws:s3:::<my-codebuild-sample2>/buildspec.yml`）。如果此值未提供或设置为空字符串，源代码必须在其根目录中包含 `buildspec.yml` 文件。有关更多信息，请参阅 [buildspec 文件名称和存储位置](build-spec-ref.md#build-spec-ref-name-storage)。
   + 以下占位符适用于 `cacheOverride`。
     + *cacheOverride-location*：可选。此构建的 `ProjectCache` 对象的位置，该对象将覆盖构建项目中指定的 `ProjectCache` 对象。`cacheOverride` 是可选的，它采用 `ProjectCache` 对象。`location` 在 `ProjectCache` 对象中是必需的。
     + *cacheOverride-type*：可选。此构建的 `ProjectCache` 对象的类型，该对象将覆盖构建项目中指定的 `ProjectCache` 对象。`cacheOverride` 是可选的，它采用 `ProjectCache` 对象。`type` 在 `ProjectCache` 对象中是必需的。
   + *certificateOverride*：可选。此构建的证书的名称，该证书将覆盖构建项目中指定的证书。
   + *environmentTypeOverride*：可选。此构建的容器类型，该容器类型将覆盖构建项目中指定的容器类型。当前的有效字符串为 `LINUX_CONTAINER`。
   + 以下占位符适用于 `environmentVariablesOverride`。
     + *environmentVariablesOverride-name*：可选。构建项目中的环境变量名称，其值将会覆盖此构建项目中的相应值。
     + *environmentVariablesOverride-type*：可选。构建项目中的环境变量类型，其值将会覆盖此构建项目中的相应值。
     + *environmentVariablesValue*：可选。构建项目中定义的环境变量值，其值将会覆盖此构建项目中的相应值。
   + *gitCloneDepthOverride*：可选。构建项目中 **Git 克隆深度**的值，您希望此构建项目会覆盖其值。如果您的源类型是 Amazon S3，则不支持此值。
   + *imageOverride*：可选。此构建的映像的名称，该映像将覆盖构建项目中指定的映像。
   + *idempotencyToken*：可选。一个字符串，该字符串用作令牌来指定构建请求是幂等的。您可以选择任何包含 64 个或更少字符的字符串。令牌在发出 start-build 请求后的 5 分钟内有效。如果您重复发出带相同令牌的 start-build 请求，但更改了参数，则 CodeBuild 会返回“参数不匹配”错误。
   + *insecureSslOverride*：可选的布尔值，该值指定是否覆盖构建项目中指定的不安全的 TLS 设置。不安全的 TLS 设置确定是否忽略 TLS 警告，并连接到项目源代码。此覆盖仅在构建的源为 GitHub Enterprise Server 时适用。
   + *privilegedModeOverride*：可选的布尔值。如果设置为 true，则构建将覆盖构建项目中的特权模式。
   +  *queuedTimeoutInMinutesOverride*：可选整数，用于指定在超时前允许构建排队的分钟数。最小值为 5 分钟，最大值为 480 分钟（8 个小时）。
   + *reportBuildStatusOverride*：可选布尔值，指定是否向源提供商发送构建的开始和完成状态。如果使用源提供商而非 GitHub、GitHub Enterprise Server 或 Bitbucket 设置此项，则会引发 invalidInputException。
   + *sourceAuthOverride*：可选字符串。此构建的授权类型，该授权类型将覆盖构建项目中定义的授权类型。此覆盖仅在构建项目的源为 Bitbucket 或 GitHub 时适用。
   + *sourceLocationOverride*：可选字符串。此构建的源位置，该源位置将覆盖构建项目中定义的源位置。
   + *serviceRoleOverride*：可选字符串。此构建的服务角色的名称，该角色将覆盖构建项目中指定的角色。
   + *sourceTypeOverride*：可选字符串。此构建的源输入类型，该源输入将覆盖构建项目中定义的源输入。有效字符串包括：`NO_SOURCE`、`CODECOMMIT`、`CODEPIPELINE`、`GITHUB`、`S3`、`BITBUCKET` 和 `GITHUB_ENTERPRISE`。
   + *timeoutInMinutesOverride*：可选的编号。构建项目中定义覆盖此构建项目的构建超时分钟数。

   我们建议您将具有敏感值（例如 AWS 访问密钥 ID、AWS 秘密访问密钥或密码）的环境变量作为参数存储在 Amazon EC2 Systems Manager Parameter Store 中。如果 Amazon EC2 Systems Manager Parameter Store 中存储的参数的名称以 `/CodeBuild/` 开头 (例如，`/CodeBuild/dockerLoginPassword`)，则 CodeBuild 可以使用该参数。您可以使用 CodeBuild 控制台在 Amazon EC2 Systems Manager 中创建参数。选择**创建参数**，然后按照说明操作。（在该对话框中，对于 **KMS 密钥**，您可以选择性指定您账户中的 AWS KMS 密钥的 ARN。Amazon EC2 Systems Manager 使用此密钥在存储过程中加密参数的值并在检索过程中解密参数的值。） 如果您使用 CodeBuild 控制台创建参数，控制台将在参数被存储时以 `/CodeBuild/` 作为它的开头。但是，如果您使用 Amazon EC2 Systems Manager Parameter Store 控制台创建参数，则必须使用以 `/CodeBuild/` 开头的参数名称，且必须将**类型**设置为**安全字符串**。有关更多信息，请参阅《Amazon EC2 Systems Manager 用户指南》中的 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) 和[演练：创建和测试参数（控制台）](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-console.html)。

   如果您的构建项目引用了 Amazon EC2 Systems Manager Parameter Store 中存储的参数，则构建项目的服务角色必须允许 `ssm:GetParameters` 操作。如果您之前选择了**在账户中创建新服务角色**，则 CodeBuild 将自动在您的构建项目的默认服务角色中包含此操作。但是，如果您选择了 **Choose an existing service role from your account**，则必须将此操作单独包含在您的服务角色中。

   您设置的环境变量将替换现有的环境变量。例如，如果 Docker 映像已经包含一个名为 `MY_VAR` 的环境变量（值为 `my_value`），并且您设置了一个名为 `MY_VAR` 的环境变量（值为 `other_value`），那么 `my_value` 将被替换为 `other_value`。同样，如果 Docker 映像已经包含一个名为 `PATH` 的环境变量（值为 `/usr/local/sbin:/usr/local/bin`），并且您设置了一个名为 `PATH` 的环境变量（值为 `$PATH:/usr/share/ant/bin`），那么`/usr/local/sbin:/usr/local/bin` 将被替换为文本值 `$PATH:/usr/share/ant/bin`。

   请勿使用以 `CODEBUILD_` 打头的名称设置任何环境变量。此前缀是专为内部使用预留的。

   如果具有相同名称的环境变量在多处都有定义，则将按照如下方式确定环境变量的值：
   + 构建操作调用开始时的值优先级最高。
   + 构建项目定义中的值优先级次之。
   + 构建规范文件声明中的值优先级最低。

   有关这些占位符的有效值的信息，请参阅[创建构建项目 (AWS CLI)](create-project.md#create-project-cli)。有关构建项目的最新设置列表，请参阅[查看构建项目详细信息](view-project-details.md)。

1. 切换到包含您刚才保存的文件的目录，然后再次运行 `start-build` 命令。

   ```
   aws codebuild start-build --cli-input-json file://start-build.json
   ```

1. 如果成功，与[运行构建](getting-started-overview.md#getting-started-run-build-cli) 过程中所述内容类似的数据将出现在输出中。

要了解有关此构建项目的详细信息，请记下输出中的 `id` 值，然后查看[查看构建详细信息（AWS CLI）](view-build-details.md#view-build-details-cli)。

# 运行批量构建 (AWS CLI)
<a name="run-batch-build-cli"></a>

1. 使用以下方法之一运行 `start-build-batch` 命令：

   ```
   aws codebuild start-build-batch --project-name <project-name>
   ```

   如果您要运行的构建项目使用的是最新版本的构建输入项目和构建项目现有设置，请使用此方法。

   ```
   aws codebuild start-build-batch --generate-cli-skeleton > <json-file>
   ```

   如果您要运行的构建具有早期版本的构建输入项目，或者如果您要覆盖构建输出项目、环境变量、构建规范或默认构建超时期限的设置，请使用此方法。

1. 如果您运行具有 `--project-name` 选项的 **start-build-batch** 命令，请将 *<project-name>* 替换为构建项目的名称，然后跳至此过程中的第 6 步。要获取构建项目的列表，请参阅[查看构建项目名称](view-project-list.md)。

1. 如果您运行带 `--idempotency-token` 选项的 **start-build-batch** 命令，则 `start-build-batch` 请求将附带唯一的区分大小写的标识符或令牌。令牌在发出请求后的 5 分钟内有效。如果您重复发出带相同令牌的 `start-build-batch` 请求，但更改了参数，则 CodeBuild 会返回“参数不匹配”错误。

1. 如果您运行具有 `--generate-cli-skeleton` 选项的 **start-build-batch** 命令，则会将采用 JSON 格式的数据输出到 *<json-file>* 文件。此文件与 **start-build** 命令生成的骨架类似，但增加了以下对象。有关常见对象的更多信息，请参阅[运行构建 (AWS CLI)](run-build-cli.md)。

   修改此文件以添加任何构建覆盖，并保存结果。

   ```
     "buildBatchConfigOverride": {
       "combineArtifacts": combineArtifacts,
       "restrictions": {
         "computeTypesAllowed": [
           allowedComputeTypes
         ],
         "maximumBuildsAllowed": maximumBuildsAllowed
       },
       "serviceRole": "batchServiceRole",
       "timeoutInMins": batchTimeout
     }
   ```

   `buildBatchConfigOverride` 对象采用 [ProjectBuildBatchConfig](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectBuildBatchConfig.html) 结构，其中包含该构建的批量构建配置覆盖。  
*combineArtifacts*  
指定批量构建的构建构件是否应合并到单个构件位置的布尔值。  
*allowedComputeTypes*  
一组字符串，用于指定批量构建允许的计算类型。请参阅[构建环境计算类型](https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html)以了解这些值。  
*maximumBuildsAllowed*  
指定允许的最大构建数。  
*batchServiceRole*  
为批量构建项目指定服务角色 ARN。  
*batchTimeout*  
指定必须完成批量构建的最长时间（以分钟为单位）。

1. 切换到包含您刚才保存的文件的目录，然后再次运行 `start-build-batch` 命令。

   ```
   aws codebuild start-build-batch --cli-input-json file://start-build.json
   ```

1. 如果成功，[BuildBatch](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_BuildBatch.html) 对象的 JSON 表示形式将显示在控制台输出中。有关此数据的示例，请参阅 [StartBuildBatch 响应语法](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_StartBuildBatch.html#API_StartBuildBatch_ResponseSyntax)。

# 开始自动运行构建（AWS CLI）
<a name="run-build-cli-auto-start"></a>

如果您的源代码存储在 GitHub 或 E GitHub nterprise Server 存储库中，则每当将代码更改推送到存储库时，都可以使用 GitHub webhook 来 AWS CodeBuild 重新生成源代码。

运行 **create-webhook** 命令，如下所示：

```
aws codebuild create-webhook --project-name <project-name>
```

*<project-name>*是包含要重建的源代码的生成项目的名称。

对于 GitHub，输出中会显示类似以下内容的信息：

```
{
  "webhook": {
    "url": "<url>"
  }
}
```

*<url>*是 GitHub webhook 的网址。

对于 GitHub 企业服务器，输出中会显示类似以下内容的信息：

![\[示例输出信息。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/create-webhook-ghe.png)


1. 从输出中复制私有密钥和负载 URL。你需要它们在 GitHub 企业服务器中添加 webhook。

1. 在 GitHub 企业服务器中，选择存储 CodeBuild 项目的存储库。选择**设置**，选择**挂钩和服务**，然后选择**添加 webhook**。

1. 输入负载 URL 和私有密钥，接受其他字段的默认值，然后选择**添加 webhook**。

# 停止自动运行构建（AWS CLI）
<a name="run-build-cli-auto-stop"></a>

如果您的源代码存储在 GitHub 或 E GitHub nterprise Server 存储库中，则可以将 GitHub webhook 设置为在将代码更改推送到存储库时 AWS CodeBuild 重新生成源代码。有关更多信息，请参阅 [开始自动运行构建（AWS CLI）](run-build-cli-auto-start.md)。

如果您已启用了此行为，则可以通过运行 `delete-webhook` 命令将其关闭，如下所示：

```
aws codebuild delete-webhook --project-name <project-name>
```
+ 其中，*<project-name>*是包含要重建的源代码的构建项目的名称。

如果此命令成功，则输出中不会出现任何信息和错误。

**注意**  
这只会从您的 CodeBuild 项目中删除 webhook。您还应该从您的存储库 GitHub 或 GitHub 企业服务器存储库中删除 webhook。

# 运行构建 (AWS SDKs)
<a name="run-build-sdks"></a>

 CodePipeline 要使用运行构建 AWS CodeBuild，请跳过这些步骤，[AWS CodeBuild 与一起使用 AWS CodePipeline 来测试代码和运行构建](how-to-create-pipeline.md)改为按照中的说明进行操作。

有关 CodeBuild 与一起使用的信息 AWS SDKs，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。

# 在 AWS Lambda 计算基础上运行构建
<a name="lambda"></a>

AWS Lambda compute 为您的构建提供优化的启动速度。 AWS Lambda 由于启动延迟较低，因此支持更快的构建。 AWS Lambda 还会自动缩放，因此构建无需在队列中等待运行。但是，有些用例 AWS Lambda 不支持，如果它们对您造成影响，请使用 EC2 计算。有关更多信息，请参阅 [AWS Lambda 计算的局限性](#lambda.limitations)。

**Topics**
+ [AWS Lambda上运行的精心策划的运行时环境 Docker 映像中将包含哪些工具和运行时？](#lambda.tools)
+ [如果精选映像未包括我需要的工具，该怎么办？](#lambda.custom)
+ [哪些区域支持 AWS Lambda 计算 CodeBuild？](#lambda.regions)
+ [AWS Lambda 计算的局限性](#lambda.limitations)
+ [使用 Lambda Java 部署 Lam AWS SAM b CodeBuild da 函数](sample-lambda-sam-gradle.md)
+ [使用 CodeBuild Lambda Node.js 创建单页 React 应用程序](sample-lambda-react-nodejs.md)
+ [使用 Lambda Python 更新 Lamb CodeBuild da 函数配置](sample-lambda-boto3-python.md)

## AWS Lambda上运行的精心策划的运行时环境 Docker 映像中将包含哪些工具和运行时？
<a name="lambda.tools"></a>

AWS Lambda 支持以下工具： AWS CLI v2、 AWS SAM CLI、git、go、Java、Node.js、Python、pip、Ruby 和.NET。

## 如果精选映像未包括我需要的工具，该怎么办？
<a name="lambda.custom"></a>

如果精选映像不包括您需要的工具，则可以提供包括所需工具的自定义环境 Docker 映像。

**注意**  
Lambda 不支持使用多架构容器映像的函数。有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[使用容器映像创建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-reqs)。

请注意，您需要以下 Amazon ECR 权限才能使用 Lambda 计算的自定义映像：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/image-repo"
        }
    ]
}
```

------

另请注意，要使用自定义映像，必须安装 `curl` 或 `wget`。

## 哪些区域支持 AWS Lambda 计算 CodeBuild？
<a name="lambda.regions"></a>

在中 CodeBuild，以下地区支持 AWS Lambda 计算 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）、亚太地区（孟买）、亚太地区（新加坡）、亚太地区（悉尼）、亚太地区（东京）、欧洲（法兰克福）、欧洲（爱尔兰）和南美洲（圣保罗）。有关 AWS 区域 何处 CodeBuild 可用的更多信息，请参阅[按地区划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。

## AWS Lambda 计算的局限性
<a name="lambda.limitations"></a>

有些用例 AWS Lambda 不支持，如果它们对您造成影响，请使用 EC2 计算：
+ AWS Lambda 不支持需要 root 权限的工具。对于 `yum` 或 `rpm` 之类的工具，请使用 EC2 计算类型或其他不需要 root 权限的工具。
+ AWS Lambda 不支持 Docker 的构建或运行。
+ AWS Lambda 不支持写入外部文件`/tmp`。包含的包管理器被配置为默认使用 `/tmp` 目录来下载和引用包。
+ AWS Lambda 不支持该环境类型`LINUX_GPU_CONTAINER`，Windows Server Core 2019 也不支持。
+ AWS Lambda 不支持缓存、自定义编译超时、队列超时、构建徽章、特权模式、自定义运行时环境或长度超过 15 分钟的运行时间。
+ AWS Lambda 不支持 VPC 连接、固定范围的 CodeBuild 源 IP 地址、EFS、安装证书或使用会话管理器进行 SSH 访问。

# 使用 Lambda Java 部署 Lam AWS SAM b CodeBuild da 函数
<a name="sample-lambda-sam-gradle"></a>

 AWS Serverless Application Model (AWS SAM) 是一个用于构建无服务器应用程序的开源框架。有关更多信息，请参阅上的[AWS Serverless Application Model 存储库](https://github.com/aws/serverless-application-model) GitHub。以下 Java 示例使用 Gradle 来构建和测试 AWS Lambda 函数。之后，使用 AWS SAM CLI 来部署 CloudFormation 模板和部署包。通过使用 CodeBuild Lambda，构建、测试和部署步骤均可自动处理，从而无需手动干预单个构建即可快速更新基础架构。

## 设置您的 AWS SAM 存储库
<a name="sample-lambda-sam-gradle.set-up-repo"></a>

使用 AWS SAM CLI 创建 AWS SAM `Hello World`项目。

**创建您的 AWS SAM 项目**

1. 按照《*AWS Serverless Application Model 开发者指南*》中的说明在本地计算机上[安装 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)。

1. 运行 `sam init` 并选择以下项目配置。

   ```
   Which template source would you like to use?: 1 - AWS Quick Start Templates
   Choose an AWS Quick Start application template: 1 - Hello World Example
   Use the most popular runtime and package type? (Python and zip) [y/N]: N
   Which runtime would you like to use?: 8 - java21
   What package type would you like to use?: 1 - Zip
   Which dependency manager would you like to use?: 1 - gradle
   Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N
   Would you like to enable monitoring using CloudWatch Application Insights? [y/N]: N
   Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]:  N
   Project name [sam-app]: <insert project name>
   ```

1. 将 AWS SAM 项目文件夹上传到支持的源存储库。有关支持的源类型的列表，请参阅[ProjectSource](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectSource.html)。

## 创建一个 CodeBuild Lambda Java 项目
<a name="sample-lambda-sam-gradle.create-project"></a>

创建 AWS CodeBuild Lambda Java 项目并设置构建所需的 IAM 权限。

**创建你的 CodeBuild Lambda Java 项目**

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1.  如果显示 CodeBuild 信息页面，请选择 “**创建构建项目**”。否则，请在导航窗格中，展开**构建**，选择**构建项目**，然后选择**创建构建项目**。

1. 在**项目名称**中，输入此构建项目的名称。每个 AWS 账户中的构建项目名称必须是唯一的。您还可以包含构建项目的可选描述，以帮助其他用户了解此项目的用途。

1. 在**源代码**中，选择 AWS SAM 项目所在的源存储库。

1. 在**环境**中：
   + 在**计算**中，选择 **Lambda**。
   + 在**运行时**中，选择 **Java**。
   + 对于**图片**，选择 **aws/codebuild/amazonlinux-x86\$164-lambda-** standard: corretto21。
   + 在**服务角色**中，选中**新服务角色**。记下**角色名称**。在本示例稍后更新项目的 IAM 权限时，会需要角色名称。

1. 选择 **Create build project（创建构建项目）**。

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**，然后选择与项目关联的服务角色。您可以 CodeBuild 通过选择构建项目、选择 “**编辑**”、“**环境**” 和 “**服务角色” 来找到自己的项目角色**。

1. 选择 **Trust relationships**（信任关系）选项卡，然后选择 **Edit trust policy**（编辑信任策略）。

1. 将以下内联策略附加到您的 IAM 角色。这将在以后用于部署您的 AWS SAM 基础架构。有关更多信息，请参阅《 IAM 用户指南》**中的[添加和移除 IAM 身份权限](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Action": [
                   "cloudformation:*",
                   "lambda:*",
                   "iam:*",
                   "apigateway:*",
                   "s3:*"
               ],
               "Resource": "arn:aws:iam::*:role/Service*"
           }
       ]
   }
   ```

------

## 设置项目 buildspec
<a name="sample-lambda-sam-gradle.set-up-buildspec"></a>

为了构建、测试和部署您的 Lambda 函数，请从构建规范中 CodeBuild 读取和执行构建命令。

**设置项目 buildspec**

1. 在 CodeBuild 控制台中，选择您的构建项目，然后选择 “**编辑**” 和 “**Buildspec**”。

1. 在 **Buildspec** 中，选择**插入构建命令**，然后选择**切换到编辑器**。

1. 删除预先填入的构建命令并粘贴以下 buildspec。

   ```
   version: 0.2
   env:
     variables:
       GRADLE_DIR: "HelloWorldFunction"
   phases:
     build:
       commands:
         - echo "Running unit tests..."
         - cd $GRADLE_DIR; gradle test; cd ..
         - echo "Running build..."
         - sam build --template-file template.yaml
         - echo "Running deploy..."
         - sam package --output-template-file packaged.yaml --resolve-s3 --template-file template.yaml
         - yes | sam deploy
   ```

1. 选择 **Update buildspec (更新构建规范)**。

## 部署您的 AWS SAM Lambda 基础架构
<a name="sample-lambda-sam-gradle.deploy"></a>

使用 CodeBuild Lambda 自动部署您的 Lambda 基础架构

**部署 Lambda 基础设施**

1. 选择**启动构建**。这将自动构建、测试您的 AWS SAM 应用程序并将其部署到 AWS Lambda 使用 CloudFormation。

1. 构建完成后，导航到 AWS Lambda 控制台并在 AWS SAM 项目名称下搜索您的新 Lambda 函数。

1. 在**函数**概览下面选择 **API Gateway**，然后单击 **API 端点** URL，测试您的 Lambda 函数。您应该会看到一个页面打开，其中包含以下消息：`"message": "hello world"`。

## 清除基础设施
<a name="sample-lambda-sam-gradle.clean-up"></a>

为避免对您在本教程中使用的资源收取额外费用，请删除由您的 AWS SAM 模板创建的资源，然后 CodeBuild。

**清除基础设施**

1. 导航到 CloudFormation 控制台并选择`aws-sam-cli-managed-default`。

1. 在**资源**中，清空部署存储桶 `SamCliSourceBucket`。

1. 删除 `aws-sam-cli-managed-default` 堆栈。

1. 删除与您的 AWS SAM 项目关联的 CloudFormation 堆栈。此堆栈的名称应与您的 AWS SAM 项目相同。

1. 导航到 CloudWatch 控制台并删除与您的 CodeBuild 项目关联的 CloudWatch 日志组。

1. 导航到 CodeBuild 控制台并通过选择删除**构建 CodeBuild 项目来删除您的项目**。

# 使用 CodeBuild Lambda Node.js 创建单页 React 应用程序
<a name="sample-lambda-react-nodejs"></a>

[创建 React 应用程序](https://create-react-app.dev/)是一种创建单页 React 应用程序的方法。以下 Node.js 示例使用 Node.js 通过“创建 React 应用程序”构建源构件并返回构建构件。

## 设置源存储库和构件存储桶
<a name="sample-lambda-react-nodejs.set-up-repo"></a>

使用 yarn 和“创建 React 应用程序”为项目创建源存储库。

**设置源存储库和构件存储桶**

1. 在本地计算机上运行 `yarn create react-app <app-name>` 来创建简单的 React 应用程序。

1. 将 React 应用程序项目文件夹上传到支持的源存储库。有关支持的源类型的列表，请参阅[ProjectSource](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectSource.html)。

## 创建一个 CodeBuild Lambda Node.js 项目
<a name="sample-lambda-react-nodejs.create-project"></a>

创建一个 AWS CodeBuild Lambda Node.js 项目。

**创建你的 CodeBuild Lambda Node.js 项目**

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1.  如果显示 CodeBuild 信息页面，请选择 “**创建构建项目**”。否则，请在导航窗格中，展开**构建**，选择**构建项目**，然后选择**创建构建项目**。

1. 在**项目名称**中，输入此构建项目的名称。每个 AWS 账户中的构建项目名称必须是唯一的。您还可以包含构建项目的可选描述，以帮助其他用户了解此项目的用途。

1. 在**源代码**中，选择 AWS SAM 项目所在的源存储库。

1. 在**环境**中：
   + 在**计算**中，选择 **Lambda**。
   + 在**运行时**中，选择 **Node.js**。
   + 对于**图片**，选择 **aws/codebuild/amazonlinux-x86\$164-lambda-** standard: nodejs20。

1. 在**构件**中：
   + 在**类型**中，选择 **Amazon S3**。
   + 在**存储桶名称**中，选择您之前创建的项目构件存储桶。
   + 在**构件打包**中，选择 **Zip**。

1. 选择 **Create build project（创建构建项目）**。

## 设置项目 buildspec
<a name="sample-lambda-react-nodejs.set-up-buildspec"></a>

为了构建 React 应用程序，需要从 buildspec 文件中 CodeBuild 读取和执行构建命令。

**设置项目 buildspec**

1. 在 CodeBuild 控制台中，选择您的构建项目，然后选择 “**编辑**” 和 “**Buildspec**”。

1. 在 **Buildspec** 中，选择**插入构建命令**，然后选择**切换到编辑器**。

1. 删除预先填入的构建命令并粘贴以下 buildspec。

   ```
   version: 0.2
   phases:
     build:
       commands:
         - yarn
         - yarn add --dev jest-junit @babel/plugin-proposal-private-property-in-object
         - yarn run build
         - yarn run test -- --coverage --watchAll=false --testResultsProcessor="jest-junit" --detectOpenHandles
   artifacts:
     name: "build-output"
     files:
       - "**/*"
   reports:
     test-report:
       files:
         - 'junit.xml'
       file-format: 'JUNITXML'
     coverage-report:
       files:
         - 'coverage/clover.xml'
       file-format: 'CLOVERXML'
   ```

1. 选择 **Update buildspec (更新构建规范)**。

## 构建和运行 React 应用程序
<a name="sample-lambda-react-nodejs.build"></a>

在 CodeBuild Lambda 上构建 React 应用程序，下载构建工件，然后在本地运行 React 应用程序。

**构建和运行 React 应用程序**

1. 选择**启动构建**。

1. 构建完成后，导航到您的 Amazon S3 项目构件存储桶并下载 React 应用程序构件。

1. 解压缩 React 构建构件并在项目文件夹中执行 `run npm install -g serve && serve -s build`。

1. `serve` 命令将在本地端口为静态站点提供服务，并输出到您的终端。您可以访问终端输出中 `Local:` 下面的 localhost URL，查看您的 React 应用程序。

要详细了解如何处理基于 React 的服务器的部署，请参阅[创建 React 应用程序部署](https://create-react-app.dev/docs/deployment/)。

## 清除基础设施
<a name="sample-lambda-react-nodejs.clean-up"></a>

为避免对您在本教程中使用的资源收取更多费用，请删除为您的 CodeBuild 项目创建的资源。

**清除基础设施**

1. 删除项目构件 Amazon S3 存储桶

1. 导航到 CloudWatch 控制台并删除与您的 CodeBuild 项目关联的 CloudWatch 日志组。

1. 导航到 CodeBuild 控制台并通过选择删除**构建 CodeBuild 项目来删除您的项目**。

# 使用 Lambda Python 更新 Lamb CodeBuild da 函数配置
<a name="sample-lambda-boto3-python"></a>

以下 Python 示例使用 [Boto3 和](https://aws.amazon.com/sdk-for-python/) Lambda CodeBuild Python 更新 Lambda 函数的配置。此示例可以扩展为以编程方式管理其他 AWS 资源。有关更多信息，请参阅 [Boto3 文档](https://aws.amazon.com/sdk-for-python/)。

## 先决条件
<a name="sample-lambda-boto3-python.prerequisites"></a>

在账户中创建或查找 Lambda 函数。

此示例假设您已经在账户中创建了一个 Lambda 函数，并将用于 CodeBuild 更新 Lambda 函数的环境变量。有关通过设置 Lambda 函数的更多信息 CodeBuild，请参阅[使用 Lambda Java 部署 Lam AWS SAM b CodeBuild da 函数](sample-lambda-sam-gradle.md)示例或访问。[AWS Lambda](https://aws.amazon.com/lambda/)

## 设置源存储库
<a name="sample-lambda-boto3-python.set-up-repo"></a>

创建源存储库来存储 Boto3 python 脚本。

**设置源存储库。**

1. 将以下 python 脚本复制到名为 `update_lambda_environment_variables.py` 的新文件中。

   ```
   import boto3
   from os import environ
   
   
   def update_lambda_env_variable(lambda_client):
       lambda_function_name = environ['LAMBDA_FUNC_NAME']
       lambda_env_variable = environ['LAMBDA_ENV_VARIABLE']
       lambda_env_variable_value = environ['LAMBDA_ENV_VARIABLE_VALUE']
       print("Updating lambda function " + lambda_function_name + " environment variable "
             + lambda_env_variable + " to " + lambda_env_variable_value)
       lambda_client.update_function_configuration(
           FunctionName=lambda_function_name,
           Environment={
               'Variables': {
                   lambda_env_variable: lambda_env_variable_value
               }
           },
       )
   
   
   if __name__ == "__main__":
       region = environ['AWS_REGION']
       client = boto3.client('lambda', region)
       update_lambda_env_variable(client)
   ```

1. 将 python 文件上传到支持的源存储库。有关支持的源类型的列表，请参阅[ProjectSource](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectSource.html)。

## 创建 CodeBuild Lambda Python 项目
<a name="sample-lambda-boto3-python.create-project"></a>

创建一个 CodeBuild Lambda Python 项目。

**创建你的 CodeBuild Lambda Java 项目**

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1.  如果显示 CodeBuild 信息页面，请选择 “**创建构建项目**”。否则，请在导航窗格中，展开**构建**，选择**构建项目**，然后选择**创建构建项目**。

1. 在**项目名称**中，输入此构建项目的名称。每个 AWS 账户中的构建项目名称必须是唯一的。您还可以包含构建项目的可选描述，以帮助其他用户了解此项目的用途。

1. 在**源代码**中，选择 AWS SAM 项目所在的源存储库。

1. 在**环境**中：
   + 在**计算**中，选择 **Lambda**。
   + 在**运行时**中，选择 **Python**。
   + 对于 **Image**，选择 **aws/codebuild/amazonlinux-x86\$164-lambda-** standard: python3.12。
   + 在**服务角色**中，选中**新服务角色**。记下**角色名称**。在本示例稍后更新项目的 IAM 权限时，会需要角色名称。

1. 选择 **Create build project（创建构建项目）**。

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**，然后选择与项目关联的服务角色。您可以 CodeBuild 通过选择构建项目、选择 “**编辑**”、“**环境**” 和 “**服务角色” 来找到自己的项目角色**。

1. 选择 **Trust relationships**（信任关系）选项卡，然后选择 **Edit trust policy**（编辑信任策略）。

1. 将以下内联策略附加到您的 IAM 角色。这将在以后用于部署您的 AWS SAM 基础架构。有关更多信息，请参阅《 IAM 用户指南》**中的[添加和移除 IAM 身份权限](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "UpdateLambdaPermissions",
               "Effect": "Allow",
               "Action": [
                   "lambda:UpdateFunctionConfiguration"
               ],
               "Resource": [
                   "*"
               ]
           }
       ]
   }
   ```

------

## 设置项目 buildspec
<a name="sample-lambda-boto3-python.set-up-buildspec"></a>

为了更新 Lambda 函数，脚本会从 buildspec 中读取环境变量，以便找到 Lambda 函数的名称、环境变量名称和环境变量值。

**设置项目 buildspec**

1. 在 CodeBuild 控制台中，选择您的构建项目，然后选择 “**编辑**” 和 “**Buildspec**”。

1. 在 **Buildspec** 中，选择**插入构建命令**，然后选择**切换到编辑器**。

1. 删除预先填入的构建命令并粘贴以下 buildspec。

   ```
   version: 0.2
   env:
     variables:
       LAMBDA_FUNC_NAME: "<lambda-function-name>"
       LAMBDA_ENV_VARIABLE: "FEATURE_ENABLED"
       LAMBDA_ENV_VARIABLE_VALUE: "true"
   phases:
     install:
       commands:
          - pip3 install boto3
     build:
       commands:
          - python3 update_lambda_environment_variables.py
   ```

1. 选择 **Update buildspec (更新构建规范)**。

## 更新 Lambda 配置
<a name="sample-lambda-boto3-python.update"></a>

使用 CodeBuild Lambda Python 自动更新您的 Lambda 函数的配置。

**更新 Lambda 函数的配置**

1. 选择**启动构建**。

1. 构建完成后，导航到您的 Lambda 函数。

1. 选择**配置**，然后选择**环境变量**。您应该会看到一个具有键 `FEATURE_ENABLED` 和值 `true` 的新环境变量。

## 清除基础设施
<a name="sample-lambda-boto3-python.clean-up"></a>

为避免对您在本教程中使用的资源收取更多费用，请删除为您的 CodeBuild 项目创建的资源。

**清除基础设施**

1. 导航到 CloudWatch 控制台并删除与您的 CodeBuild 项目关联的 CloudWatch 日志组。

1. 导航到 CodeBuild 控制台并通过选择删除**构建 CodeBuild 项目来删除您的项目**。

1. 如果您为此示例创建了 Lambda 函数，请选择**操作**和**删除函数**来清理您的 Lambda 函数。

## 扩展程序
<a name="sample-lambda-boto3-python.extensions"></a>

如果您想扩展此示例以使用 AWS CodeBuild Lambda Python 管理其他 AWS 资源，请执行以下操作：
+ 使用 Boto3 更新 Python 脚本来修改新资源。
+ 更新与您的 CodeBuild 项目关联的 IAM 角色以拥有新资源的权限。
+ 将与新资源关联的所有新环境变量添加到 buildspec 中。

# 在预留容量实例集上运行构建
<a name="fleets"></a>

CodeBuild 提供以下计算队列：
+ 按需车队
+ 预留容量实例集

使用按需队列，为您的构建 CodeBuild 提供计算。构建完成后，计算机就会被销毁。按需实例集是完全托管式的，并包括自动扩展功能以应对需求激增。

**注意**  
按需实例集不支持 macOS。

CodeBuild 还提供预留容量队列，其中包含由 Amazon EC2 提供支持并由维护的 CodeBuild实例。使用预留容量实例集，您可以为构建环境配置一组专用实例。这些计算机保持闲置状态，可以立即处理生成或测试，并缩短构建持续时间。使用预留容量实例集，您的计算机将始终处于运行状态，并且只要预调配完毕，它们就会继续产生成本。

**重要**  
无论您运行实例多长时间，预留容量实例集的每个实例都会产生初始费用，之后可能会有额外的相关费用。有关更多信息，请参阅 [https://aws.amazon.com/codebuild/pricing/](https://aws.amazon.com/codebuild/pricing/)。

**Topics**
+ [创建预留容量实例集](#fleets.how-to)
+ [最佳实践](#fleets.best-practices)
+ [我能否在多个 CodeBuild 项目之间共享预留容量队列？](#fleets.share)
+ [基于属性的计算是如何工作的？](#fleets.attribute-compute)
+ [我能否为我的实例集手动指定 Amazon EC2 实例？](#fleets.manual-input-compute)
+ [哪些区域支持预留容量实例集？](#fleets.regions)
+ [如何配置 macOS 预留容量实例集？](#fleets.configure-macos)
+ [如何为预留容量实例集配置自定义亚马逊机器映像（AMI）？](#fleets.custom-ami)
+ [预留容量实例集的局限性](#fleets.limitations)
+ [预留容量实例集属性](fleets.reserved-capacity-fleets.md)
+ [预留容量样品包含 AWS CodeBuild](reserved-capacity-samples.md)

## 创建预留容量实例集
<a name="fleets.how-to"></a>

按照以下说明创建预留容量实例集。

**创建预留容量实例集**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /hom AWS CodeBuild e 中打开控制台。

1. 在导航窗格中，选择**计算实例集**，然后选择**创建实例集**。

1. 在**计算实例集名称**文本字段中，输入实例集的名称。

1. 从**操作系统**下拉菜单中，选择操作系统。

1. 从**架构**下拉菜单中，选择架构。

1. （可选）选择**使用实例运行模式 - 可选**，以便直接在 Amazon EC2 实例而不是 Docker 容器上运行。然后选择**主要版本**和**次要版本**。

1. （可选）在**其他配置**中，执行以下操作：
   + 选择**配置 VPC - 可选**以将实例集连接到 VPC，以便在使用期间访问私有资源。
     + 从 **VPC** 下拉菜单中，选择您的 CodeBuild 队列将访问的 VPC。
     + 从**子网**下拉菜单中，选择 CodeBuild 应用于设置 VPC 配置的子网。
     + 从**安全组**下拉菜单中，选择 CodeBuild 应用于与您的 VPC 配合使用的安全组。
     + 在**实例集服务角色**字段中，选择已有服务角色。
**注意**  
确保实例集角色具有必要的权限。有关更多信息，请参阅 [允许用户为实例集服务角色添加权限策略](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-permission-policy-fleet-service-role)。
     + 如果您选择了 Amazon Linux 操作系统，请选择**定义代理配置 - 可选**，以便对您的预留容量实例应用网络访问控制。
     + 对于**默认行为**，选择在默认情况下是允许还是拒绝发往所有目标的传出流量。
     + 对于**代理规则**，选择**添加代理规则**以指定目标域或 IPs 允许或拒绝网络访问控制。
   + 选择**配置自定义 AMI - 可选**，以使用自定义亚马逊机器映像（AMI）。
     + 从 **AMI** 下拉菜单中，为您的实例集选择亚马逊机器映像（AMI）。
     + 在**实例集服务角色**字段中，选择已有服务角色。
**注意**  
确保实例集角色具有必要的权限。有关更多信息，请参阅 [允许用户为实例集服务角色添加权限策略](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-permission-policy-fleet-service-role)。

1. 在**容量配置**中，从**计算选择模式**中选择以下选项之一：
   + 如果您选择**引导式选择**，请执行以下操作：
     + 对于**计算**，请选择此实例集中包含的实例类型。
     + 在**容量**文本字段中，输入实例集中的最少实例数。
     + （可选）在**其他配置**中，执行以下操作：
       + 选择**配置扩展 - 可选**，以根据此配置自动扩展您的实例集。从**扩展模式 - 可选**下拉菜单中，选择在需求超过实例集容量时的行为。
   + 如果选择**自定义实例**，请执行以下操作：
     + 从**计算实例类型**下拉菜单中，选择此实例集中包含的实例类型。
     + 在**其他 EBS 卷大小 - 可选**文本字段中，输入提供的 64 GB 磁盘空间之外的额外容量。
     + 在**容量**文本字段中，输入实例集中的最少实例数。
     + （可选）在**其他配置**中，执行以下操作：
       + 选择**配置扩展 - 可选**，以根据此配置自动扩展您的实例集。从**扩展模式 - 可选**下拉菜单中，选择在需求超过实例集容量时的行为。

1. 选择**创建计算实例集**。

1. 创建计算队列后，创建一个新 CodeBuild 项目或编辑现有项目。从**环境**中，选择**预置模型**下的**预留容量**，然后在**实例集名称**下选择指定的实例集。

## 最佳实践
<a name="fleets.best-practices"></a>

使用预留容量实例集时，我们建议您遵循以下这些最佳实践。
+ 我们建议使用源代码缓存模式，通过缓存源代码来帮助提高构建性能。
+ 我们建议使用 Docker 层缓存，通过缓存现有 Docker 层来帮助提高构建性能。

## 我能否在多个 CodeBuild 项目之间共享预留容量队列？
<a name="fleets.share"></a>

可以，您可以通过在多个项目中使用实例集的容量来最大限度地提高其利用率。

**重要**  
使用预留容量特征时，同一账户内的其他项目可以访问实例集实例中缓存的数据，包括源文件、Docker 层和 buildspec 中指定的缓存目录。这是设计使然，让同一账户内的项目可以共享实例集实例。

## 基于属性的计算是如何工作的？
<a name="fleets.attribute-compute"></a>

如果您选择 `ATTRIBUTE_BASED_COMPUTE` 作为实例集的 `computeType`，则可以在名为 `computeConfiguration` 的新字段中指定属性。这些属性包括 v CPUs、内存、磁盘空间和`machineType`。此 `machineType` 为 `GENERAL` 或 `NVME`。指定一个或一些可用属性后， CodeBuild 将从支持的可用实例类型中选择一种计算类型作为最终版本`computeConfiguration`。

**注意**  
CodeBuild 将选择符合所有输入要求的最便宜的实例。所选实例的内存CPUs、v 和磁盘空间都将大于或等于输入要求。您可以在已创建或更新的实例集中检查已解析的 `computeConfiguration`。

如果您输入`computeConfiguration`的 a 无法满足 CodeBuild，则会收到验证异常。另请注意，如果 `computeConfiguration` 不适用于按需情况，则按需实例集溢出行为将被覆盖为队列行为。

## 我能否为我的实例集手动指定 Amazon EC2 实例？
<a name="fleets.manual-input-compute"></a>

可以，您可以通过选择**自定义实例**或配置 API 参数 `InstanceType`，直接在控制台中输入所需的 Amazon EC2 实例。此字段用于以下用途 APIs： CreateFleet UpdateFleet、 CreateProject、 UpdateProject 和 StartBuild。有关更多信息，请参阅 [Compute instance type](fleets.reserved-capacity-fleets.md#compute)。

## 哪些区域支持预留容量实例集？
<a name="fleets.regions"></a>

以下地区支持预留容量 Amazon Linux 和 Windows 队列 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）、亚太地区（孟买）、亚太地区（新加坡）、亚太地区（悉尼）、亚太地区（东京）、欧洲（法兰克福）、欧洲（爱尔兰）和南美洲（圣保罗）。有关 AWS 区域 何处 CodeBuild 可用的更多信息，请参阅[按地区划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。

以下地区支持预留容量 macOS 中型舰队 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）、亚太地区（悉尼）和欧洲（法兰克福）。预留容量 macOS 以下地区支持大型机群 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）和亚太地区（悉尼）。

## 如何配置 macOS 预留容量实例集？
<a name="fleets.configure-macos"></a>

**配置 macOS 预留容量实例集**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /hom AWS CodeBuild e 中打开控制台。

1. 在导航窗格中，选择**计算实例集**，然后选择**创建实例集**。

1. 在**计算实例集名称**文本字段中，输入实例集的名称。

1. 在**操作系统**下拉菜单中，选择 **macOS**。

1. 在 “**计算**” 字段中，选择以下计算机类型之一：**Apple M2、24 GB 内存、8 v CPUs** 或 **Apple M2、32 GB 内存、12 v CPUs**。

1. 在**容量**文本字段中，输入实例集中的最少实例数。

1. （可选）要为实例集使用自定义映像，请参阅[如何为预留容量实例集配置自定义亚马逊机器映像（AMI）？](#fleets.custom-ami)，以确保您的亚马逊机器映像（AMI）满足所需的先决条件。

1. （可选）要使用您的实例集配置 VPC，请在**其他配置**中执行以下操作：
   + 从 **VPC-可选**下拉菜单中，选择您的 CodeBuild 队列将访问的 VPC。
   + 从**子网**下拉菜单中，选择 CodeBuild 应用于设置 VPC 配置的子网。
   + 从**安全组**下拉菜单中，选择 CodeBuild 应用于与您的 VPC 配合使用的安全组。
   + 在**实例集服务角色**字段中，选择已有服务角色。
**注意**  
确保实例集角色具有必要的权限。有关更多信息，请参阅 [允许用户为实例集服务角色添加权限策略](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-permission-policy-fleet-service-role)。

1. 选择**创建计算实例集**并等待实例集实例启动。启动后，容量将在`n/n`，提供的容量在*n*哪里。

1. 计算队列启动后，创建一个新 CodeBuild 项目或编辑现有项目。从**环境**中，选择**预置模型**下的**预留容量**，然后在**实例集名称**下选择指定的实例集。

## 如何为预留容量实例集配置自定义亚马逊机器映像（AMI）？
<a name="fleets.custom-ami"></a>

**为预留容量实例集配置自定义亚马逊机器映像（AMI）**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /hom AWS CodeBuild e 中打开控制台。

1. 在导航窗格中，选择**计算实例集**，然后选择**创建实例集**。

1. 在**计算实例集名称**文本字段中，输入实例集的名称。

1. 为实例集选择**自定义映像**，并确保您的亚马逊机器映像（AMI）满足以下先决条件：
   + 如果环境类型为 `MAC_ARM`，请确保 AMI **架构**为 64 位 `Mac-Arm`。
   + 如果环境类型为 `LINUX_EC2`，请确保 AMI **架构**为 64 位 `x86`。
   + 如果环境类型为 `ARM_EC2`，请确保 AMI **架构**为 64 位 `Arm`。
   + 如果环境类型为 `WINDOWS_EC2`，请确保 AMI **架构**为 64 位 `x86`。
   + AMI 允许 CodeBuild 服务**组织 ARN**。有关组织的列表 ARNs，请参阅[Amazon Machine Images (AMI)](fleets.reserved-capacity-fleets.md#ami)。
   + 如果 AMI 使用 AWS KMS 密钥加密，则该 AWS KMS 密钥还必须允许 CodeBuild 服务**组织 ID**。有关组织的列表 IDs，请参阅[Amazon Machine Images (AMI)](fleets.reserved-capacity-fleets.md#ami)。有关 AWS KMS 密钥的更多信息，请参阅 *Amazon EC2 用户指南*中的[允许组织和 OUs 使用 KMS 密钥](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/share-amis-with-organizations-and-OUs.html#allow-org-ou-to-use-key)。要向 CodeBuild 组织授予使用 KMS 密钥的权限，请在密钥策略中添加以下语句：

     ```
     {
         "Sid": "Allow access for organization root",
         "Effect": "Allow",
         "Principal": "*",
         "Action": [
             "kms:Describe*",
             "kms:List*",
             "kms:Get*",
             "kms:Encrypt",
             "kms:Decrypt",
             "kms:ReEncrypt*",
             "kms:GenerateDataKey*",
             "kms:CreateGrant"
         ],
         "Resource": "*",
         "Condition": {
             "StringEquals": {
                 "aws:PrincipalOrgID": "o-123example"
             }
         }
     }
     ```
   + 在**实例集服务角色**字段中，授予以下 Amazon EC2 权限：

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                    "ec2:DescribeImages",
                    "ec2:DescribeSnapshots"
                 ],
                 "Resource": "*"
             }
         ]
     }
     ```

------

## 预留容量实例集的局限性
<a name="fleets.limitations"></a>

在预留容量实例集不支持的某些用例中，如果它们对您产生影响，请改用按需实例集：
+ 预留容量实例集不支持构建利用率指标。
+ macOS 预留容量实例集不支持调试会话。

有关限制和限额的更多信息，请参阅[计算实例集](limits.md#fleet-limits)。

# 预留容量实例集属性
<a name="fleets.reserved-capacity-fleets"></a>

预留容量实例集包含以下属性。有关预留容量实例集的更多信息，请参阅[在预留容量实例集上运行构建](fleets.md)。

**操作系统**  
操作系统 以下操作系统可用：  
+ Amazon Linux
+ macOS
+ Windows Server 2019
+ Windows Server 2022

**架构**  
处理器架构。以下架构可用：  
+ x86\$164
+ Arm64

**环境类型**  
选择 **Amazon Linux** 时可用的环境类型。以下环境类型可用：  
+ Linux EC2
+ Linux GPU

**计算实例类型**  
实例集实例的计算配置。    
**引导式选择**  
通过选择 vCPU、内存和磁盘空间设置来指定不同的计算类型。有关按区域划分的计算类型可用性的信息，请参阅[关于预留容量环境类型](build-env-ref-compute-types.md#environment-reserved-capacity.types)。  
**自定义实例**  
手动指定所需的实例类型。

**Capacity**  
分配给实例集的计算机的初始数量，它定义了可以并行运行的构建数量。

**溢出行为**  
定义构建数量超过实例集容量时的行为。    
**按需**  
溢出版本按 CodeBuild 需运行。  
如果您在创建与 VPC 连接的实例集时选择将溢出行为设置为按需，请务必向项目服务角色添加所需的 VPC 权限。有关更多信息，请参阅[允许 CodeBuild 访问创建 VPC 网络接口所需的 AWS 服务的策略声明示例](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-create-vpc-network-interface)。
如果您选择将溢出行为设置为按需，请注意，溢出构建将单独计费，类似于按需型 Amazon EC2。有关更多信息，请参阅 [https://aws.amazon.com/codebuild/pricing/](https://aws.amazon.com/codebuild/pricing/)。  
**队列**  
构建运行将放在队列中，直到有计算机可用。这限制了额外成本，因为没有分配额外的计算机。

**亚马逊机器映像（AMI）**  
实例集的亚马逊机器映像（AMI）属性。支持以下属性 CodeBuild：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/fleets.reserved-capacity-fleets.html)

**其他配置**    
**VPC - 可选**  
您的 CodeBuild 队列将访问的 VPC。有关更多信息，请参阅 [AWS CodeBuild 与亚马逊 Virtual Private Cloud 一起使用](vpc-support.md)。  
如果在调用 StartBuild API 时指定了队列覆盖，则 CodeBuild 将忽略项目 VPC 配置。  
**子网**  
 CodeBuild 用于设置 VPC 配置的 VPC 子网。请注意，预留容量实例集仅支持单个可用区中的一个子网。此外，确保您的子网包括 NAT 网关。  
**安全组**  
与您的 VPC 一起 CodeBuild 使用的 VPC 安全组。确保您的安全组允许出站连接。  
**实例集服务角色**  
根据您账户中的现有服务角色为您的实例集定义服务角色。  
**定义代理配置 - 可选**  
对预留容量实例应用网络访问控制的代理配置。有关更多信息，请参阅 [AWS CodeBuild 与托管代理服务器一起使用](run-codebuild-in-managed-proxy-server.md)。  
代理配置不支持 VPC、Windows 或 macOS。  
**默认行为**  
定义传出流量的行为。    
**允许**  
默认情况下，允许流向所有目标的传出流量。  
**拒绝**  
默认情况下，拒绝流向所有目标的传出流量。  
**代理规则**  
指定目标域或 IPs 允许或拒绝网络访问控制。

# 预留容量样品包含 AWS CodeBuild
<a name="reserved-capacity-samples"></a>

这些样本可用于在预留容量舰队中 CodeBuild进行实验。

**Topics**
+ [使用预留容量进行缓存示例](#reserved-capacity-samples.caching)

## 使用预留容量进行缓存示例
<a name="reserved-capacity-samples.caching"></a>

缓存可以存储构建环境的可重用部分，并在多个构建中使用它们。此示例演示了如何使用预留容量在构建项目中启用缓存。有关更多信息，请参阅 [缓存构建以提高性能](build-caching.md)。

您可以先在项目设置中指定一种或多种缓存模式：

```
Cache:
        Type: LOCAL
        Modes:
          - LOCAL_CUSTOM_CACHE
          - LOCAL_DOCKER_LAYER_CACHE
          - LOCAL_SOURCE_CACHE
```

**注意**  
要使用 Docker 层缓存，请务必启用特权模式。

您的项目构建规范设置应如下所示：

```
version: 0.2
      phases:
        build:
          commands:
            - echo testing local source cache
            - touch /codebuild/cache/workspace/foobar.txt
            - git checkout -b cached_branch
            - echo testing local docker layer cache
            - docker run alpine:3.14 2>&1 | grep 'Pulling from' || exit 1
            - echo testing local custom cache
            - touch foo
            - mkdir bar && ln -s foo bar/foo2
            - mkdir bar/bar && touch bar/bar/foo3 && touch bar/bar/foo4
            - "[ -f foo ] || exit 1"
            - "[ -L bar/foo2 ] || exit 1"
            - "[ -f bar/bar/foo3 ] || exit 1"
            - "[ -f bar/bar/foo4 ] || exit 1"
      cache:
        paths:
           - './foo'
           - './bar/**/*'
           - './bar/bar/foo3'
```

您可以先用新项目运行构建，为缓存做种子。完成后，您应该使用重写的构建规范开始另一个构建，如下所示：

```
version: 0.2
      phases:
        build:
          commands:
            - echo testing local source cache
            - git branch | if grep 'cached_branch'; then (exit 0); else (exit 1); fi
            - ls /codebuild/cache/workspace | if grep 'foobar.txt'; then (exit 0); else (exit 1); fi
            - echo testing local docker layer cache
            - docker run alpine:3.14 2>&1 | if grep 'Pulling from'; then (exit 1); else (exit 0); fi
            - echo testing local custom cache
            - "[ -f foo ] || exit 1"
            - "[ -L bar/foo2 ] || exit 1"
            - "[ -f bar/bar/foo3 ] || exit 1"
            - "[ -f bar/bar/foo4 ] || exit 1"
      cache:
        paths:
           - './foo'
           - './bar/**/*'
           - './bar/bar/foo3'
```

# 批量运行构建
<a name="batch-build"></a>

您可以使用使用批量生成 AWS CodeBuild 来运行项目的并行和协调生成。

**Topics**
+ [安全角色](#batch_security_role)
+ [批量构建类型](#batch_build_types)
+ [批量报告模式](#batch-report-mode)
+ [更多信息](#batch_more_info)

## 安全角色
<a name="batch_security_role"></a>

批量构建为批量配置引入了全新的安全角色。这个新角色是必需的，因为 CodeBuild 必须能够代表你调用`StartBuild``StopBuild`、和`RetryBuild`操作才能将生成作为批处理的一部分运行。客户应该使用新角色，而不是他们在构建中使用的角色，原因有两个：
+ 向构建角色授予 `StartBuild`、`StopBuild` 和 `RetryBuild` 权限后，将允许单个构建通过 buildspec 启动多个构建。
+ CodeBuild 批处理生成提供了限制，限制了可用于批次构建的生成数量和计算类型。如果构建角色拥有这些权限，则构建本身就有可能绕过这些限制。

## 批量构建类型
<a name="batch_build_types"></a>

CodeBuild 支持以下批量构建类型：

**Topics**
+ [构建图](#batch_build_graph)
+ [构建列表](#batch_build_list)
+ [构建矩阵](#batch_build_matrix)
+ [构建扇出](#batch_build_fanout)

### 构建图
<a name="batch_build_graph"></a>

构建图定义了一组任务，这些任务依赖于批量处理中的其他任务。

以下示例定义了构建图，展示如何创建依赖项链。

```
batch:
  fast-fail: false
  build-graph:
    - identifier: build1
      env:
        variables:
          BUILD_ID: build1
      ignore-failure: false
    - identifier: build2
      buildspec: build2.yml
      env:
        variables:
          BUILD_ID: build2
      depend-on:
        - build1
    - identifier: build3
      env:
        variables:
          BUILD_ID: build3
      depend-on:
        - build2
    - identifier: build4
      env:
        compute-type: ARM_LAMBDA_1GB
    - identifier: build5
      env:
        fleet: fleet_name
```

在本示例中：
+ 先运行 `build1`，因为它没有依赖项。
+ 由于 `build2` 对 `build1` 存在依赖关系，因此 `build2` 会在完成 `build1` 后运行。
+ 由于 `build3` 对 `build2` 存在依赖关系，因此 `build3` 会在完成 `build2` 后运行。

有关构建图 buildspec 语法的更多信息，请参阅[`batch/build-graph`](batch-build-buildspec.md#build-spec.batch.build-graph)。

### 构建列表
<a name="batch_build_list"></a>

构建列表定义了多个并行运行的任务。

以下示例定义了构建列表。`build1` 和 `build2` 构建将并行运行。

```
batch:
  fast-fail: false
  build-list:
    - identifier: build1
      env:
        variables:
          BUILD_ID: build1
      ignore-failure: false
    - identifier: build2
      buildspec: build2.yml
      env:
        variables:
          BUILD_ID: build2
      ignore-failure: true
    - identifier: build3
      env:
        compute-type: ARM_LAMBDA_1GB
    - identifier: build4
      env:
        fleet: fleet_name
    - identifier: build5
      env:
        compute-type: GENERAL_LINUX_XLAGRE
```

有关构建列表 buildspec 语法的更多信息，请参阅[`batch/build-list`](batch-build-buildspec.md#build-spec.batch.build-list)。

### 构建矩阵
<a name="batch_build_matrix"></a>

生成矩阵定义了并行运行的具有不同配置的任务。 CodeBuild 为每种可能的配置组合创建单独的版本。

以下示例显示了一个具有两个 buildspec 文件和三个环境变量值的构建矩阵。

```
batch:
  build-matrix:
    static:
      ignore-failure: false
    dynamic:
      buildspec: 
        - matrix1.yml
        - matrix2.yml
      env:
        variables:
          MY_VAR:
            - VALUE1
            - VALUE2
            - VALUE3
```

在此示例中， CodeBuild 创建了六个版本：
+ `matrix1.yml` 与 `$MY_VAR=VALUE1`
+ `matrix1.yml` 与 `$MY_VAR=VALUE2`
+ `matrix1.yml` 与 `$MY_VAR=VALUE3`
+ `matrix2.yml` 与 `$MY_VAR=VALUE1`
+ `matrix2.yml` 与 `$MY_VAR=VALUE2`
+ `matrix2.yml` 与 `$MY_VAR=VALUE3`

每个构建都将具有以下设置：
+ `ignore-failure` 设置为 `false`
+ `env/type` 设置为 `LINUX_CONTAINER`
+ `env/image` 设置为 `aws/codebuild/amazonlinux-x86_64-standard:4.0`
+ `env/privileged-mode` 设置为 `true`

这些构建并行运行。

有关构建矩阵 buildspec 语法的更多信息，请参阅[`batch/build-matrix`](batch-build-buildspec.md#build-spec.batch.build-matrix)。

### 构建扇出
<a name="batch_build_fanout"></a>

构建扇出定义的任务将在批量中拆分为多个构建。这可以用于并行运行测试。 CodeBuild 根据`parallelism`字段中设置的值，为每个测试用例分片创建单独的构建。

以下示例定义了一个构建扇出，用于创建五个并行运行的构建。

```
version: 0.2

batch:
   fast-fail: false 
   build-fanout:
     parallelism: 5
     ignore-failure: false

phases:
  install:
    commands:
      - npm install
   build:
    commands:
      - mkdir -p test-results
      - cd test-results
      - |
        codebuild-tests-run \
         --test-command 'npx jest --runInBand --coverage' \
         --files-search "codebuild-glob-search '**/test/**/*.test.js'" \
         --sharding-strategy 'equal-distribution'
```

在此示例中，假设有 100 个测试需要运行，则 CodeBuild 创建五个版本，每个版本并行运行 20 个测试。

有关构建图 buildspec 语法的更多信息，请参阅[`batch/build-fanout`](batch-build-buildspec.md#build-spec.batch.build-fanout)。

## 批量报告模式
<a name="batch-report-mode"></a>

如果您的项目的源提供商是 Bitbucket GitHub、或 E GitHub nterprise，并且您的项目配置为向源提供商报告构建状态，则可以选择如何将批量生成状态发送给源提供商。您可以选择将状态作为批处理的单个汇总状态报告发送，也可以单独报告批处理中每个构建的状态。

有关更多信息，请参阅以下主题：
+ [批量配置（创建）](create-project.md#create-project-console-batch-config)
+ [批量配置（更新）](change-project.md#change-project-console-batch-config)

## 更多信息
<a name="batch_more_info"></a>

有关更多信息，请参阅以下主题：
+ [批量构建 buildspec 参考](batch-build-buildspec.md)
+ [批量配置](create-project.md#create-project-console-batch-config)
+ [运行批量构建 (AWS CLI)](run-batch-build-cli.md)
+ [在 AWS CodeBuild 中停止批量构建](stop-batch-build.md)

# 在批量构建中执行并行测试
<a name="parallel-test"></a>

您可以使用 AWS CodeBuild 在批量生成中执行 parallel 测试。并行测试执行是一种测试方法，其中多个测试用例在不同的环境、计算机或浏览器上同时运行，而不是按顺序执行。这种方法可以显著缩短总体测试执行时间并提高测试效率。在中 CodeBuild，您可以将测试拆分到多个环境中并行运行。

并行测试执行的主要优势包括：

1. **缩短执行时间**：按顺序需要数小时的测试可以在几分钟内完成。

1. **提高资源利用率**：高效地利用可用的计算资源。

1. **更早的反馈**：更快地完成测试意味着可以更快地向开发人员提供反馈。

1. **经济实惠**：从长远来看，可以节省时间和计算成本。

在实施并行测试执行时，通常会考虑两种主要方法：独立环境和多线程。虽然这两种方法都旨在实现并发测试执行，但它们在实施和有效性方面存在显著差异。独立环境会创建隔离的实例，其中每个测试套件独立运行，而多线程使用不同的线程在同一个进程空间内同时执行多个测试。

与多线程相比，独立环境的主要优势包括：

1. **隔离**：每个测试都在完全隔离的环境中运行，以防止测试之间的干扰。

1. **资源冲突**：不存在多线程中经常发生的共享资源竞争。

1. **稳定性**：不太容易出现争用条件和同步问题。

1. **更易于调试**：当测试失败时，由于每个环境都是独立的，因此更容易确定原因。

1. **状态管理**：轻松管理困扰多线程测试的共享状态问题。

1. **更好的可扩展性**：可以轻松地添加更多环境，而不会增加复杂性。

**Topics**
+ [Support in AWS CodeBuild](#parallel-test-support)
+ [在批量构建中启用并行测试执行](parallel-test-enable.md)
+ [使用 `codebuild-tests-run` CLI 命令](parallel-test-tests-run.md)
+ [使用 `codebuild-glob-search` CLI 命令](parallel-test-glob-search.md)
+ [关于测试拆分](parallel-test-splitting.md)
+ [自动合并各个构建报告](parallel-test-auto-merge.md)
+ [各种测试框架的并行测试执行示例](sample-parallel-test.md)

## Support in AWS CodeBuild
<a name="parallel-test-support"></a>

AWS CodeBuild 通过其批处理构建功能为并行测试执行提供强大的支持，该功能专为利用单独的环境执行而设计。这种实施与隔离测试环境的优点完美吻合。

**使用测试分配进行批量构建**  
CodeBuild的批量生成功能允许创建多个同时运行的构建环境。每个环境都作为一个完全独立的单元运行，有自己的计算资源、运行时环境和依赖项。通过批量构建配置，您可以指定它们需要多少个并行环境，以及如何在这些环境间分配测试。

**测试分片 CLI**  
CodeBuild 通过其 CLI 工具包括内置的测试分发机制`codebuild-tests-run`，该机制可自动将测试划分到不同的环境中。

**报告聚合**  
的实现的主要优势之一 CodeBuild是它能够无缝处理测试结果聚合。当测试在不同的环境中执行时， CodeBuild 会自动收集来自每个环境的测试报告，并将其合并成批构建级别的统一测试报告。这种整合提供了测试结果的全面视图，同时保持了并行执行的效率优势。

下图解释了 AWS CodeBuild中并行测试执行的完整概念。

![\[并行测试执行的概念图。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/parallel-test.png)


# 在批量构建中启用并行测试执行
<a name="parallel-test-enable"></a>

要并行运行测试，请更新批量构建 buildspec 文件，以包含构建扇出字段和要在 `parallelism` 字段中拆分测试套件的并行构建的数量，如下所示。`parallelism` 字段指定设置多少个独立的执行程序来执行测试套件。

要在多个并行执行环境中运行测试，请将 `parallelism` 字段设置为大于零的值。在下面的示例中，设置`parallelism`为 5，表示 CodeBuild 启动五个相同的构建，并行执行测试套件的一部分。

您可以使用 [codebuild-tests-run](parallel-test-tests-run.md)CLI 命令拆分并运行测试。测试文件将被拆分，并且将在每个构建中运行测试的一部分。这减少了运行完整测试套件所花的总时间。在以下示例中，测试将分成五个部分，并根据测试的名称计算拆分点。

```
version: 0.2

batch:
  fast-fail: false 
  build-fanout:
    parallelism: 5
    ignore-failure: false
    
phases:
  install:
    commands:
      - npm install jest-junit --save-dev
  pre_build:
    commands:
      - echo 'prebuild'
  build:
    commands:
      - |
        codebuild-tests-run \
         --test-command 'npx jest --runInBand --coverage' \
         --files-search "codebuild-glob-search '**/_tests_/**/*.test.js'" \
         --sharding-strategy 'equal-distribution'

  post_build:
    commands:
      - codebuild-glob-search '**/*.xml'  
      - echo "Running post-build steps..."
      - echo "Build completed on `date`"

reports:
  test-reports:
    files:
      - '**/junit.xml'               
    base-directory: .
    discard-paths: yes           
    file-format: JUNITXML
```

如果为 build-fanout 版本配置了报告，则会分别为每个版本生成测试报告，可以在控制台中相应版本的 “**报告**” 选项卡下查看这些报告。 AWS CodeBuild 

有关如何批量执行并行测试的更多信息，请参阅[各种测试框架的并行测试执行示例](sample-parallel-test.md)。

# 使用 `codebuild-tests-run` CLI 命令
<a name="parallel-test-tests-run"></a>

AWS CodeBuild 提供将测试命令和测试文件位置作为输入的 CLI。带有这些输入的 CLI 会根据测试文件名称将测试拆分为在 `parallelism` 字段中指定的分片数量。将测试文件分配给分片由分片策略决定。

```
codebuild-tests-run \
    --files-search "codebuild-glob-search '**/__tests__/*.js'" \
    --test-command 'npx jest --runInBand --coverage' \
    --sharding-strategy 'equal-distribution'
```

下表说明了 `codebuild-tests-run` CLI 命令的字段。


| 字段名称 | Type | 必需或可选 | 定义 | 
| --- | --- | --- | --- | 
|  `test-command`  |  字符串  |  必需  |  此命令用于运行测试。  | 
|  `files-search`  |  字符串  |  必需  |  此命令给出了测试文件列表。您可以使用 AWS CodeBuild 提供的 [codebuild-glob-search](parallel-test-glob-search.md)CLI 命令或您选择的任何其他文件搜索工具。  确保 `files-search` 命令输出文件名，每个文件名用换行分隔。   | 
|  `sharding-strategy`  |  枚举  |  可选  |  有效值：`equal-distribution`（默认值）、`stability` [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/parallel-test-tests-run.html) 有关更多信息，请参阅 [关于测试拆分](parallel-test-splitting.md)。  | 

`codebuild-tests-run` CLI 首先使用 `files-search` 参数中提供的命令识别测试文件列表。然后，它使用指定的分片策略确定为当前分片（环境）指定的测试文件子集。最后，测试文件的这一子集格式化为以空格分隔的列表，并在执行之前附加到在 `test-command` 参数中提供的命令的末尾。

对于不接受空格分隔列表的测试框架，`codebuild-tests-run` CLI 通过 `CODEBUILD_CURRENT_SHARD_FILES` 环境变量提供了一种灵活的替代方案。此变量包含为当前构建分片指定的测试文件路径的换行分隔列表。通过利用此环境变量，您可以轻松地适应各种测试框架要求，并适应那些期望输入格式不同于空格分隔列表的要求。此外，还可以根据测试框架的需要格式化测试文件名。以下是在 Linux 上通过 Django 框架使用 `CODEBUILD_CURRENT_SHARD_FILES` 的示例。此处，`CODEBUILD_CURRENT_SHARD_FILES` 用于获取 Django 支持的*点符号*文件路径：

```
codebuild-tests-run \
    —files-search "codebuild-glob-search '/tests/test_.py'" \
    —test-command 'python3 manage.py test $(echo "$CODEBUILD_CURRENT_SHARD_FILES" | sed -E "s/\//__/g; s/\.py$//; s/__/./g")' \
    —sharding-strategy 'equal-distribution'
```

**注意**  
请注意，`CODEBUILD_CURRENT_SHARD_FILES` 环境变量只能在 `codebuild-tests-run` CLI 的范围内使用。  
另外，如果您在测试命令内使用 `CODEBUILD_CURRENT_SHARD_FILES`，请将 `CODEBUILD_CURRENT_SHARD_FILES` 放在双引号内，如上面的示例所示。

# 使用 `codebuild-glob-search` CLI 命令
<a name="parallel-test-glob-search"></a>

AWS CodeBuild 提供了一个名为的内置 CLI 工具`codebuild-glob-search`，允许您根据一个或多个 glob 模式搜索工作目录中的文件。当您要对项目中的特定文件或目录运行测试时，此工具可能特别有用。

## 用法
<a name="parallel-test-glob-search.usage"></a>

`codebuild-glob-search` CLI 的使用语法如下：

```
codebuild-glob-search <glob_pattern1> [<glob_pattern2> ...]
```
+ `<glob_pattern1>`、`<glob_pattern2>` 等：一个或多个 glob 模式，用于与工作目录中的文件进行匹配。
+ `*`：匹配任何字符序列（路径分隔符除外）。
+ `**`：匹配任何字符序列（包括路径分隔符）。

**注意**  
确保 glob 字符串带有引号。要检查模式匹配的结果，请使用 `echo` 命令。  

```
version: 0.2

phases:
  build:
    commands:
      - echo $(codebuild-glob-search '**/__tests__/*.js')
      - codebuild-glob-search '**/__tests__/*.js' | xargs -n 1 echo
```

## Output
<a name="parallel-test-glob-search.output"></a>

CLI 将输出与所提供的 glob 模式相匹配的文件路径的换行分隔列表。返回的文件路径将是工作目录的相对路径。

如果找不到与提供的模式相匹配的文件，CLI 将输出一条消息，指出未找到任何文件。

请注意，将从搜索结果中排除由于任何给定模式而找到的目录。

## 示例
<a name="parallel-test-glob-search.example"></a>

如果只想搜索测试目录及其子目录中带有 `.js` 扩展名的文件，则可以在 `codebuild-glob-search` CLI 中使用以下命令：

```
codebuild-glob-search '**/__tests__/*.js'
```

此命令将在 `__tests__` 目录及其子目录中搜索所有带有 `.js` 扩展名的文件，如模式所示。

# 关于测试拆分
<a name="parallel-test-splitting"></a>

AWS CodeBuild的测试拆分功能可让您在多个计算实例上并行执行测试套件，从而缩短总体测试运行时间。此功能是通过 CodeBuild 项目设置中的批处理配置和 buildspec 文件中的`codebuild-tests-run`实用程序启用的。

根据指定的分片策略对测试进行拆分。 CodeBuild 提供了两种分片策略，如下所示：

平等分配  
`equal-distribution` 分片策略根据测试文件名的字母顺序将测试划分到并行构建中。这种方法首先对测试文件进行排序，然后使用基于分块的方法来分配它们，从而确保将相似的文件组合在一起进行测试。建议在处理相对较小的测试文件集时使用。虽然此方法旨在为每个分片分配大致相等数量的文件，且最大差异为 1，但它并不能保证稳定性。在后续构件中添加或移除测试文件时，现有文件的分配可能会发生变化，这可能导致在分片之间重新分配。

稳定性  
`stability` 分片策略采用一致的哈希算法在分片之间拆分测试，确保文件分配保持稳定。添加或删除新文件时，这种方法可确保现有 file-to-shard分配基本保持不变。对于大型测试套件，建议使用稳定性选项将测试均匀地分配到各个分片。该机制旨在提供近乎相等的分配，确保每个分片接收的文件数量相似，且差异最小。虽然稳定性策略不能保证理想的平等分配，但它提供了近乎相等的分配，即使在添加或移除文件时也能保持各构建之间文件分配的一致性。

要启用测试拆分，您需要在 CodeBuild 项目设置中配置批处理部分，指定所需的`parallelism`级别和其他相关参数。此外，还需要在 buildspec 文件中包含 `codebuild-tests-run` 实用程序以及相应的测试命令和拆分方法。

# 自动合并各个构建报告
<a name="parallel-test-auto-merge"></a>

在 fanout 批量生成中， AWS CodeBuild 支持将单个生成报告自动合并到合并的批次级报告中。此功能提供一个批量中所有构建的测试结果和代码覆盖的全面视图。

## 工作原理
<a name="parallel-test-auto-merge.how"></a>

执行`fanout`批量生成时，每个单独的生成都会生成[测试报告](test-reporting.md)。 CodeBuild 然后自动将来自不同版本的相同报告合并到一个统一的报告中，该报告将附加到批量生成中。这些合并报告可通过 [ BatchGetBuildBatches](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_BatchGetBuildBatches.html#CodeBuild-BatchGetBuildBatches-response-buildBatches)API 的`reportArns`字段轻松访问，也可以在控制台的 “**报告**” 选项卡中查看。这种合并功能也扩展到自动发现的报告。

合并报告是在报告组下创建的，这些[报告组](test-report-group.md)要么在 buildspec 中指定，要么由自动发现。 CodeBuild您可以直接在这些报告组下分析合并报告的趋势，从而为跨同一批量构建项目的历史构建的整体构建性能和质量指标提供宝贵的见解。

对于批次中的每个单独构建， CodeBuild 都会自动创建单独的报告组。这些报告组遵循特定的命名约定，将批量构建报告组名称与 `BuildFanoutShard<shard_number>` 后缀组合在一起，其中 `shard_number` 表示在其中创建报告组的分片编号。这种整理方式可让您跟踪和分析整合构建级别和各个构建级别的趋势，从而可以灵活地监控和评估其构建过程。

批量构建报告遵循与[各个构建报告](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_Report.html)相同的结构。**报告**选项卡中的以下关键字段特定于批量构建报告：

**批量构建报告状态**  
批量构建报告的状态遵循特定的规则，具体取决于报告类型：  
+ 测试报告：
  + 成功：当所有单独的构建报告都成功时，状态设置为成功。
  + 失败：如果任何单个构建报告失败，则状态将设置为失败。
  + 未完成：如果有任何单个构建报告缺失或状态为未完成，则状态将标记为未完成。
+ 代码覆盖率报告：
  + 完成：当所有单独的构建报告都完成时，状态设置为完成。
  + 失败：如果任何单个构建报告失败，则状态将设置为失败。
  + 未完成：如果有任何单个构建报告缺失或状态为未完成，则状态将标记为未完成。

**测试摘要**  
合并测试报告整合了所有单个构建报告中的以下字段：  
+ duration-in-nano-seconds：所有单独构建报告中的最大测试持续时间（以纳秒为单位）。
+ total：所有测试用例的总数，即每个构建中的测试总数之和。
+ status-counts：提供测试状态（例如“通过”、“失败”或“跳过”）的整合视图，这些状态是通过汇总所有单个构建中每种状态类型的计数计算得出的。

**代码覆盖摘要**  
合并的代码覆盖报告使用以下计算方法合并了所有单个构建中的字段：  
+ branches-covered：各个报告中所有覆盖的分支的总和。
+ branches-missed：各个报告中所有错过的分支的总和。
+ branch-coverage-percentage: `(Total covered branches / Total branches) * 100`
+ lines-covered：各个报告中所有覆盖的行的总和。
+ lines-missed：各个报告中所有错过的行的总和。
+ lines-coverage-percentage: `(Total covered lines / Total lines) * 100`

**执行 ID**  
批量构建 ARN。

**测试用例**  
合并后的报告包含来自各个版本的所有测试用例的合并列表，可通过 [DescribeTestCases](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_DescribeTestCases.html)API 和控制台中的批量生成报告进行访问。

**代码覆盖**  
合并后的代码覆盖率报告提供了所有单独版本中每个文件的合并行和分支覆盖率信息，可通过 [DescribeCodeCoverages](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_DescribeCodeCoverages.html)API 和控制台中的批量生成报告进行访问。注意：对于分布在不同分片上的多个测试文件所涵盖的文件，合并报告使用以下选择标准：  

1. 主要选择基于分片中最高的行覆盖率。

1. 如果多个分片上的行覆盖率相等，则会选择分支覆盖率最高的分片。

# 各种测试框架的并行测试执行示例
<a name="sample-parallel-test"></a>

您可以使用 `codebuild-tests-run` CLI 命令跨并行执行环境拆分和运行测试。下一节提供了各种框架的 `buildspec.yml` 示例，说明了 `codebuild-tests-run` 命令的用法。
+ 下面的每个示例包含的 `parallelism` 级别为五，这意味着将创建五个相同的执行环境来拆分测试。您可以通过修改 `build-fanout` 部分中的 `parallelism` 值来选择适合您项目的 `parallelism` 级别。
+ 下面的每个示例显示了将测试配置为按测试文件名进行拆分（默认情况下）。这可以跨并行执行环境均匀地分配测试。

在开始之前，请参阅[在批量构建中执行并行测试](parallel-test.md)以了解更多信息。

有关使用 `codebuild-tests-run` CLI 命令时选项的完整列表，请参阅[使用 `codebuild-tests-run` CLI 命令](parallel-test-tests-run.md)。

**Topics**
+ [使用 Django 配置并行测试](sample-parallel-test-django.md)
+ [使用 Elixir 配置并行测试](sample-parallel-test-elixir.md)
+ [使用 Go 配置并行测试](sample-parallel-test-go.md)
+ [使用 Java（Maven）配置并行测试](sample-parallel-test-java-maven.md)
+ [使用 Javascript 配置并行测试（Jest）](sample-parallel-test-javascript.md)
+ [使用 Kotlin 配置并行测试](sample-parallel-test-kotlin.md)
+ [使用 PHPUnit 配置并行测试](sample-parallel-test-phpunit.md)
+ [使用 Pytest 配置并行测试](sample-parallel-test-python.md)
+ [使用 Ruby 配置并行测试（Cucumber）](sample-parallel-test-ruby-cucumber.md)
+ [使用 Ruby 配置并行测试（RSpec）](sample-parallel-test-ruby.md)

# 使用 Django 配置并行测试
<a name="sample-parallel-test-django"></a>

以下 `buildspec.yml` 示例显示在 Ubuntu 平台上使用 Django 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 5

phases:
  install:
    commands:
      - echo 'Installing Python dependencies'
      - sudo yum install -y python3 python3-pip 
      - python3 -m ensurepip --upgrade 
      - python3 -m pip install django
  pre_build:
    commands:
      - echo 'Prebuild'
  build:
    commands:
      - echo 'Running Django Tests'
      - |
        codebuild-tests-run \
         --test-command 'python3 manage.py test $(echo "$CODEBUILD_CURRENT_SHARD_FILES" | sed -E "s/\//__/g; s/\.py$//; s/__/./g")' \ 
         --files-search "codebuild-glob-search '**/tests/*test_*.py'" \
         --sharding-strategy 'equal-distribution'
  post_build:
    commands:
      - echo 'Test execution completed'
```

上面的示例显示了环境变量 `CODEBUILD_CURRENT_SHARD_FILES` 的用法。此处，`CODEBUILD_CURRENT_SHARD_FILES` 用于获取 Django 支持的点符号文件路径。如上所示，在双引号内使用 `CODEBUILD_CURRENT_SHARD_FILES`。

# 使用 Elixir 配置并行测试
<a name="sample-parallel-test-elixir"></a>

以下 `buildspec.yml` 示例显示在 Ubuntu 平台上使用 Elixir 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 5

phases:
  install:
    commands:
      - echo 'Installing Elixir dependencies'
      - sudo apt update
      - sudo DEBIAN_FRONTEND=noninteractive apt install -y elixir
      - elixir --version
      - mix --version
  pre_build:
    commands:
      - echo 'Prebuild'
  build:
    commands:
      - echo 'Running Elixir Tests'
      - |
        codebuild-tests-run \
         --test-command 'mix test' \
         --files-search "codebuild-glob-search '**/test/**/*_test.exs'" \ 
         --sharding-strategy 'equal-distribution'
  post_build:
    commands:
      - echo "Test execution completed"
```

# 使用 Go 配置并行测试
<a name="sample-parallel-test-go"></a>

以下 `buildspec.yml` 示例显示在 Linux 平台上使用 Go 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 5
    ignore-failure: false

phases:
  install:
    commands:
      - echo 'Fetching Go version'
      - go version
  pre_build:
    commands:
      - echo 'prebuild'
  build:
    commands:
      - echo 'Running go Tests'
      - go mod init calculator
      - cd calc
      - |
        codebuild-tests-run \
         --test-command "go test -v calculator.go" \
         --files-search "codebuild-glob-search '**/*test.go'"
  post_build:
    commands:
      - echo "Test execution completed"
```

在上面的示例中，`calculator.go` 函数包含要测试的简单数学函数，并且所有测试文件和 `calculator.go` 文件都在 `calc` 文件夹中。

# 使用 Java（Maven）配置并行测试
<a name="sample-parallel-test-java-maven"></a>

以下 `buildspec.yml` 示例显示在 Linux 平台上使用 Java 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false 
  build-fanout:
    parallelism: 5
    ignore-failure: false
    
phases:
  pre_build:
    commands:
      - echo 'prebuild'
  build:
    commands:
      - echo "Running mvn test"
      - |
        codebuild-tests-run \
          --test-command 'mvn test -Dtest=$(echo "$CODEBUILD_CURRENT_SHARD_FILES" | sed "s|src/test/java/||g; s/\.java//g; s|/|.|g; s/ /,/g" | tr "\n" "," | sed "s/,$//")' \
          --files-search "codebuild-glob-search '**/test/**/*.java'"
         
  post_build:
    commands:
      - echo "Running post-build steps..."
      - echo "Test execution completed"
```

在给定的示例中，环境变量 `CODEBUILD_CURRENT_SHARD_FILES` 包含当前分片中的测试文件，用换行分隔。这些文件以 Maven 的 `-Dtest` 参数所接受的格式转换为以逗号分隔的类名称列表。

# 使用 Javascript 配置并行测试（Jest）
<a name="sample-parallel-test-javascript"></a>

以下 `buildspec.yml` 示例显示在 Ubuntu 平台上使用 Javascript 并行执行测试：

```
version: 0.2

batch:
  fast-fail: true
  build-fanout:
    parallelism: 5
    ignore-failure: false

phases:
  install:
    commands:
      - echo 'Installing Node.js dependencies'
      - apt-get update
      - apt-get install -y nodejs
      - npm install
      - npm install --save-dev jest-junit
  pre_build:
    commands:
      - echo 'prebuild'
  build:
    commands:
      - echo 'Running JavaScript Tests'
      - |
         codebuild-tests-run \
          --test-command "npx jest" \
          --files-search "codebuild-glob-search '**/test/**/*.test.js'" \
          --sharding-strategy 'stability'
    post_build:
      commands:
        - echo 'Test execution completed'
```

# 使用 Kotlin 配置并行测试
<a name="sample-parallel-test-kotlin"></a>

以下 `buildspec.yml` 示例显示在 Linux 平台上使用 Kotlin 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 2
    ignore-failure: false

phases:
  install:
    runtime-versions:
      java: corretto11 
    commands:
      - echo 'Installing dependencies'
      - KOTLIN_VERSION="1.8.20" # Replace with your desired version
      - curl -o kotlin-compiler.zip -L "https://github.com/JetBrains/kotlin/releases/download/v${KOTLIN_VERSION}/kotlin-compiler-${KOTLIN_VERSION}.zip"
      - unzip kotlin-compiler.zip -d /usr/local
      - export PATH=$PATH:/usr/local/kotlinc/bin
      - kotlin -version
      - curl -O https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/1.8.2/junit-platform-console-standalone-1.8.2.jar
  pre_build:
    commands:
      - echo 'prebuild'
  build:
    commands:
      - echo 'Running Kotlin Tests'
      - |
        codebuild-tests-run \
          --test-command 'kotlinc src/main/kotlin/*.kt $(echo "$CODEBUILD_CURRENT_SHARD_FILES" | tr "\n" " ") -d classes -cp junit-platform-console-standalone-1.8.2.jar' \
          --files-search "codebuild-glob-search 'src/test/kotlin/*.kt'"
      - |
        codebuild-tests-run \
          --test-command '
            java -jar junit-platform-console-standalone-1.8.2.jar --class-path classes \
              $(for file in $CODEBUILD_CURRENT_SHARD_FILES; do
                 class_name=$(basename "$file" .kt)
                 echo "--select-class $class_name"
               done)
          ' \
          --files-search "codebuild-glob-search 'src/test/kotlin/*.kt'"
  post_build:
    commands:
      - echo "Test execution completed"
```

在上面的示例中，使用了 `codebuild-tests-run` CLI 两次。在第一次运行期间，kotlinc 编译文件。`CODEBUILD_CURRENT_SHARD_FILES` 变量检索分配给当前分片的测试文件，然后将其转换为以空格分隔的列表。在第二次运行中，JUnit 执行测试。再次，`CODEBUILD_CURRENT_SHARD_FILES` 获取分配给当前分片的测试文件，但这次它们转换为类名称。

# 使用 PHPUnit 配置并行测试
<a name="sample-parallel-test-phpunit"></a>

以下 `buildspec.yml` 示例显示在 Linux 平台上使用 PHPUnit 并行执行测试：

```
version: 0.2
 
batch:
   fast-fail: false
   build-fanout:
     parallelism: 5
     ignore-failure: false
 
phases:
   install:
     commands:
       - echo 'Install dependencies'
       - composer require --dev phpunit/phpunit
   pre_build:
     commands:
       - echo 'prebuild'
   build:
     commands:
       - echo 'Running phpunit Tests'
       - composer dump-autoload
       - | 
         codebuild-tests-run \
          --test-command "./vendor/bin/phpunit --debug" \ 
          --files-search "codebuild-glob-search '**/tests/*Test.php'"
   post_build:
       commands:
         - echo 'Test execution completed'
```

# 使用 Pytest 配置并行测试
<a name="sample-parallel-test-python"></a>

以下 `buildspec.yml` 示例显示在 Ubuntu 平台上使用 Pytest 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 5
    ignore-failure: false

phases:
  install:
    commands:
      - echo 'Installing Python dependencies'
      - apt-get update
      - apt-get install -y python3 python3-pip
      - pip3 install --upgrade pip
      - pip3 install pytest
  build:
    commands:
      - echo 'Running Python Tests'
      - |
         codebuild-tests-run \
          --test-command 'python -m pytest' \
          --files-search "codebuild-glob-search 'tests/test_*.py'" \
          --sharding-strategy 'equal-distribution'
  post_build:
    commands:
      - echo "Test execution completed"
```

以下 `buildspec.yml` 示例显示在 Windows 平台上使用 Pytest 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 5
    ignore-failure: false

phases:
  install:
    commands:
      - echo 'Installing Python dependencies'
      - pip install pytest
  pre_build:
    commands:
      - echo 'prebuild'
  build:
    commands:
      - echo 'Running pytest'
      - |
        & codebuild-tests-run `
         --test-command 'pytest @("$env:CODEBUILD_CURRENT_SHARD_FILES" -split \"`r?`n\")'  `
         --files-search "codebuild-glob-search '**/test_*.py' '**/*_test.py'" `
         --sharding-strategy 'equal-distribution' 
  post_build:
    commands:
      - echo "Test execution completed"
```

在上面的示例中，`CODEBUILD_CURRENT_SHARD_FILES` 环境变量用于获取分配给当前分片并作为数组传递给 pytest 命令的测试文件。

# 使用 Ruby 配置并行测试（Cucumber）
<a name="sample-parallel-test-ruby-cucumber"></a>

以下 `buildspec.yml` 示例显示在 Linux 平台上使用 Cucumber 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 5
    ignore-failure: false

phases:
  install:
    commands:
      - echo 'Installing Ruby dependencies'
      - gem install bundler
      - bundle install
  pre_build:
    commands:
      - echo 'prebuild'
  build:
    commands:
      - echo 'Running Cucumber Tests'
      - cucumber --init
      - |
        codebuild-tests-run \
         --test-command "cucumber" \
         --files-search "codebuild-glob-search '**/*.feature'"
  post_build:
    commands:
      - echo "Test execution completed"
```

# 使用 Ruby 配置并行测试（RSpec）
<a name="sample-parallel-test-ruby"></a>

以下 `buildspec.yml` 示例显示在 Ubuntu 平台上使用 RSpec 并行执行测试：

```
version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 5
    ignore-failure: false

phases:
  install:
    commands:
      - echo 'Installing Ruby dependencies'
      - apt-get update
      - apt-get install -y ruby ruby-dev build-essential
      - gem install bundler
      - bundle install
  build:
    commands:
      - echo 'Running Ruby Tests'
      - |
         codebuild-tests-run \
          --test-command 'bundle exec rspec' \
          --files-search "codebuild-glob-search 'spec/**/*_spec.rb'" \
          --sharding-strategy 'equal-distribution'
  post_build:
    commands:
      - echo "Test execution completed"
```

# 缓存构建以提高性能
<a name="build-caching"></a>

构建项目时，可以使用缓存来节省时间。缓存可以存储构建环境的可重用部分，并在多个构建中使用它们。您的构建项目可以使用两种缓存类型中的一种：Amazon S3 或本地。如果使用本地缓存，则必须选择三种缓存模式中的一种或多种：源缓存、Docker 层缓存和自定义缓存。

**注意**  
Docker 层缓存模式仅适用于 Linux 环境。如果选择此模式，则必须在特权模式下运行构建。 CodeBuild 被授予特权模式的项目授予其容器访问所有设备的权限。有关更多信息，请参阅 Docker 文档网站上的[运行时权限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)。

**Topics**
+ [Amazon S3 缓存](caching-s3.md)
+ [本地缓存](caching-local.md)
+ [指定本地缓存](specify-caching-local.md)

# Amazon S3 缓存
<a name="caching-s3"></a>

Amazon S3 缓存将缓存存储在跨多个构建主机可用的 Amazon S3 存储桶中。对于构建成本高于下载成本的中小型构建构件，这是一个很好的选择。

要在版本中使用 Amazon S3，您可以为要缓存的文件指定路径`buildspec.yml`。 CodeBuild 将自动存储缓存并将其更新到项目中配置的 Amazon S3 位置。如果您不指定文件路径， CodeBuild 将尽最大努力缓存公共语言依赖关系以帮助您加快构建速度。您可以在构建日志中查看缓存详细信息。

此外，如果您想拥有多个版本的缓存，可以在中定义缓存密钥`buildspec.yml`。 CodeBuild 将缓存存储在此缓存密钥的上下文中，并创建一个创建后不会更新的唯一缓存副本。也可以跨项目共享缓存键。动态键、缓存版本控制和跨构建共享缓存等功能只有在指定键时才可用。

要了解有关 buildspec 文件中的缓存语法的更多信息，请参阅 buildspec 参考中的[cache](build-spec-ref.md#build-spec.cache)。

**Topics**
+ [生成动态键](#caching-s3-dynamic)
+ [codebuild-hash-files](#caching-s3-dynamic.codebuild-hash-files)
+ [缓存版本](#caching-s3-version)
+ [项目之间的缓存共享](#caching-s3-sharing)
+ [Buildspec 示例](#caching-s3-examples)

## 生成动态键
<a name="caching-s3-dynamic"></a>

缓存键可能包含 Shell 命令和环境变量以使其具有唯一性，以便在键发生变化时自动更新缓存。例如，您可以使用 `package-lock.json` 文件的哈希值定义一个键。当该文件中的依赖项发生变化时，此哈希值（即，缓存键）也会发生变化，从而导致自动创建新缓存。

```
cache:
    key: npm-key-$(codebuild-hash-files package-lock.json)
```

CodeBuild 将评估表达式`$(codebuild-hash-files package-lock.json)`以获得最终密钥：

```
npm-key-abc123
```

您也可以使用环境变量定义缓存键，例如 `CODEBUILD_RESOLVED_SOURCE_VERSION`。这样可以确保每当源发生变化时，系统都会生成一个新的键，导致自动保存一个新缓存：

```
cache:
   key: npm-key-$CODEBUILD_RESOLVED_SOURCE_VERSION
```

CodeBuild 将计算表达式并获得最终的密钥：

```
npm-key-046e8b67481d53bdc86c3f6affdd5d1afae6d369
```

## codebuild-hash-files
<a name="caching-s3-dynamic.codebuild-hash-files"></a>

`codebuild-hash-files`是一个 CLI 工具，它使用全局模式计算 CodeBuild 源目录中一组文件的 SHA-256 哈希值：

```
codebuild-hash-files <glob-pattern-1> <glob-pattern-2> ...
```

下面是一些使用 `codebuild-hash-files` 的示例：

```
codebuild-hash-files package-lock.json
codebuild-hash-files '**/*.md'
```

## 缓存版本
<a name="caching-s3-version"></a>

缓存版本是根据所缓存目录的路径生成的一个哈希值。如果两个缓存的版本不同，则在匹配过程中它们将被视为不同的缓存。例如，以下两个缓存被认为是不同的，因为它们引用不同的路径：

```
version: 0.2

phases:
  build:
    commands:
      - pip install pandas==2.2.3 --target pip-dependencies
cache:
  key: pip-dependencies 
  paths:
    - "pip-dependencies/**/*"
```

```
version: 0.2

phases:
  build:
    commands:
      - pip install pandas==2.2.3 --target tmp/pip-dependencies
cache:
  key: pip-dependencies 
  paths:
    - "tmp/pip-dependencies/**/*"
```

## 项目之间的缓存共享
<a name="caching-s3-sharing"></a>

您可以使用 `cache` 部分下的 `cacheNamespace` API 字段在多个项目之间共享缓存。此字段用于定义缓存的范围。要共享缓存，必须执行以下操作：
+ 使用相同的 `cacheNamespace`。
+ 指定相同的缓存 `key`。
+ 定义相同的缓存路径。
+ 使用相同的 Amazon S3 存储桶和 `pathPrefix`（如果已设置）。

这样可以确保一致性并可在项目间共享缓存。

### 指定缓存命名空间（控制台）
<a name="caching-s3-sharing.console"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 选择**创建项目**。有关更多信息，请参阅 [创建构建项目（控制台）](create-project.md#create-project-console) 和 [运行构建（控制台）](run-build-console.md)。

1. 在**构件**中，选择**其他配置**。

1. 对于**缓存类型**，选择 **Amazon S3**。

1. 对于**缓存命名空间 - 可选**，输入命名空间值。  
![\[CodeBuild 控制台中的缓存命名空间参数。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/s3-cache-namespace.png)

1. 继续使用默认值，然后选择**创建构建项目**。

### 指定缓存命名空间（AWS CLI）
<a name="caching-s3-sharing.cli"></a>

您可以使用中的`--cache`参数 AWS CLI 来指定缓存命名空间。

```
--cache '{"type": "S3", "location": "your-s3-bucket", "cacheNamespace": "test-cache-namespace"}'
```

## Buildspec 示例
<a name="caching-s3-examples"></a>

以下是常用语言的若干 buildspec 示例：

**Topics**
+ [缓存 Node.js 依赖项](#caching-s3-examples.nodejs)
+ [缓存 Python 依赖项](#caching-s3-examples.python)
+ [缓存 Ruby 依赖项](#caching-s3-examples.ruby)
+ [缓存 Go 依赖项](#caching-s3-examples.go)

### 缓存 Node.js 依赖项
<a name="caching-s3-examples.nodejs"></a>

如果您的项目包含一个 `package-lock.json` 文件并使用 `npm` 来管理 Node.js 依赖项，则以下示例显示了如何设置缓存。默认情况下，`npm` 将依赖项安装到 `node_modules` 目录中。

```
version: 0.2

phases:
  build:
    commands:
      - npm install
cache:
  key: npm-$(codebuild-hash-files package-lock.json)
  paths:
    - "node_modules/**/*"
```

### 缓存 Python 依赖项
<a name="caching-s3-examples.python"></a>

如果您的项目包含一个 `requirements.txt` 文件并使用 pip 来管理 Python 依赖项，则以下示例展示了如何配置缓存。默认情况下，pip 将软件包安装到系统的 `site-packages` 目录中。

```
version: 0.2

phases:
  build:
    commands:
      - pip install -r requirements.txt
cache:
  key: python-$(codebuild-hash-files requirements.txt)
  paths:
    - "/root/.pyenv/versions/${python_version}/lib/python${python_major_version}/site-packages/**/*"
```

此外，您还可以将依赖项安装到一个特定目录中，并为此目录配置缓存。

```
version: 0.2

phases:
  build:
    commands:
      - pip install -r requirements.txt --target python-dependencies
cache:
  key: python-$(codebuild-hash-files requirements.txt)
  paths:
    - "python-dependencies/**/*"
```

### 缓存 Ruby 依赖项
<a name="caching-s3-examples.ruby"></a>

如果您的项目包含 `Gemfile.lock` 文件并使用 `Bundler` 来管理 gem 依赖项，则以下示例演示了如何有效地配置缓存。

```
version: 0.2

phases:
  build:
    commands:
      - bundle install --path vendor/bundle
cache:
  key: ruby-$(codebuild-hash-files Gemfile.lock)
  paths:
    - "vendor/bundle/**/*"
```

### 缓存 Go 依赖项
<a name="caching-s3-examples.go"></a>

如果您的项目包含 `go.sum` 文件并使用 Go 模块来管理依赖项，则以下示例演示如何配置缓存。默认情况下，将 Go 模块下载并存储在 `${GOPATH}/pkg/mod` 目录中。

```
version: 0.2

phases:
  build:
    commands:
      - go mod download
cache:
  key: go-$(codebuild-hash-files go.sum)
  paths:
    - "/go/pkg/mod/**/*"
```

# 本地缓存
<a name="caching-local"></a>

本地缓存将缓存本地存储在构建主机上，并且仅可用于该构建主机。对于大中型构建构件，这是一个很好的选择，因为构建主机上的缓存立即可用。如果您不经常构建，这不是最好的选择。这意味着构建性能不受网络传输时间的影响。

如果您选择本地缓存，则必须选择以下一个或多个缓存模式：
+ 源缓存模式用于缓存主要和辅助源的 Git 元数据。创建缓存后，后续构建仅拉取两次提交之间发生的更改。对于具有干净工作目录和源为大型 Git 存储库的项目，此模式是一个不错的选择。如果您选择此选项，并且您的项目不使用 Git 存储库（AWS CodeCommit、 GitHub、E GitHub nterprise Server 或 Bitbucket），则该选项将被忽略。
+ Docker 层缓存模式缓存现有 Docker 层。对于构建或拉取大型 Docker 映像的项目，此模式是一个不错的选择。它可以防止因从网络中拉取大型 Docker 映像而导致的性能问题。
**注意**  
您只能在 Linux 环境中使用 Docker 层缓存。
必须设置 `privileged` 标志以使您的项目具有所需的 Docker 权限。  
默认情况下，为非 VPC 构建启用 Docker 进程守护程序。如果您想使用 Docker 容器进行 VPC 构建，请参阅 Docker 文档网站上的[运行时权限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)并启用特权模式。此外，Windows 不支持特权模式。
在使用 Docker 层缓存之前，您应考虑安全影响。
+ 自定义缓存模式用于缓存您在 buildspec 文件中指定的目录。如果您的构建方案不适合另外两种本地缓存模式之一，则此模式是一个不错的选择。如果您使用自定义缓存：
  + 只能指定目录进行缓存。不能指定单独的文件。
  + 用于引用缓存目录的符号链接。
  + 缓存目录在下载项目源代码之前链接到您的构建。如果缓存项目具有相同的名称，则它们会覆盖源项目。使用 buildspec 文件中的缓存路径指定目录。有关更多信息，请参阅 [buildspec 语法](build-spec-ref.md#build-spec-ref-syntax)。
  + 避免在源和缓存中使用相同的目录名称。本地缓存的目录可能会覆盖或删除源存储库中具有相同名称的目录。

**注意**  
`LINUX_GPU_CONTAINER` 环境类型和 `BUILD_GENERAL1_2XLARGE` 计算类型不支持本地缓存。有关更多信息，请参阅 [构建环境计算模式和类型](build-env-ref-compute-types.md)。

**注意**  
当您配置为使用 VPC 时 CodeBuild ，不支持本地缓存。有关 VPCs 与一起使用的更多信息 CodeBuild，请参阅[AWS CodeBuild 与亚马逊 Virtual Private Cloud 一起使用](vpc-support.md)。

# 指定本地缓存
<a name="specify-caching-local"></a>

您可以使用 AWS CLI、控制台、SDK 或 CloudFormation 来指定本地缓存。有关本地缓存的更多信息，请参阅[本地缓存](caching-local.md)。

**Topics**
+ [指定本地缓存 (CLI)](#caching-local-cli)
+ [指定本地缓存（控制台）](#caching-local-console)
+ [指定本地缓存 (CloudFormation)](#caching-local-cfn)

## 指定本地缓存 (CLI)
<a name="caching-local-cli"></a>

您可以使用中的`--cache`参数 AWS CLI 来指定三种本地缓存类型中的每一种类型。
+ 指定源缓存：

  ```
  --cache type=LOCAL,mode=[LOCAL_SOURCE_CACHE]
  ```
+ 指定 Docker 层缓存：

  ```
  --cache type=LOCAL,mode=[LOCAL_DOCKER_LAYER_CACHE]
  ```
+ 指定自定义缓存：

  ```
  --cache type=LOCAL,mode=[LOCAL_CUSTOM_CACHE]
  ```

有关更多信息，请参阅 [创建构建项目 (AWS CLI)](create-project.md#create-project-cli)。

## 指定本地缓存（控制台）
<a name="caching-local-console"></a>

您可以使用控制台的**构件**部分指定缓存。对于**缓存类型**，选择 **Amazon S3** 或**本地**。如果您选择**本地**，请选择三个本地缓存选项中的一个或多个。

![\[选择三个本地缓存选项中的一个或多个来指定本地缓存。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/local-cache.png)


有关更多信息，请参阅 [创建构建项目（控制台）](create-project.md#create-project-console)。

## 指定本地缓存 (CloudFormation)
<a name="caching-local-cfn"></a>

如果使用 CloudFormation 指定本地缓存，则在`Cache`属性上，为`Type`，指定`LOCAL`。以下 YAML 格式的示例 CloudFormation 代码指定了所有三种本地缓存类型。您可以指定这些类型的任意组合。如果您使用 Docker 层缓存，在 `Environment` 下，您必须将 `PrivilegedMode` 设置为 `true`，将 `Type` 设置为 `LINUX_CONTAINER`。

```
CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: MyProject
      ServiceRole: <service-role>
      Artifacts:
        Type: S3
        Location: <bucket-name>
        Name: myArtifact
        EncryptionDisabled: true
        OverrideArtifactName: true
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_SMALL
        Image: aws/codebuild/standard:5.0
        Certificate: <bucket/cert.zip>
        # PrivilegedMode must be true if you specify LOCAL_DOCKER_LAYER_CACHE
        PrivilegedMode: true
      Source:
        Type: GITHUB
        Location: <github-location>
        InsecureSsl: true
        GitCloneDepth: 1
        ReportBuildStatus: false
      TimeoutInMinutes: 10
      Cache:
        Type: LOCAL
        Modes: # You can specify one or more cache mode, 
          - LOCAL_CUSTOM_CACHE
          - LOCAL_DOCKER_LAYER_CACHE
          - LOCAL_SOURCE_CACHE
```

**注意**  
默认情况下，为非 VPC 构建启用 Docker 进程守护程序。如果您想使用 Docker 容器进行 VPC 构建，请参阅 Docker 文档网站上的[运行时权限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)并启用特权模式。此外，Windows 不支持特权模式。

有关更多信息，请参阅 [创建构建项目 (CloudFormation)](create-project.md#create-project-cloud-formation)。

# 调试内置 AWS CodeBuild
<a name="debug-builds"></a>

AWS CodeBuild 提供了两种在开发和故障排除期间调试版本的方法。您可以使用 CodeBuild 沙盒环境实时调查问题并验证修复程序，也可以使用 S AWS ystems Manager 会话管理器连接到生成容器并查看容器状态。

## 使用 CodeBuild 沙盒调试构建
<a name="debug-codebuild-sandbox"></a>

 CodeBuild 沙盒环境在安全和隔离的环境中提供交互式调试会话。您可以通过 AWS 管理控制台 或直接与环境进行交互 AWS CLI，执行命令并逐步验证您的构建过程。它使用经济实惠的每秒计费模式，并支持与您的构建环境相同的源提供商和 AWS 服务的原生集成。您也可以使用 SSH 客户端或从集成开发环境 (IDEs) 连接到沙盒环境。

要了解有关 CodeBuild 沙盒定价的更多信息，请访问定[CodeBuild 价文档](https://aws.amazon.com/codebuild/pricing/#Sandbox)。有关详细说明，请访问[使用 CodeBuild 沙盒调试构建](sandbox.md)文档。

## 使用会话管理器调试构建
<a name="debug-codebuild-session-manager"></a>

AWS Systems Manager 会话管理器允许在实际执行环境中直接访问正在运行的构建。这种方法可让您连接到活动的构建容器并实时检查构建过程。您可以检查文件系统，监控正在运行的进程，并在出现问题时对其进行故障排除。

有关详细说明，请访问[使用会话管理器调试构建](session-manager.md)文档。

# 使用 CodeBuild 沙盒调试构建
<a name="sandbox"></a>

在中 AWS CodeBuild，你可以使用 CodeBuild 沙盒来调试构建，运行自定义命令并对构建进行故障排除。

**Topics**
+ [先决条件](#sandbox-prereq)
+ [使用 CodeBuild 沙箱（控制台）调试构建](#sandbox-console)
+ [使用 CodeBuild 沙盒调试构建 ()AWS CLI](#sandbox-cli)
+ [教程：使用 SSH 连接到沙盒](sandbox-ssh-tutorial.md)
+ [AWS CodeBuild 沙箱 SSH 连接问题疑难解答](sandbox-troubleshooting.md)

## 先决条件
<a name="sandbox-prereq"></a>

在使用 CodeBuild 沙箱之前，请确保您的 CodeBuild 服务角色具有以下 SSM 策略：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:codebuild:us-east-1:111122223333:build/*",
                "arn:aws:ssm:us-east-1::document/AWS-StartSSHSession"
            ]
        }
    ]
}
```

------

## 使用 CodeBuild 沙箱（控制台）调试构建
<a name="sandbox-console"></a>

按照以下说明运行命令并在控制台中将 SSH 客户端与 CodeBuild 沙箱连接起来。

### 使用 CodeBuild 沙箱（控制台）运行命令
<a name="sandbox-console.commands"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建项目**。选择构建项目，然后选择**调试构建**。  
![\[控制台中的调试构建项目详细信息页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/sandbox-debug-build.png)

1. 在**运行命令**选项卡中，输入您的自定义命令，然后选择**运行命令**。  
![\[控制台中的运行命令详细信息页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/debug-build-run.png)

1. 然后，您的 CodeBuild 沙箱将被初始化并开始运行您的自定义命令。完成后，输出将显示在**输出**选项卡中。  
![\[控制台中的运行命令输出页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/debug-build-run-output.png)

1. 完成故障排除后，可以通过选择**停止沙盒**来停止沙盒。然后选择**停止**以确认将停止沙盒。  
![\[停止沙盒对话框。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/stop-sandbox.png)  
![\[控制台中沙盒已停止的运行命令输出页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/stopped-sandbox.png)

### 使用 CodeBuild 沙箱（控制台）连接您的 SSH 客户端
<a name="sandbox-console.ssh"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建项目**。选择构建项目，然后选择**调试构建**。  
![\[控制台中的调试构建项目详细信息页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/sandbox-debug-build.png)

1. 在 **SSH 客户端**选项卡中，选择**启动沙盒**。  
![\[控制台中的 SSH 客户端沙盒页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/ssh-client-sandbox.png)

1.  CodeBuild 沙箱开始运行后，按照控制台说明将 SSH 客户端与沙箱连接起来。  
![\[控制台中的 SSH 客户端沙盒页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/ssh-client-sandbox-terminal.png)

1. 完成故障排除后，可以通过选择**停止沙盒**来停止沙盒。然后选择**停止**以确认将停止沙盒。  
![\[停止沙盒对话框。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/stop-sandbox-2.png)  
![\[控制台中沙盒已停止的运行命令输出页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/stopped-sandbox-2.png)

## 使用 CodeBuild 沙盒调试构建 ()AWS CLI
<a name="sandbox-cli"></a>

按照以下说明运行命令并将您的 SSH 客户端与 CodeBuild 沙箱连接。

### 启动 CodeBuild 沙箱 ()AWS CLI
<a name="sandbox-cli.start-sandbox"></a>

------
#### [ CLI command ]

```
aws codebuild start-sandbox --project-name $PROJECT_NAME
```
+ `--project-name`: CodeBuild 项目名称

------
#### [ Sample request ]

```
aws codebuild start-sandbox --project-name "project-name"
```

------
#### [ Sample response ]

```
{
    "id": "project-name",
    "arn": "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name",
    "projectName": "project-name",
    "requestTime": "2025-02-06T11:24:15.560000-08:00",
    "status": "QUEUED",
    "source": {
        "type": "S3",
        "location": "arn:aws:s3:::cofa-e2e-test-1-us-west-2-beta-default-build-sources/eb-sample-jetty-v4.zip",
        "insecureSsl": false
    },
    "environment": {
        "type": "LINUX_CONTAINER",
        "image": "aws/codebuild/standard:6.0",
        "computeType": "BUILD_GENERAL1_SMALL",
        "environmentVariables": [{
                "name": "foo",
                "value": "bar",
                "type": "PLAINTEXT"
            },
            {
                "name": "bar",
                "value": "baz",
                "type": "PLAINTEXT"
            }
        ],
        "privilegedMode": false,
        "imagePullCredentialsType": "CODEBUILD"
    },
    "timeoutInMinutes": 10,
    "queuedTimeoutInMinutes": 480,
    "logConfig": {
        "cloudWatchLogs": {
            "status": "ENABLED",
            "groupName": "group",
            "streamName": "stream"
        },
        "s3Logs": {
            "status": "ENABLED",
            "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
            "encryptionDisabled": false
        }
    },
    "encryptionKey": "arn:aws:kms:us-west-2:962803963624:alias/SampleEncryptionKey",
    "serviceRole": "arn:aws:iam::962803963624:role/BuildExecutionServiceRole",
    "currentSession": {
        "id": "0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
        "currentPhase": "QUEUED",
        "status": "QUEUED",
        "startTime": "2025-02-06T11:24:15.626000-08:00",
        "logs": {
            "groupName": "group",
            "streamName": "stream/0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
            "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logsV2:log-groups/log-group/group/log-events/stream$252F0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
            "s3DeepLink": "https://s3.console.aws.amazon.com/s3/object/codefactory-test-pool-1-us-west-2-beta-default-build-logs/0103e0e7-52aa-4a3d-81dd-bfc27226fa54.gz?region=us-west-2",
            "cloudWatchLogsArn": "arn:aws:logs:us-west-2:962803963624:log-group:group:log-stream:stream/0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
            "s3LogsArn": "arn:aws:s3:::codefactory-test-pool-1-us-west-2-beta-default-build-logs/0103e0e7-52aa-4a3d-81dd-bfc27226fa54.gz",
            "cloudWatchLogs": {
                "status": "ENABLED",
                "groupName": "group",
                "streamName": "stream"
            },
            "s3Logs": {
                "status": "ENABLED",
                "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
                "encryptionDisabled": false
            }
        }
    }
}
```

------

### 获取有关沙盒状态的信息（AWS CLI）
<a name="sandbox-cli.batch-get-sandboxes"></a>

------
#### [ CLI command ]

```
aws codebuild batch-get-sandboxes --ids $SANDBOX_IDs
```

------
#### [ Sample request ]

```
aws codebuild stop-sandbox --id "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name"
```
+ `--ids`：`sandboxIds` 或 `sandboxArns` 的逗号分隔列表。

您可以提供沙盒 ID 或沙盒 ARN：
+ 沙盒 ID：`<codebuild-project-name>:<UUID>`

  例如 `project-name:d25be134-05cb-404a-85da-ac5f85d2d72c`。
+ Sandbox ARN: arn: aws: codebuild*<region>*:: sandbox/: *<account-id>* *<codebuild-project-name>* *<UUID>*

  例如 `arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name:d25be134-05cb-404a-85da-ac5f85d2d72c`。

------
#### [ Sample response ]

```
{
    "sandboxes": [{
        "id": "project-name",
        "arn": "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name",
        "projectName": "project-name",
        "requestTime": "2025-02-06T11:24:15.560000-08:00",
        "endTime": "2025-02-06T11:39:21.587000-08:00",
        "status": "STOPPED",
        "source": {
            "type": "S3",
            "location": "arn:aws:s3:::cofa-e2e-test-1-us-west-2-beta-default-build-sources/eb-sample-jetty-v4.zip",
            "insecureSsl": false
        },
        "environment": {
            "type": "LINUX_CONTAINER",
            "image": "aws/codebuild/standard:6.0",
            "computeType": "BUILD_GENERAL1_SMALL",
            "environmentVariables": [{
                    "name": "foo",
                    "value": "bar",
                    "type": "PLAINTEXT"
                },
                {
                    "name": "bar",
                    "value": "baz",
                    "type": "PLAINTEXT"
                }
            ],
            "privilegedMode": false,
            "imagePullCredentialsType": "CODEBUILD"
        },
        "timeoutInMinutes": 10,
        "queuedTimeoutInMinutes": 480,
        "logConfig": {
            "cloudWatchLogs": {
                "status": "ENABLED",
                "groupName": "group",
                "streamName": "stream"
            },
            "s3Logs": {
                "status": "ENABLED",
                "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
                "encryptionDisabled": false
            }
        },
        "encryptionKey": "arn:aws:kms:us-west-2:962803963624:alias/SampleEncryptionKey",
        "serviceRole": "arn:aws:iam::962803963624:role/BuildExecutionServiceRole",
        "currentSession": {
            "id": "0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
            "currentPhase": "COMPLETED",
            "status": "STOPPED",
            "startTime": "2025-02-06T11:24:15.626000-08:00",
            "endTime": "2025-02-06T11:39:21.600000-08:00",
            "phases": [{
                    "phaseType": "SUBMITTED",
                    "phaseStatus": "SUCCEEDED",
                    "startTime": "2025-02-06T11:24:15.577000-08:00",
                    "endTime": "2025-02-06T11:24:15.606000-08:00",
                    "durationInSeconds": 0
                },
                {
                    "phaseType": "QUEUED",
                    "phaseStatus": "SUCCEEDED",
                    "startTime": "2025-02-06T11:24:15.606000-08:00",
                    "endTime": "2025-02-06T11:24:16.067000-08:00",
                    "durationInSeconds": 0
                },
                {
                    "phaseType": "PROVISIONING",
                    "phaseStatus": "SUCCEEDED",
                    "startTime": "2025-02-06T11:24:16.067000-08:00",
                    "endTime": "2025-02-06T11:24:20.519000-08:00",
                    "durationInSeconds": 4,
                    "contexts": [{
                        "statusCode": "",
                        "message": ""
                    }]
                },
                {
                    "phaseType": "DOWNLOAD_SOURCE",
                    "phaseStatus": "SUCCEEDED",
                    "startTime": "2025-02-06T11:24:20.519000-08:00",
                    "endTime": "2025-02-06T11:24:22.238000-08:00",
                    "durationInSeconds": 1,
                    "contexts": [{
                        "statusCode": "",
                        "message": ""
                    }]
                },
                {
                    "phaseType": "RUNNING_SANDBOX",
                    "phaseStatus": "TIMED_OUT",
                    "startTime": "2025-02-06T11:24:22.238000-08:00",
                    "endTime": "2025-02-06T11:39:21.560000-08:00",
                    "durationInSeconds": 899,
                    "contexts": [{
                        "statusCode": "BUILD_TIMED_OUT",
                        "message": "Build has timed out. "
                    }]
                },
                {
                    "phaseType": "COMPLETED",
                    "startTime": "2025-02-06T11:39:21.560000-08:00"
                }
            ],
            "logs": {
                "groupName": "group",
                "streamName": "stream/0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
                "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logsV2:log-groups/log-group/group/log-events/stream$252F0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
                "s3DeepLink": "https://s3.console.aws.amazon.com/s3/object/codefactory-test-pool-1-us-west-2-beta-default-build-logs/0103e0e7-52aa-4a3d-81dd-bfc27226fa54.gz?region=us-west-2",
                "cloudWatchLogsArn": "arn:aws:logs:us-west-2:962803963624:log-group:group:log-stream:stream/0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
                "s3LogsArn": "arn:aws:s3:::codefactory-test-pool-1-us-west-2-beta-default-build-logs/0103e0e7-52aa-4a3d-81dd-bfc27226fa54.gz",
                "cloudWatchLogs": {
                    "status": "ENABLED",
                    "groupName": "group",
                    "streamName": "stream"
                },
                "s3Logs": {
                    "status": "ENABLED",
                    "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
                    "encryptionDisabled": false
                }
            }
        }
    }],
    "sandboxesNotFound": []
}
```

------

### 停止沙盒（AWS CLI）
<a name="sandbox-cli.stop-sandbox"></a>

------
#### [ CLI command ]

```
aws codebuild stop-sandbox --id $SANDBOX-ID
```
+ `--id`：`sandboxId` 或 `sandboxArn`。

------
#### [ Sample request ]

```
aws codebuild stop-sandbox --id "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name"
```

------
#### [ Sample response ]

```
{
    "id": "project-name",
    "arn": "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name",
    "projectName": "project-name",
    "requestTime": "2025-02-06T11:24:15.560000-08:00",
    "status": "STOPPING",
    "source": {
        "type": "S3",
        "location": "arn:aws:s3:::cofa-e2e-test-1-us-west-2-beta-default-build-sources/eb-sample-jetty-v4.zip",
        "insecureSsl": false
    },
    "environment": {
        "type": "LINUX_CONTAINER",
        "image": "aws/codebuild/standard:6.0",
        "computeType": "BUILD_GENERAL1_SMALL",
        "environmentVariables": [{
                "name": "foo",
                "value": "bar",
                "type": "PLAINTEXT"
            },
            {
                "name": "bar",
                "value": "baz",
                "type": "PLAINTEXT"
            }
        ],
        "privilegedMode": false,
        "imagePullCredentialsType": "CODEBUILD"
    },
    "timeoutInMinutes": 10,
    "queuedTimeoutInMinutes": 480,
    "logConfig": {
        "cloudWatchLogs": {
            "status": "ENABLED",
            "groupName": "group",
            "streamName": "stream"
        },
        "s3Logs": {
            "status": "ENABLED",
            "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
            "encryptionDisabled": false
        }
    },
    "encryptionKey": "arn:aws:kms:us-west-2:962803963624:alias/SampleEncryptionKey",
    "serviceRole": "arn:aws:iam::962803963624:role/BuildExecutionServiceRole",
    "currentSession": {
        "id": "0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
        "currentPhase": "RUN_SANDBOX",
        "status": "STOPPING",
        "startTime": "2025-02-06T11:24:15.626000-08:00",
        "phases": [{
                "phaseType": "SUBMITTED",
                "phaseStatus": "SUCCEEDED",
                "startTime": "2025-02-08T14:33:26.144000-08:00",
                "endTime": "2025-02-08T14:33:26.173000-08:00",
                "durationInSeconds": 0
            },
            {
                "phaseType": "QUEUED",
                "phaseStatus": "SUCCEEDED",
                "startTime": "2025-02-08T14:33:26.173000-08:00",
                "endTime": "2025-02-08T14:33:26.702000-08:00",
                "durationInSeconds": 0
            },
            {
                "phaseType": "PROVISIONING",
                "phaseStatus": "SUCCEEDED",
                "startTime": "2025-02-08T14:33:26.702000-08:00",
                "endTime": "2025-02-08T14:33:30.530000-08:00",
                "durationInSeconds": 3,
                "contexts": [{
                    "statusCode": "",
                    "message": ""
                }]
            },
            {
                "phaseType": "DOWNLOAD_SOURCE",
                "phaseStatus": "SUCCEEDED",
                "startTime": "2025-02-08T14:33:30.530000-08:00",
                "endTime": "2025-02-08T14:33:33.478000-08:00",
                "durationInSeconds": 2,
                "contexts": [{
                    "statusCode": "",
                    "message": ""
                }]
            },
            {
                "phaseType": "RUN_SANDBOX",
                "startTime": "2025-02-08T14:33:33.478000-08:00"
            }
        ],
        "logs": {
            "groupName": "group",
            "streamName": "stream/0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
            "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logsV2:log-groups/log-group/group/log-events/stream$252F0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
            "s3DeepLink": "https://s3.console.aws.amazon.com/s3/object/codefactory-test-pool-1-us-west-2-beta-default-build-logs/0103e0e7-52aa-4a3d-81dd-bfc27226fa54.gz?region=us-west-2",
            "cloudWatchLogsArn": "arn:aws:logs:us-west-2:962803963624:log-group:group:log-stream:stream/0103e0e7-52aa-4a3d-81dd-bfc27226fa54",
            "s3LogsArn": "arn:aws:s3:::codefactory-test-pool-1-us-west-2-beta-default-build-logs/0103e0e7-52aa-4a3d-81dd-bfc27226fa54.gz",
            "cloudWatchLogs": {
                "status": "ENABLED",
                "groupName": "group",
                "streamName": "stream"
            },
            "s3Logs": {
                "status": "ENABLED",
                "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
                "encryptionDisabled": false
            }
        }
    }
}
```

------

### 启动命令执行（AWS CLI）
<a name="sandbox-cli.start-command-execution"></a>

------
#### [ CLI command ]

```
aws codebuild start-command-execution --command $COMMAND --type $TYPE --sandbox-id $SANDBOX-ID
```
+ `--command`：需要执行的命令。
+ `--sandbox-id`：`sandboxId` 或 `sandboxArn`。
+ `--type`：命令类型，`SHELL`。

------
#### [ Sample request ]

```
aws codebuild start-command-execution --command "echo "Hello World"" --type SHELL --sandbox-id "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name
```

------
#### [ Sample response ]

```
{
    "id": "e1c658c2-02bb-42a8-9abb-94835241fcd6",
    "sandboxId": "f7126a4a-b0d5-452f-814c-fea73718f805",
    "submitTime": "2025-02-06T20:12:02.683000-08:00",
    "status": "SUBMITTED",
    "command": "echo \"Hello World\"",
    "type": "SHELL",
    "logs": {
        "groupName": "group",
        "streamName": "stream",
        "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logsV2:log-groups/log-group/group/log-events/stream",
        "s3DeepLink": "https://s3.console.aws.amazon.com/s3/object/codefactory-test-pool-1-us-west-2-beta-default-build-logs/f7126a4a-b0d5-452f-814c-fea73718f805.gz?region=us-west-2",
        "cloudWatchLogsArn": "arn:aws:logs:us-west-2:962803963624:log-group:group:log-stream:stream",
        "s3LogsArn": "arn:aws:s3:::codefactory-test-pool-1-us-west-2-beta-default-build-logs/f7126a4a-b0d5-452f-814c-fea73718f805.gz",
        "cloudWatchLogs": {
            "status": "ENABLED",
            "groupName": "group",
            "streamName": "stream"
        },
        "s3Logs": {
            "status": "ENABLED",
            "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
            "encryptionDisabled": false
        }
    }
}
```

------

### 获取有关命令执行的信息（AWS CLI）
<a name="sandbox-cli.batch-get-command-executions"></a>

------
#### [ CLI command ]

```
aws codebuild batch-get-command-executions --command-execution-ids $COMMAND-IDs --sandbox-id $SANDBOX-IDs
```
+ `--command-execution-ids`：`commandExecutionIds` 的逗号分隔列表。
+ `--sandbox-id`：`sandboxId` 或 `sandboxArn`。

------
#### [ Sample request ]

```
aws codebuild batch-get-command-executions --command-execution-ids"c3c085ed-5a8f-4531-8e95-87d547f27ffd" --sandbox-id "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name"
```

------
#### [ Sample response ]

```
{
    "commandExecutions": [{
        "id": "c3c085ed-5a8f-4531-8e95-87d547f27ffd",
        "sandboxId": "cd71e456-2a4c-4db4-ada5-da892b0bba05",
        "submitTime": "2025-02-10T20:18:17.118000-08:00",
        "startTime": "2025-02-10T20:18:17.939000-08:00",
        "endTime": "2025-02-10T20:18:17.976000-08:00",
        "status": "SUCCEEDED",
        "command": "echo \"Hello World\"",
        "type": "SHELL",
        "exitCode": "0",
        "standardOutputContent": "Hello World\n",
        "logs": {
            "groupName": "group",
            "streamName": "stream",
            "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logsV2:log-groups/log-group/group/log-events/stream",
            "s3DeepLink": "https://s3.console.aws.amazon.com/s3/object/codefactory-test-pool-1-us-west-2-beta-default-build-logs/cd71e456-2a4c-4db4-ada5-da892b0bba05.gz?region=us-west-2",
            "cloudWatchLogsArn": "arn:aws:logs:us-west-2:962803963624:log-group:group:log-stream:stream",
            "s3LogsArn": "arn:aws:s3:::codefactory-test-pool-1-us-west-2-beta-default-build-logs/cd71e456-2a4c-4db4-ada5-da892b0bba05.gz",
            "cloudWatchLogs": {
                "status": "ENABLED",
                "groupName": "group",
                "streamName": "stream"
            },
            "s3Logs": {
                "status": "ENABLED",
                "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
                "encryptionDisabled": false
            }
        }
    }],
    "commandExecutionsNotFound": []
}
```

------

### 列出沙盒的命令执行情况（AWS CLI）
<a name="sandbox-cli.list-command-executions-for-sandbox"></a>

------
#### [ CLI command ]

```
aws codebuild list-command-executions-for-sandbox --sandbox-id $SANDBOX-ID --next-token $NEXT_TOKEN --max-results $MAX_RESULTS --sort-order $SORT_ORDER
```
+ `--next-token`：用于获取分页结果的下一个令牌（如果有）。您将从先前执行的列表沙盒中获得此值。
+ `--max-results`：（可选）要检索的最大沙盒记录数。
+ `--sort-order`：应检索沙盒记录的顺序。

------
#### [ Sample request ]

```
aws codebuild list-command-executions-for-sandbox --sandbox-id "arn:aws:codebuild:us-west-2:962803963624:sandbox/project-name"
```

------
#### [ Sample response ]

```
{
    "commandExecutions": [{
            "id": "aad6687e-07bc-45ab-a1fd-f5440229b528",
            "sandboxId": "cd71e456-2a4c-4db4-ada5-da892b0bba05",
            "submitTime": "2025-02-10T20:18:35.304000-08:00",
            "startTime": "2025-02-10T20:18:35.615000-08:00",
            "endTime": "2025-02-10T20:18:35.651000-08:00",
            "status": "FAILED",
            "command": "fail command",
            "type": "SHELL",
            "exitCode": "127",
            "standardErrContent": "/codebuild/output/tmp/script.sh: 4: fail: not found\n",
            "logs": {
                "groupName": "group",
                "streamName": "stream",
                "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logsV2:log-groups/log-group/group/log-events/stream",
                "s3DeepLink": "https://s3.console.aws.amazon.com/s3/object/codefactory-test-pool-1-us-west-2-beta-default-build-logs/cd71e456-2a4c-4db4-ada5-da892b0bba05.gz?region=us-west-2",
                "cloudWatchLogsArn": "arn:aws:logs:us-west-2:962803963624:log-group:group:log-stream:stream",
                "s3LogsArn": "arn:aws:s3:::codefactory-test-pool-1-us-west-2-beta-default-build-logs/cd71e456-2a4c-4db4-ada5-da892b0bba05.gz",
                "cloudWatchLogs": {
                    "status": "ENABLED",
                    "groupName": "group",
                    "streamName": "stream"
                },
                "s3Logs": {
                    "status": "ENABLED",
                    "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
                    "encryptionDisabled": false
                }
            }
        },
        {
            "id": "c3c085ed-5a8f-4531-8e95-87d547f27ffd",
            "sandboxId": "cd71e456-2a4c-4db4-ada5-da892b0bba05",
            "submitTime": "2025-02-10T20:18:17.118000-08:00",
            "startTime": "2025-02-10T20:18:17.939000-08:00",
            "endTime": "2025-02-10T20:18:17.976000-08:00",
            "status": "SUCCEEDED",
            "command": "echo \"Hello World\"",
            "type": "SHELL",
            "exitCode": "0",
            "standardOutputContent": "Hello World\n",
            "logs": {
                "groupName": "group",
                "streamName": "stream",
                "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logsV2:log-groups/log-group/group/log-events/stream",
                "s3DeepLink": "https://s3.console.aws.amazon.com/s3/object/codefactory-test-pool-1-us-west-2-beta-default-build-logs/cd71e456-2a4c-4db4-ada5-da892b0bba05.gz?region=us-west-2",
                "cloudWatchLogsArn": "arn:aws:logs:us-west-2:962803963624:log-group:group:log-stream:stream",
                "s3LogsArn": "arn:aws:s3:::codefactory-test-pool-1-us-west-2-beta-default-build-logs/cd71e456-2a4c-4db4-ada5-da892b0bba05.gz",
                "cloudWatchLogs": {
                    "status": "ENABLED",
                    "groupName": "group",
                    "streamName": "stream"
                },
                "s3Logs": {
                    "status": "ENABLED",
                    "location": "codefactory-test-pool-1-us-west-2-beta-default-build-logs",
                    "encryptionDisabled": false
                }
            }
        }
    ]
}
```

------

### 列出沙盒（AWS CLI）
<a name="sandbox-cli.list-sandboxes"></a>

------
#### [ CLI command ]

```
aws codebuild list-sandboxes --next-token $NEXT_TOKEN --max-results $MAX_RESULTS --sort-order $SORT_ORDER
```

------
#### [ Sample request ]

```
aws codebuild list-sandboxes
```

------
#### [ Sample response ]

```
{
    "ids": [
        "s3-log-project-integ-test-temp173925062814985d64e0f-7880-41df-9a3c-fb6597a266d2:827a5243-0841-4b69-a720-4438796f6967",
        "s3-log-project-integ-test-temp1739249999716bbd438dd-8bb8-47bd-ba6b-0133ac65b3d3:e2fa4eab-73af-42e3-8903-92fddaf9f378",
        "s3-log-project-integ-test-temp17392474779450fbdacc2-2d6e-4190-9ad5-28f891bb7415:cd71e456-2a4c-4db4-ada5-da892b0bba05",
        "s3-log-project-integ-test-temp17392246284164301421c-5030-4fa1-b4d3-ca15e44771c5:9e26ab3f-65e4-4896-a19c-56b1a95e630a",
        "s3-log-project-integ-test-temp173921367319497056d8d-6d8e-4f5a-a37c-a62f5686731f:22d91b06-df1e-4e9c-a664-c0abb8d5920b",
        "s3-log-project-integ-test-temp1739213439503f6283f19-390c-4dc8-95a9-c8480113384a:82cc413e-fc46-47ab-898f-ae23c83a613f",
        "s3-log-project-integ-test-temp1739054385570b1f1ddc2-0a23-4062-bd0c-24e9e4a99b99:c02562f3-2396-42ec-98da-38e3fe5da13a",
        "s3-log-project-integ-test-temp173905400540237dab1ac-1fde-4dfb-a8f5-c0114333dc89:d2f30493-f65e-4fa0-a7b6-08a5e77497b9",
        "s3-log-project-integ-test-temp17390534055719c534090-7bc4-48f1-92c5-34acaec5bf1e:df5f1c8a-f017-43b7-91ba-ad2619e2c059",
        "s3-log-project-integ-test-temp1739052719086a61813cc-ebb9-4db4-9391-7f43cc984ee4:d61917ec-8037-4647-8d52-060349272c4a",
        "s3-log-project-integ-test-temp173898670094078b67edb-c42f-42ed-9db2-4b5c1a5fc66a:ce33dfbc-beeb-4466-8c99-a3734a0392c7",
        "s3-log-project-integ-test-temp17389863425584d21b7cd-32e2-4f11-9175-72c89ecaffef:046dadf0-1f3a-4d51-a2c0-e88361924acf",
        "s3-log-project-integ-test-temp1738985884273977ccd23-394b-46cc-90d3-7ab94cf764dc:0370dc41-9339-4b0a-91ed-51929761b244",
        "s3-log-project-integ-test-temp1738985365972241b614f-8e41-4387-bd25-2b8351fbc9e0:076c392a-9630-47d8-85a9-116aa34edfff",
        "s3-log-project-integ-test-temp1738985043988a51a9e2b-09d6-4d24-9c3c-1e6e21ac9fa8:6ea3949c-435b-4177-aa4d-614d5956244c",
        "s3-log-project-integ-test-temp1738984123354c68b31ad-49d1-4f4b-981d-b66c00565ff6:6c3fff6c-815b-48b5-ada3-737400a6dee8",
        "s3-log-project-integ-test-temp1738977263715d4d5bf6c-370a-48bf-8ea6-905358a6cf92:968a0f54-724a-42d1-9207-6ed854b2fae8",
        "s3-log-project-integ-test-temp173897358796816ce8d7d-2a5e-41ef-855b-4a94a8d2795d:80f9a7ce-930a-402e-934e-d8b511d68b04",
        "s3-log-project-integ-test-temp17389730633301af5e452-0966-467c-b684-4e36d47f568c:cabbe989-2e8a-473c-af25-32edc8c28646",
        "s3-log-project-integ-test-temp1738901503813173fd468-b723-4d7b-9f9f-82e88d17f264:f7126a4a-b0d5-452f-814c-fea73718f805",
        "s3-log-project-integ-test-temp1738890502472c13616fb-bd0f-4253-86cc-28b74c97a0ba:c6f197e5-3a53-45b6-863e-0e6353375437",
        "s3-log-project-integ-test-temp17388903044683610daf3-8da7-43c6-8580-9978432432ce:d20aa317-8838-4966-bbfc-85b908213df1",
        "s3-log-project-integ-test-temp173888857196780b5ab8b-e54b-44fd-a222-c5a374fffe96:ab4b9970-ffae-47a0-b3a8-7b6790008cad",
        "s3-log-project-integ-test-temp1738888336931c11d378d-e74d-49a4-a723-3b92e6f7daac:4922f0e8-9b7d-4119-9c9f-115cd85e703e",
        "s3-log-project-integ-test-temp17388881717651612a397-c23f-4d88-ba87-2773cd3fc0c9:be91c3fc-418e-4feb-8a3a-ba58ff8f4e8a",
        "s3-log-project-integ-test-temp17388879727174c3c62ed-6195-4afb-8a03-59674d0e1187:a48826a8-3c0d-43c5-a1b5-1c98a0f978e9",
        "s3-log-project-integ-test-temp1738885948597cef305e4-b8b4-46b0-a65b-e2d0a7b83294:c050e77d-e3f8-4829-9a60-46149628fe96",
        "s3-log-project-integ-test-temp173888561463001a7d2a8-e4e4-4434-94db-09d3da9a9e17:8c3ac3f5-7111-4297-aec9-2470d3ead873",
        "s3-log-project-integ-test-temp1738869855076eb19cafd-04fe-41bd-8aa0-40826d0c0d27:d25be134-05cb-404a-85da-ac5f85d2d72c",
        "s3-project-integ-test-temp1738868157467148eacfc-d39b-49fc-a137-e55381cd2978:4909557b-c221-4814-b4b6-7d9e93d37c35",
        "s3-project-integ-test-temp1738820926895abec0af2-e33d-473c-9cf4-2122dd9d6876:8f5cf218-71d6-40a4-a4be-6cacebd7765f",
        "s3-project-integ-test-temp173881998877574f969a6-1c2e-4441-b463-ab175b45ce32:04396851-c901-4986-9117-585528e3877f",
        "s3-project-integ-test-temp17388189812309abd2604-29ba-4cf6-b6bf-073207b7db9c:540075c7-f5ec-41e8-9341-2233c09247eb",
        "s3-project-integ-test-temp1738818843474d3ea9ac1-b609-461b-bbdb-2da245c9bc96:865d4c3c-fbfe-4ece-9c92-d0c928341404",
        "s3-project-integ-test-temp1738818542236006e9169-e6d9-4344-9b59-f557e7aec619:1f9ffa87-da15-4290-83e2-eebdd877497b",
        "s3-project-integ-test-temp173881809557486ad11fd-7931-48d7-81d5-499cea52a6bc:c4c2efc4-685f-4e13-8b0f-1ef85ec300b1",
        "s3-project-integ-test-temp173881794103322941020-3f0b-49c3-b836-fcd818ec9484:0344cfba-de48-456d-b2a8-6566bd4a5d6e",
        "s3-project-integ-test-temp1738817680747b93d0d0b-ea16-497f-9559-af25ee6dcfdf:654a3a55-d92a-4dc6-8da8-56fd4d40d7e1",
        "s3-project-integ-test-temp17388174027191255c3da-086c-4270-b047-acac0b7bee0d:b7e82740-2c69-42fc-ab5a-dbf15bc016a1",
        "s3-project-integ-test-temp1738817099799016e7fa3-b9b5-46a2-bcd5-0888c646743f:8705a6a4-79ff-427a-a1c3-85c4e8fe462e",
        "s3-project-integ-test-temp1738816479281bb0c3606-5ebf-4623-bed5-12b60e9d3512:f23fc74b-a981-4835-8e28-375fcd4c99e4",
        "s3-project-integ-test-temp1738816263585c939a133-4d37-482c-9238-1dbff34b7674:ca28e234-0045-4ae6-8732-938b17597f50",
        "s3-project-integ-test-temp173881580873072d18733-8fe4-43b1-83f7-95f25bb27ccf:c6f0f55b-5736-47c7-a3aa-1b8461a6d5ed"
    ]
}
```

------

# 教程：使用 SSH 连接到沙盒
<a name="sandbox-ssh-tutorial"></a>

本教程向您展示如何使用 SSH 客户端连接到 CodeBuild 沙箱。

要完成本教程，您首先必须：
+ 确保您已有 AWS CodeBuild 项目。
+ 设置为您的 CodeBuild 项目角色配置的相应 IAM 权限。
+ 在本地计算机 AWS CLI 上安装和配置。

## 步骤 1：启动沙盒
<a name="sandbox-ssh-tutorial.start-sandbox"></a>

**在控制台中启动 CodeBuild 沙箱**

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建项目**。选择构建项目，然后选择**调试构建**。  
![\[控制台中的构建项目详细信息页面。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/project-debug-build.png)

1. 在 **SSH 客户端**选项卡中，选择**启动沙盒**。  
![\[控制台中的“SSH 客户端”选项卡，带有“启动沙盒”按钮。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/ssh-client-sandbox.png)

1. 沙盒初始化过程可能需要一些时间。当沙盒的状态更改为 `RUN_SANDDBOX` 时，您可以连接到沙盒。  
![\[状态更改为“RUN_SANDDBOX”之后的 SSH 沙盒连接。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/run-sandbox.png)

## 步骤 2：修改本地 SSH 配置
<a name="sandbox-ssh-tutorial.modify-ssh"></a>

如果您是首次连接到沙盒，则需要使用以下步骤执行一次性设置过程：

**在控制台中修改本地 SSH 配置**

1. 找到适用于您的操作系统的安装命令。

1. 打开本地终端，然后复制并执行提供的命令，以下载并运行脚本来设置本地 SSH 配置。例如，如果您的操作系统是 macOS，请使用以下命令：  
![\[用于在控制台中通过 SSH 连接到 CodeBuild 沙箱的 macOS 命令。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/modify-ssh-macOS.png)

1. 配置脚本将添加连接到沙盒所需的配置。系统将提示您接受这些更改。

1. 成功配置后，将为 CodeBuild 沙盒创建一个新的 SSH 配置条目。  
![\[成功的 SSH 沙盒连接。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/ssh-terminal-success.png)

## 步骤 3：连接到沙盒
<a name="sandbox-ssh-tutorial.connect-sandbox"></a>

**在控制台中修改本地 SSH 配置**

1. 配置 AWS CLI 身份验证并确保您的 AWS CLI 用户拥有`codebuild:StartSandboxConnection`权限。有关更多信息，请参阅《AWS 命令行界面版本 1 的用户指南》**中的[在 AWS CLI中使用 IAM 用户凭证进行身份验证](https://docs.aws.amazon.com/cli/v1/userguide/cli-authentication-user.html)。

1. 使用以下命令连接到您的沙盒：

   ```
   ssh codebuild-sandbox-ssh=arn:aws:codebuild:us-east-1:<account-id>:sandbox/<sandbox-id>
   ```
**注意**  
要对连接失败进行故障排除，请使用 `-v` 标志启用详细输出。例如 `ssh -v codebuild-sandbox-ssh=arn:aws:codebuild:us-east-1:<account-id>:sandbox/<sandbox-id>`。  
有关其它故障排除指南，请参阅[AWS CodeBuild 沙箱 SSH 连接问题疑难解答](sandbox-troubleshooting.md)。

## 第 4 步：查看您的结果
<a name="sandbox-ssh-tutorial.review-results"></a>

连接后，您可以调试构建失败、测试构建命令、试验配置更改以及使用沙盒验证环境变量和依赖项。

# AWS CodeBuild 沙箱 SSH 连接问题疑难解答
<a name="sandbox-troubleshooting"></a>

使用本主题中的信息来帮助您识别、诊断和解决 CodeBuild 沙箱 SSH 连接问题。

**Topics**
+ [`StartSandboxConnection``InvalidInputException`SSH 进入 CodeBuild 沙盒环境时出错](#sandbox-troubleshooting.invalid-input)
+ [错误：SSH 进入 CodeBuild 沙盒环境时出现 “找不到凭证”](#sandbox-troubleshooting.credentials)
+ [`StartSandboxConnection``AccessDeniedException`SSH 进入 CodeBuild 沙盒环境时出错](#sandbox-troubleshooting.access-denied)
+ [SSH 进入 CodeBuild 沙盒环境时出现错误：“ssh：无法解析主机名”](#sandbox-troubleshooting.hostname)

## `StartSandboxConnection``InvalidInputException`SSH 进入 CodeBuild 沙盒环境时出错
<a name="sandbox-troubleshooting.invalid-input"></a>

**问题：**尝试使用命令连接到 CodeBuild 沙盒环境时`ssh codebuild-sandbox-ssh=<sandbox-arn>`，可能会遇到如下`InvalidInputException`错误：

```
An error occurred (InvalidInputException) when calling the StartSandboxConnection 
operation: Failed to start SSM session for {sandbox-arn}
User: arn:aws:sts::<account-ID>:assumed-role/<service-role-name>/AWSCodeBuild-<UUID> 
is not authorized to perform: ssm:StartSession on resource.
```

```
An error occurred (InvalidInputException) when calling the StartSandboxConnection 
operation: Failed to start SSM session for 
sandbox <sandbox-arn>: codebuild:<UUID> is not connected.
```

**可能的原因：**
+ 缺少 Amazon EC2 Systems Manager 代理：构建映像未正确地安装或配置 SSM 代理。
+ 权限不足： CodeBuild 项目服务角色缺少所需的 SSM 权限。

**建议的解决方案：**如果您针对构建使用自定义映像，请执行以下操作。

1. 安装 SSM 代理 有关更多信息，请参阅**中的[在适用于 Linux 的 Amazon EC2 实例上手动安装和卸载 SSM 代理](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-linux.html)。SSM 代理必须是 `3.0.1295.0` 或更高版本。

1. 将文件 [ https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/7.0/amazon-ssm-agent.js](https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/7.0/amazon-ssm-agent.json) on 复制到图像中的目录中。`/etc/amazon/ssm/`这将在 SSM 代理中启用**容器模式**。

1. 确保 CodeBuild 项目的服务角色具有以下权限，然后重新启动沙盒环境：

   ```
   {
      "Effect": "Allow",
         "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
         ],
         "Resource": "*"
    },
    {
       "Effect": "Allow",
       "Action": [
          "ssm:StartSession"
        ],
        "Resource": [
           "arn:aws:codebuild:region:account-id:build/*",
           "arn:aws:ssm:region::document/AWS-StartSSHSession"
        ]
    }
   ```

## 错误：SSH 进入 CodeBuild 沙盒环境时出现 “找不到凭证”
<a name="sandbox-troubleshooting.credentials"></a>

**问题：**尝试使用命令连接到 CodeBuild 沙盒环境时`ssh codebuild-sandbox-ssh=<sandbox-arn>`，可能会遇到以下凭据错误：

```
Unable to locate credentials. You can configure credentials by running 
"aws configure".
```

**可能的原因：**您的本地环境中未正确配置 AWS 凭证。

**推荐的解决方案：**按照官方文档[配置您的 AWS CLI 证书： AWS CLI在*版本 2 的AWS 命令行界面用户指南*中配置设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。

## `StartSandboxConnection``AccessDeniedException`SSH 进入 CodeBuild 沙盒环境时出错
<a name="sandbox-troubleshooting.access-denied"></a>

**问题：**尝试使用命令连接到 CodeBuild 沙盒环境时`ssh codebuild-sandbox-ssh=<sandbox-arn>`，可能会遇到以下权限错误：

```
An error occurred (AccessDeniedException) when calling the StartSandboxConnection 
operation: 
User: arn:aws:sts::account-id:assumed-role/role-name
is not authorized to perform: codebuild:StartSandboxConnection on resource: 
sandbox-arn
because no identity-based policy allows the codebuild:StartSandboxConnection action
```

**可能的原因：**您的 AWS 凭证缺少执行此操作所需的 CodeBuild 权限。

**推荐的解决方案：**确保与您的 AWS CLI 证书关联的 IAM 用户或角色具有以下权限：

```
{
    "Effect": "Allow",
    "Action": [
       "codebuild:StartSandboxConnection"
     ],
     "Resource": [
        "arn:aws:codebuild:region:account-id:sandbox/*"
     ]
}
```

## SSH 进入 CodeBuild 沙盒环境时出现错误：“ssh：无法解析主机名”
<a name="sandbox-troubleshooting.hostname"></a>

**问题：**尝试使用命令连接到 CodeBuild 沙盒环境时`ssh codebuild-sandbox-ssh=<sandbox-arn>`，遇到以下主机名解析错误：

```
ssh: Could not resolve hostname
```

**可能的原因：**此错误通常发生在本地环境中未正确执行所需的 CodeBuild 沙箱连接脚本时。

**建议的解决方案：**

1. 下载 CodeBuild 沙箱连接脚本。

1. 在终端中执行脚本以建立必要的 SSH 配置。

1. 重试与沙盒环境的 SSH 连接。

# 使用会话管理器调试构建
<a name="session-manager"></a>

在中 AWS CodeBuild，您可以暂停正在运行的构建，然后使用 AWS Systems Manager 会话管理器连接到生成容器并查看容器的状态。

**注意**  
此功能在 Windows 环境中不可用。

**Topics**
+ [先决条件](#ssm.prerequisites)
+ [暂停构建](#ssm-pause-build)
+ [启动构建。](#ssm-start-build)
+ [连接到构建容器](#ssm-connect)
+ [恢复构建](#ssm-resume-build)

## 先决条件
<a name="ssm.prerequisites"></a>

要允许会话管理器与构建会话一起使用，必须为构建启用会话连接。有两个先决条件：
+ CodeBuild Linux 标准精选映像已经安装了 SSM 代理并启用了 SSM 代理。 ContainerMode 

  如果您在针对构建使用自定义映像，请执行以下操作：

  1. 安装 SSM 代理 有关更多信息，请参阅《 AWS Systems Manager 用户指南》中的[在 Linux EC2 实例上手动安装 SSM 代理](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html)。SSM 代理必须是 3.0.1295.0 或更高版本。

  1. 将文件 [https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/5.0/amazon-ssm-agent.js](https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/5.0/amazon-ssm-agent.json) on 复制到图像中的目录中。`/etc/amazon/ssm/`这将在 SSM 代理中启用容器模式。
**注意**  
自定义映像需要最新的 SSM 代理才能使此功能按预期运行。
+  CodeBuild 服务角色必须具有以下 SSM 策略：

------
#### [ JSON ]

****  

  ```
  {
     "Version":"2012-10-17",		 	 	  
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
         ],
         "Resource": "*"
       }
     ]
  }
  ```

------

  在开始构建时，您可以让 CodeBuild 控制台自动将此策略附加到您的服务角色。您也可以将此策略手动附加到您的服务角色。
+ 如果您在 Systems Manager 首选项中启用了 “**审核和记录会话活动**”，则 CodeBuild 服务角色还必须具有其他权限。权限会有所不同，具体取决于日志的存储位置。  
CloudWatch 日志  
如果使用 CloudWatch 日志存储日志，请向 CodeBuild 服务角色添加以下权限：    
****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "logs:DescribeLogGroups",
              "Resource": "arn:aws:logs:us-east-1:111122223333:log-group:*:*"
          },
          {
              "Effect": "Allow",
              "Action": [
                  "logs:CreateLogStream",
                  "logs:PutLogEvents"
              ],
              "Resource": "arn:aws:logs:us-east-1:111122223333:log-group:MyLogGroup:*"
          }
      ]
  }
  ```  
Amazon S3  
如果使用 Amazon S3 存储您的日志，请向 CodeBuild 服务角色添加以下权限：    
****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "s3:GetEncryptionConfiguration",
          "s3:PutObject"
        ],
        "Resource": [
          "arn:aws:s3:::<bucket-name>",
          "arn:aws:s3:::<bucket-name>/*"
        ]
      }
    ]
  }
  ```

  有关更多信息，请参阅《AWS Systems Manager 用户指南》**中的[审核和记录会话活动](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-logging-auditing.html)。

## 暂停构建
<a name="ssm-pause-build"></a>

要暂停构建，请在构建规范文件中的任意构建阶段插入 **codebuild-breakpoint** 命令。此时将暂停构建，这样您就可以连接到构建容器并查看当前状态下的容器。

例如，将以下内容添加到您的构建规范文件中的构建阶段。

```
phases:
  pre_build:
    commands:
      - echo Entered the pre_build phase...
      - echo "Hello World" > /tmp/hello-world
      - codebuild-breakpoint
```

此代码会创建 `/tmp/hello-world` 文件，然后在此时暂停构建。

## 启动构建。
<a name="ssm-start-build"></a>

要允许会话管理器与构建会话一起使用，必须为构建启用会话连接。为此，开始构建时，请按照以下步骤执行：

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建项目**。选择构建项目，然后选择**使用覆盖启动构建**。

1. 选择**高级构建覆盖**。

1. 在**环境**部分中，选择**启用会话连接**选项。如果未选择此选项，则会忽略所有 **codebuild-breakpoint** 和 **codebuild-resume** 命令。

1. 执行任何其他所需更改，然后选择**启动构建**。

1. 在控制台中监控构建状态。当会话可用时，**AWS 会话管理器**链接将显示在**构建状态**部分中。

## 连接到构建容器
<a name="ssm-connect"></a>

您可以通过以下两种方式之一连接到构建容器：

CodeBuild 控制台  
在 Web 浏览器中，打开 **AWS 会话管理器**链接以连接到构建容器。将打开一个终端会话，允许您浏览和控制构建容器。

AWS CLI  
您的本地计算机必须安装会话管理器插件才能执行此过程。有关更多信息，请参阅《 AWS Systems Manager 用户指南[》中的 “安装适用于 AWS CLI 的会话管理器插件](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)”。

1. 使用构建 ID 调用 **batch-get-builds** api 以获取有关构建的信息，包括会话目标标识符。会话目标标识符属性名称因 `aws` 命令的输出类型而异。这就是为什么要将 `--output json` 添加到命令中。

   ```
   aws codebuild batch-get-builds --ids <buildID> --region <region> --output json
   ```

1. 复制 `sessionTarget` 属性值。`sessionTarget` 属性名称会因 `aws` 命令的输出类型而异。这就是在上一步骤中将 `--output json` 添加到命令中的原因。

1. 使用以下命令连接到构建容器。

   ```
   aws ssm start-session --target <sessionTarget> --region <region>
   ```

在此示例中，请验证 `/tmp/hello-world` 文件是否存在且包含文本 `Hello World`。

## 恢复构建
<a name="ssm-resume-build"></a>

完成对构建容器的检查后，从容器 shell 中发出 **codebuild-resume** 命令。

```
$ codebuild-resume
```

# 在 AWS CodeBuild 中删除构建
<a name="delete-builds"></a>

可以使用 AWS CLI 或 AWS 开发工具包删除 AWS CodeBuild 中的构建。

**Topics**
+ [删除构建 (AWS CLI)](#delete-builds-cli)
+ [删除构建（AWS 开发工具包）](#delete-builds-sdks)

## 删除构建 (AWS CLI)
<a name="delete-builds-cli"></a>

运行 `batch-delete-builds` 命令：

```
aws codebuild batch-delete-builds --ids ids
```

在上述命令中，替换以下占位符：
+ *id*：必填字符串。要删除的构建的 ID。要指定多个构建，请用空格将每个构建 ID 分隔开。要获取构建 ID 的列表，请参阅以下主题：
  + [查看 build IDs (AWS CLI) 列表](view-build-list.md#view-build-list-cli)
  + [查看构建 IDs 项目的构建列表 (AWS CLI)](view-builds-for-project.md#view-builds-for-project-cli)

如果成功，`buildsDeleted` 数组将显示在输出中，其中包含已成功删除的每个构建的 Amazon 资源名称 (ARN)。有关未成功删除的构建的信息将显示在输出中的 `buildsNotDeleted` 数组中。

例如，如果您运行此命令：

```
aws codebuild batch-delete-builds --ids my-demo-build-project:f8b888d2-5e1e-4032-8645-b115195648EX my-other-demo-build-project:a18bc6ee-e499-4887-b36a-8c90349c7eEX
```

与以下内容类似的信息将显示在输出中：

```
{
  "buildsNotDeleted": [
    {
      "id": "arn:aws:codebuild:us-west-2:123456789012:build/my-demo-build-project:f8b888d2-5e1e-4032-8645-b115195648EX",
      "statusCode": "BUILD_IN_PROGRESS"
    }
  ], 
  "buildsDeleted": [
    "arn:aws:codebuild:us-west-2:123456789012:build/my-other-demo-build-project:a18bc6ee-e499-4887-b36a-8c90349c7eEX"
  ]
}
```

## 删除构建（AWS 开发工具包）
<a name="delete-builds-sdks"></a>

有关将 AWS CodeBuild 与 AWS 开发工具包结合使用的信息，请参阅 [AWS SDKs 和工具参考](sdk-ref.md)。

# 在中手动重试构建 AWS CodeBuild
<a name="retry-build"></a>

您可以使用 AWS CodeBuild 控制台 AWS CLI、或手动 AWS SDKs 重试单次构建或批量构建。 AWS CodeBuild

**Topics**
+ [手动重试构建（控制台）](#retry-build-console)
+ [手动重试构建（AWS CLI）](#retry-build-cli)
+ [手动重试构建（AWS SDKs）](#retry-build-sdks)

## 手动重试构建（控制台）
<a name="retry-build-console"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 请执行以下操作之一：
   + 如果显示***build-project-name*:*build-ID***页面，请选择 “**重试构建**”。
   + 在导航窗格中，选择**构建历史记录**。在构建列表中，选中构建的框，然后选择**重试构建**。
   + 在导航窗格中，选择**构建项目**。在构建项目列表中的**名称**列，选择构建项目名称的链接。在构建列表中，选中构建的框，然后选择**重试构建**。

**注意**  
默认情况下，仅显示最新的 100 个构建或构建项目。要查看更多构建或构建项目，请选择齿轮图标，然后为**每页构建数**或**每页项目数**选择其他值，或者使用向后和向前箭头。

## 手动重试构建（AWS CLI）
<a name="retry-build-cli"></a>
+ 运行 **retry-build** 命令：

  ```
  aws codebuild retry-build --id <build-id> --idempotency-token <idempotencyToken>
  ```

  在上述命令中，替换以下占位符：
  + *<build-id>*: 必填字符串。要重试的构建或批量构建的 ID。要获取版本列表 IDs，请参阅以下主题：
    + [查看 build IDs (AWS CLI) 列表](view-build-list.md#view-build-list-cli)
    + [查看批量生成列表 IDs (AWS CLI)](view-build-list.md#view-batch-build-list-cli)
    + [查看构建 IDs 项目的构建列表 (AWS CLI)](view-builds-for-project.md#view-builds-for-project-cli)
    + [查看构建项目的批 IDs 量生成列表 (AWS CLI)](view-builds-for-project.md#view-batch-builds-for-project-cli)
  + `--idempotency-token`: 可选。如果您运行带该选项的 **retry-build** 命令，则 `retry-build` 请求将附带唯一的区分大小写的标识符或令牌。令牌在发出请求后的 5 分钟内有效。如果您使用相同的令牌重复`retry-build`请求，但更改了参数，则 CodeBuild 会返回参数不匹配错误。

## 手动重试构建（AWS SDKs）
<a name="retry-build-sdks"></a>

有关 AWS CodeBuild 与一起使用的更多信息 AWS SDKs，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。

# 在 AWS CodeBuild 中自动重试构建
<a name="auto-retry-build"></a>

您可以使用 AWS CodeBuild 控制台、AWS CLI 或 AWS SDK 在 AWS CodeBuild 中自动重试构建。启用自动重试功能后，CodeBuild 将在构建失败后使用项目的服务角色自动调用 `RetryBuild`，直至达到指定限制。例如，如果自动重试限制设置为二，则 CodeBuild 将调用 `RetryBuild` API 来自动重试您的构建，最多再重试两次。

**注意**  
CodeBuild 不支持 CodePipeline 的自动重试。

**Topics**
+ [自动重试构建（控制台）](#auto-retry-build-console)
+ [自动重试构建（AWS CLI）](#auto-retry-build-cli)
+ [自动重试构建（AWS SDK）](#auto-retry-build-sdks)

## 自动重试构建（控制台）
<a name="auto-retry-build-console"></a>

1. 从 [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 打开 AWS CodeBuild 控制台。

1. 选择**创建项目**。有关更多信息，请参阅 [创建构建项目（控制台）](create-project.md#create-project-console) 和 [运行构建（控制台）](run-build-console.md)。
   +  在**环境**中：
     +  对于**自动重试限制**，请输入在构建失败后希望进行的最大自动重试次数。

1. 在**环境**中，选择**其他配置**。

1. 继续使用默认值，然后选择**创建构建项目**。

## 自动重试构建（AWS CLI）
<a name="auto-retry-build-cli"></a>
+ 运行 **create-project** 命令：

  ```
  aws codebuild create-project \
      --name "<project-name>" \
      --auto-retry-limit <auto-retry-limit> \
      --source "<source>" \
      --artifacts {<artifacts>} \
      --environment "{\"type\": \"environment-type>\",\"image\": \"image-type>\",\"computeType\": \"compute-type>\"}" \
      --service-role "service-role>"
  ```

  替换上一命令中的以下占位符：
  + *<auto-retry-limit>*：将自动重试限制设置为构建失败后希望进行的最大自动重试次数。
  + *<project-name>*、*<source>*、*<artifacts>*、*<environment-type>*、*<image-type>*、*<compute-type>* 和 *<service-role>*：设置所需的项目配置设置。

## 自动重试构建（AWS SDK）
<a name="auto-retry-build-sdks"></a>

有关将 AWS CodeBuild 与 AWS 开发工具包结合使用的更多信息，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。

# 在 AWS CodeBuild 中停止构建
<a name="stop-build"></a>

您可以使用 AWS CodeBuild 控制台、AWS CLI 或 AWS 开发工具包在 AWS CodeBuild 中停止构建。

**Topics**
+ [停止构建（控制台）](#stop-build-console)
+ [停止构建（AWS CLI）](#stop-build-cli)
+ [停止构建（AWS 开发工具包）](#stop-build-sdks)

## 停止构建（控制台）
<a name="stop-build-console"></a>

1. 从 [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 打开 AWS CodeBuild 控制台。

1. 请执行以下操作之一：
   + 如果显示了 ***build-project-name*:*build-ID*** 页面，请选择**停止构建**。
   + 在导航窗格中，选择**构建历史记录**。在构建列表中，选中构建的框，然后选择**停止构建**。
   + 在导航窗格中，选择**构建项目**。在构建项目列表中的**名称**列，选择构建项目名称的链接。在构建列表中，选中构建的框，然后选择**停止构建**。

**注意**  
默认情况下，仅显示最新的 100 个构建或构建项目。要查看更多构建或构建项目，请选择齿轮图标，然后为**每页构建数**或**每页项目数**选择其他值，或者使用向后和向前箭头。  
如果 AWS CodeBuild 无法成功停止构建（例如，构建过程已完成），则**停止**按钮将禁用或者不显示。

## 停止构建（AWS CLI）
<a name="stop-build-cli"></a>
+ 运行 **stop-build** 命令：

  ```
  aws codebuild stop-build --id id
  ```

  在上述命令中，替换以下占位符：
  + *id*：必填字符串。要停止的构建的 ID。要获取构建 ID 的列表，请参阅以下主题：
    + [查看 build IDs (AWS CLI) 列表](view-build-list.md#view-build-list-cli)
    + [查看构建 IDs 项目的构建列表 (AWS CLI)](view-builds-for-project.md#view-builds-for-project-cli)

  如果 AWS CodeBuild 成功停止构建，则输出中 `buildStatus` 对象的 `build` 值将为 `STOPPED`。

  如果 CodeBuild 无法成功停止构建（例如，构建已完成），则输出中 `build` 对象的 `buildStatus` 值将为最终构建状态（例如，`SUCCEEDED`）。

## 停止构建（AWS 开发工具包）
<a name="stop-build-sdks"></a>

有关将 AWS CodeBuild 与 AWS 开发工具包结合使用的更多信息，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。

# 在 AWS CodeBuild 中停止批量构建
<a name="stop-batch-build"></a>

您可以使用 AWS CodeBuild 控制台、AWS CLI 或 AWS 开发工具包在 AWS CodeBuild 中停止批量构建。

**注意**  
如果您在批量构建中使用 Lambda 计算，则无法停止正在进行的 Lambda 构建。

**Topics**
+ [停止批量构建（控制台）](#stop-batch-build-console)
+ [停止批量构建（AWS CLI）](#stop-batch-build-cli)
+ [停止批量构建（AWS 开发工具包）](#stop-batch-build-sdks)

## 停止批量构建（控制台）
<a name="stop-batch-build-console"></a>

1. 从 [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 打开 AWS CodeBuild 控制台。

1. 请执行以下操作之一：
   + 如果显示了 ***build-project-name*:*build-ID*** 页面，请选择**停止构建**。
   + 在导航窗格中，选择**构建历史记录**。在构建列表中，选中构建的框，然后选择**停止构建**。
   + 在导航窗格中，选择**构建项目**。在构建项目列表中的**名称**列，选择构建项目名称的链接。在构建列表中，选中构建的框，然后选择**停止构建**。

**注意**  
默认情况下，仅显示最新的 100 个构建或构建项目。要查看更多构建或构建项目，请选择齿轮图标，然后为**每页构建数**或**每页项目数**选择其他值，或者使用向后和向前箭头。

## 停止批量构建（AWS CLI）
<a name="stop-batch-build-cli"></a>
+ 运行 [https://docs.aws.amazon.com/cli/latest/reference/codebuild/stop-build-batch.html](https://docs.aws.amazon.com/cli/latest/reference/codebuild/stop-build-batch.html) 命令：

  ```
  aws codebuild stop-build-batch --id <batch-build-id>
  ```

  在上述命令中，替换以下占位符：
  + *<batch-build-id>*：必填字符串。要停止的批量构建的标识符。要获取批量构建标识符的列表，请参阅以下主题：
    + [查看批量生成列表 IDs (AWS CLI)](view-build-list.md#view-batch-build-list-cli)
    + [查看构建项目的批 IDs 量生成列表 (AWS CLI)](view-builds-for-project.md#view-batch-builds-for-project-cli)

## 停止批量构建（AWS 开发工具包）
<a name="stop-batch-build-sdks"></a>

有关将 AWS CodeBuild 与 AWS 开发工具包结合使用的更多信息，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。

# 自动触发 AWS CodeBuild 构建
<a name="build-triggers"></a>

您可以在项目上创建触发器以安排每小时、每天或每周进行一次构建。您也可以编辑触发器以将自定义规则与 Amazon CloudWatch cron 表达式结合使用。例如，通过使用 cron 表达式，您可以安排在每个工作日的特定时间进行构建。有关创建和编辑触发器的信息，请参阅[创建 AWS CodeBuild 触发器](#trigger-create)和[编辑 AWS CodeBuild 触发器](triggers-edit.md)。

**Topics**
+ [创建 AWS CodeBuild 触发器](#trigger-create)
+ [编辑 AWS CodeBuild 触发器](triggers-edit.md)

## 创建 AWS CodeBuild 触发器
<a name="trigger-create"></a>

您可以在项目上创建触发器以安排每小时、每天或每周进行一次构建。您也可以将自定义规则与 Amazon CloudWatch cron 表达式结合使用来创建触发器。例如，通过使用 cron 表达式，您可以安排在每个工作日的特定时间进行构建。

**注意**  
无法通过构建触发器、Amazon EventBridge 事件或 AWS Step Functions 任务启动批量构建。

**Topics**
+ [创建 AWS CodeBuild 触发器（控制台）](#trigger-create-console)
+ [以编程方式创建 AWS CodeBuild 触发器](#trigger-create-code)

### 创建 AWS CodeBuild 触发器（控制台）
<a name="trigger-create-console"></a>

按照以下过程使用 AWS 管理控制台 创建触发器。

**创建触发器** 

1. 从 [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建项目**。

1. 选择要将触发器添加到的构建项目的链接，然后选择**构建触发器**选项卡。
**注意**  
默认情况下，会显示 100 个最新的构建项目。要查看更多构建项目，请选择齿轮图标，然后为**每页项目数**选择不同值，或使用向后和向前箭头。

1. 选择**创建触发器**。

1. 在**触发器名称**中输入名称。

1. 从**频率**下拉列表中，选择触发器的频率。如果要使用 Cron 表达式创建频率，请选择**自定义**。

1. 为触发器的频率指定参数。您可以在文本框中输入您的选项的前几个字符以筛选下拉菜单项。
**注意**  
 开始小时和分钟是从零开始的。开始分钟是一个介于 0 和 59 之间的数字。开始小时是一个介于 0 和 23 之间的数字。例如，每天下午 12:15 开始的每日触发器的开始小时为 12，开始分钟为 15。每天午夜开始的每日触发器的开始小时为 0，开始分钟为 0。每天下午 11:59 开始的每日触发器的开始小时为 12，开始分钟为 15。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/build-triggers.html)

1.  选择**启用此触发器**。

1.  （可选）展开**高级**部分。在**源版本**中，键入源的版本。
   +  对于 Amazon S3，输入与您要构建的输入构件的版本相对应的版本 ID。如果**源版本**留空，则使用最新版本。
   +  对于 AWS CodeCommit，键入一个提交 ID。如果**源版本**留空，则使用默认分支的 HEAD 提交 ID。
   + 对于 GitHub 或 GitHub Enterprise，请键入提交 ID、拉取请求 ID、分支名称或与您要构建的源代码版本对应的标签名称。如果您要指定拉取请求 ID，则必须使用格式 `pr/pull-request-ID`（例如，`pr/25`）。如果您要指定分支名称，则将使用分支的 HEAD 提交 ID。如果**源版本**留空，则将使用默认分支的 HEAD 提交 ID。
   + 对于 Bitbucket，键入提交 ID、分支名称或与您要构建的源代码版本对应的标签名称。如果您要指定分支名称，则将使用分支的 HEAD 提交 ID。如果**源版本**留空，则将使用默认分支的 HEAD 提交 ID。

1. （可选）指定介于 5 分钟和 2160 分钟（36 小时）之间的超时。此值指定 AWS CodeBuild 在停止前尝试构建的时间长度。如果**小时**和**分钟**保留为空，则使用项目中指定的默认超时值。

1. 选择**创建触发器**。

### 以编程方式创建 AWS CodeBuild 触发器
<a name="trigger-create-code"></a>

CodeBuild 使用Amazon EventBridge 规则来构建触发器。您可以使用 EventBridge API 以编程方式为您的 CodeBuild 项目创建构建触发器。有关更多信息，请参阅《[Amazon EventBridge API 参考](https://docs.aws.amazon.com/eventbridge/latest/APIReference/)》。

# 编辑 AWS CodeBuild 触发器
<a name="triggers-edit"></a>

您可以在项目上编辑触发器以安排每小时、每天或每周进行一次构建。您也可以编辑触发器以将自定义规则与 Amazon CloudWatch cron 表达式结合使用。例如，通过使用 cron 表达式，您可以安排在每个工作日的特定时间进行构建。有关创建触发器的信息，请参阅[创建 AWS CodeBuild 触发器](build-triggers.md#trigger-create)。

**Topics**
+ [编辑 AWS CodeBuild 触发器（控制台）](#triggers-edit-console)
+ [以编程方式编辑 AWS CodeBuild 触发器](#trigger-edit-code)

## 编辑 AWS CodeBuild 触发器（控制台）
<a name="triggers-edit-console"></a>

按照以下过程使用 AWS 管理控制台 编辑触发器。

**要编辑触发器，请执行以下操作：**

1. 从 [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建项目**。

1. 选择要更改的构建项目的链接，然后选择**构建触发器**选项卡。
**注意**  
默认情况下，会显示 100 个最新的构建项目。要查看更多构建项目，请选择齿轮图标，然后为**每页项目数**选择不同值，或使用向后和向前箭头。

1. 选择您要更改的触发器旁边的单选按钮，然后选择**编辑**。

1. 从**频率**下拉列表中，选择触发器的频率。如果要使用 Cron 表达式创建频率，请选择**自定义**。

1. 为触发器的频率指定参数。您可以在文本框中输入您的选项的前几个字符以筛选下拉菜单项。
**注意**  
 开始小时和分钟是从零开始的。开始分钟是一个介于 0 和 59 之间的数字。开始小时是一个介于 0 和 23 之间的数字。例如，每天下午 12:15 开始的每日触发器的开始小时为 12，开始分钟为 15。每天午夜开始的每日触发器的开始小时为 0，开始分钟为 0。每天下午 11:59 开始的每日触发器的开始小时为 12，开始分钟为 15。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/triggers-edit.html)

1.  选择**启用此触发器**。

**注意**  
您可以在 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 使用 Amazon CloudWatch 控制台，以编辑源版本、超时以及 AWS CodeBuild 中未提供的其他选项。

## 以编程方式编辑 AWS CodeBuild 触发器
<a name="trigger-edit-code"></a>

CodeBuild 使用Amazon EventBridge 规则来构建触发器。您可以使用 EventBridge API 以编程方式为您的 CodeBuild 项目编辑构建触发器。有关更多信息，请参阅《[Amazon EventBridge API 参考](https://docs.aws.amazon.com/eventbridge/latest/APIReference/)》。

# 在中查看版本详情 AWS CodeBuild
<a name="view-build-details"></a>

您可以使用 AWS CodeBuild 控制台 AWS CLI、或 AWS SDKs 来查看有关由管理的版本的详细信息 CodeBuild。

**Topics**
+ [查看构建详细信息（控制台）](#view-build-details-console)
+ [查看构建详细信息（AWS CLI）](#view-build-details-cli)
+ [查看构建详细信息（AWS SDKs）](#view-build-details-sdks)
+ [构建阶段过渡](view-build-details-phases.md)

## 查看构建详细信息（控制台）
<a name="view-build-details-console"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 请执行以下操作之一：
   + 在导航窗格中，选择**构建历史记录**。在构建列表中的**构建运行**列，选择构建的链接。
   + 在导航窗格中，选择**构建项目**。在构建项目列表中的**名称**列，选择构建项目名称的链接。然后，在构建列表中的**构建运行**列，选择构建的链接。
**注意**  
默认情况下，仅显示最新的 10 个构建或构建项目。要查看更多构建或构建项目，请选择齿轮图标，然后为**每页构建数**或**每页项目数**选择其他值，或者使用向后和向前箭头。

## 查看构建详细信息（AWS CLI）
<a name="view-build-details-cli"></a>

有关 AWS CLI 搭配使用的更多信息 AWS CodeBuild，请参阅[命令行参考](cmd-ref.md)。

运行 **batch-get-builds** 命令：

```
aws codebuild batch-get-builds --ids ids
```

替换以下占位符：
+ *ids*: 必填字符串。 IDs 要查看其详细信息的一个或多个版本。要指定多个构建 ID，请用空格分隔各个构建 ID。您最多可以指定 100 个版本 IDs。要获取版本列表 IDs，请参阅以下主题：
  + [查看 build IDs (AWS CLI) 列表](view-build-list.md#view-build-list-cli)
  + [查看构建 IDs 项目的构建列表 (AWS CLI)](view-builds-for-project.md#view-builds-for-project-cli)

例如，如果您运行此命令：

```
aws codebuild batch-get-builds --ids codebuild-demo-project:e9c4f4df-3f43-41d2-ab3a-60fe2EXAMPLE codebuild-demo-project:815e755f-bade-4a7e-80f0-efe51EXAMPLE my-other-project:813bb6c6-891b-426a-9dd7-6d8a3EXAMPLE
```

如果命令成功，与[查看汇总的构建信息](getting-started-overview.md#getting-started-cli-monitor-build-cli)中所述内容类似的数据将出现在输出中。

## 查看构建详细信息（AWS SDKs）
<a name="view-build-details-sdks"></a>

有关 AWS CodeBuild 与一起使用的更多信息 AWS SDKs，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。

# 构建阶段过渡
<a name="view-build-details-phases"></a>

分阶段 AWS CodeBuild 进行构建：



![\[各个 CodeBuild 阶段。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/build-phases.png)




**重要**  
系统始终尝试 `UPLOAD_ARTIFACTS` 阶段，即使 `BUILD` 阶段失败。

# 查看内置 IDs 列表 AWS CodeBuild
<a name="view-build-list"></a>

您可以使用 AWS CodeBuild 控制台 AWS CLI、或 AWS SDKs 来查看由管理的版本 IDs 的版本列表 CodeBuild。

**Topics**
+ [查看版本列表 IDs （控制台）](#view-build-list-console)
+ [查看 build IDs (AWS CLI) 列表](#view-build-list-cli)
+ [查看批量生成列表 IDs (AWS CLI)](#view-batch-build-list-cli)
+ [查看 build IDs (AWS SDKs) 列表](#view-build-list-sdks)

## 查看版本列表 IDs （控制台）
<a name="view-build-list-console"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 在导航窗格中，选择**构建历史记录**。
**注意**  
默认情况下，仅显示 10 个最新构建。要查看更多构建，请选择齿轮图标，然后为**每页构建数**选择不同值，或使用向后和向前箭头。

## 查看 build IDs (AWS CLI) 列表
<a name="view-build-list-cli"></a>

有关 AWS CLI 搭配使用的更多信息 CodeBuild，请参阅[命令行参考](cmd-ref.md)。
+ 运行 **list-builds** 命令：

  ```
  aws codebuild list-builds --sort-order sort-order --next-token next-token
  ```

  替换上一命令中的以下占位符：
  + *sort-order*：用于指示如何列出版本的可选字符串 IDs。有效值包括 `ASCENDING` 和 `DESCENDING`。
  + *next-token*: 可选字符串。在上次运行时，如果列表中有 100 个以上的项目，则只能返回前 100 个项目，以及名为*下一个令牌*的唯一字符串。要获取列表中的下一批项目，请再次运行此命令，将下一个令牌添加到调用中。要获取列表中的所有项目，请利用每个后续的下一个令牌运行此命令，直到不再返回下一个令牌。

  例如，如果您运行此命令：

  ```
  aws codebuild list-builds --sort-order ASCENDING
  ```

  与以下内容类似的结果可能会出现在输出中：

  ```
  {
    "nextToken": "4AEA6u7J...The full token has been omitted for brevity...MzY2OA==",
    "ids": [
      "codebuild-demo-project:815e755f-bade-4a7e-80f0-efe51EXAMPLE"
      "codebuild-demo-project:84a7f3d1-d40e-4956-b4cf-7a9d4EXAMPLE"
      ... The full list of build IDs has been omitted for brevity ...
      "codebuild-demo-project:931d0b72-bf6f-4040-a472-5c707EXAMPLE"
    ]
  }
  ```

  如果您再次运行此命令：

  ```
  aws codebuild list-builds --sort-order ASCENDING --next-token 4AEA6u7J...The full token has been omitted for brevity...MzY2OA==
  ```

  与以下内容类似的结果可能会出现在输出中：

  ```
  {
    "ids": [
      "codebuild-demo-project:49015049-21cf-4b50-9708-df115EXAMPLE",
      "codebuild-demo-project:543e7206-68a3-46d6-a4da-759abEXAMPLE",
      ... The full list of build IDs has been omitted for brevity ...
      "codebuild-demo-project:c282f198-4582-4b38-bdc0-26f96EXAMPLE"
    ]
  }
  ```

## 查看批量生成列表 IDs (AWS CLI)
<a name="view-batch-build-list-cli"></a>

有关 AWS CLI 搭配使用的更多信息 CodeBuild，请参阅[命令行参考](cmd-ref.md)。
+ 运行 **list-build-batches** 命令：

  ```
  aws codebuild list-build-batches --sort-order sort-order --next-token next-token
  ```

  替换上一命令中的以下占位符：
  + *sort-order*：用于指示如何列出批处理版本的可选字符串 IDs。有效值包括 `ASCENDING` 和 `DESCENDING`。
  + *next-token*: 可选字符串。在上次运行时，如果列表中有 100 个以上的项目，则只能返回前 100 个项目，以及名为*下一个令牌*的唯一字符串。要获取列表中的下一批项目，请再次运行此命令，将下一个令牌添加到调用中。要获取列表中的所有项目，请利用每个后续的下一个令牌运行此命令，直到不再返回下一个令牌。

  例如，如果您运行此命令：

  ```
  aws codebuild list-build-batches --sort-order ASCENDING
  ```

  与以下内容类似的结果可能会出现在输出中：

  ```
  {
    "nextToken": "4AEA6u7J...The full token has been omitted for brevity...MzY2OA==",
    "ids": [
      "codebuild-demo-project:815e755f-bade-4a7e-80f0-efe51EXAMPLE"
      "codebuild-demo-project:84a7f3d1-d40e-4956-b4cf-7a9d4EXAMPLE"
      ... The full list of build IDs has been omitted for brevity ...
      "codebuild-demo-project:931d0b72-bf6f-4040-a472-5c707EXAMPLE"
    ]
  }
  ```

  如果您再次运行此命令：

  ```
  aws codebuild list-build-batches --sort-order ASCENDING --next-token 4AEA6u7J...The full token has been omitted for brevity...MzY2OA==
  ```

  与以下内容类似的结果可能会出现在输出中：

  ```
  {
    "ids": [
      "codebuild-demo-project:49015049-21cf-4b50-9708-df115EXAMPLE",
      "codebuild-demo-project:543e7206-68a3-46d6-a4da-759abEXAMPLE",
      ... The full list of build IDs has been omitted for brevity ...
      "codebuild-demo-project:c282f198-4582-4b38-bdc0-26f96EXAMPLE"
    ]
  }
  ```

## 查看 build IDs (AWS SDKs) 列表
<a name="view-build-list-sdks"></a>

有关 CodeBuild 与一起使用的更多信息 AWS SDKs，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。

# 在中查看构建 IDs 项目的构建列表 AWS CodeBuild
<a name="view-builds-for-project"></a>

您可以使用 AWS CodeBuild 控制台 AWS CLI、或 AWS SDKs 来查看中构建 IDs 项目的生成列表 CodeBuild。

**Topics**
+ [查看构建 IDs 项目的构建列表（控制台）](#view-builds-for-project-console)
+ [查看构建 IDs 项目的构建列表 (AWS CLI)](#view-builds-for-project-cli)
+ [查看构建项目的批 IDs 量生成列表 (AWS CLI)](#view-batch-builds-for-project-cli)
+ [查看构建 IDs 项目的构建列表 (AWS SDKs)](#view-builds-for-project-sdks)

## 查看构建 IDs 项目的构建列表（控制台）
<a name="view-builds-for-project-console"></a>

1. 打开 CodeBuild 控制台，网址为[https://console.aws.amazon.com/codebuild/](https://console.aws.amazon.com/codebuild/)。

1. 在导航窗格中，选择**构建项目**。在构建项目列表中的**名称**列中，选择构建项目。

**注意**  
默认情况下，仅显示最新的 100 个构建或构建项目。要查看更多构建或构建项目，请选择齿轮图标，然后为**每页构建数**或**每页项目数**选择其他值，或者使用向后和向前箭头。

## 查看构建 IDs 项目的构建列表 (AWS CLI)
<a name="view-builds-for-project-cli"></a>

有关 AWS CLI 搭配使用的更多信息 AWS CodeBuild，请参阅[命令行参考](cmd-ref.md)。

运行 **list-builds-for-project** 命令，如下所示：

```
aws codebuild list-builds-for-project --project-name project-name --sort-order sort-order --next-token next-token
```

替换上一命令中的以下占位符：
+ *project-name*：必填字符串，用于表示要列出构建版本 IDs 的生成项目的名称。要获取构建项目的列表，请参阅[查看构建项目名称的列表 (AWS CLI)](view-project-list.md#view-project-list-cli)。
+ *sort-order*：用于指示如何列出版本的可选字符串 IDs。有效值包括 `ASCENDING` 和 `DESCENDING`。
+ *next-token*: 可选字符串。在上次运行时，如果列表中有 100 个以上的项目，则只能返回前 100 个项目，以及名为*下一个令牌*的唯一字符串。要获取列表中的下一批项目，请再次运行此命令，将下一个令牌添加到调用中。要获取列表中的所有项目，请借助随后返回的每个后续令牌不断运行此命令，直到不再返回后续令牌。

例如，如果您按照类似以下的方式运行此命令：

```
aws codebuild list-builds-for-project --project-name codebuild-demo-project --sort-order ASCENDING
```

输出中可能会显示类似于以下内容的结果：

```
{
  "nextToken": "4AEA6u7J...The full token has been omitted for brevity...MzY2OA==",
  "ids": [
    "codebuild-demo-project:9b175d16-66fd-4e71-93a0-50a08EXAMPLE"
    "codebuild-demo-project:a9d1bd09-18a2-456b-8a36-7d65aEXAMPLE"
    ... The full list of build IDs has been omitted for brevity ...
    "codebuild-demo-project:fe70d102-c04f-421a-9cfa-2dc15EXAMPLE"
  ]
}
```

如果您再次运行此命令：

```
aws codebuild list-builds-for-project --project-name codebuild-demo-project --sort-order ASCENDING --next-token 4AEA6u7J...The full token has been omitted for brevity...MzY2OA==
```

您可能会看到类似于以下输出的结果：

```
{
  "ids": [
    "codebuild-demo-project:98253670-7a8a-4546-b908-dc890EXAMPLE"
    "codebuild-demo-project:ad5405b2-1ab3-44df-ae2d-fba84EXAMPLE"
    ... The full list of build IDs has been omitted for brevity ...
    "codebuild-demo-project:f721a282-380f-4b08-850a-e0ac1EXAMPLE"
  ]
}
```

## 查看构建项目的批 IDs 量生成列表 (AWS CLI)
<a name="view-batch-builds-for-project-cli"></a>

有关 AWS CLI 搭配使用的更多信息 AWS CodeBuild，请参阅[命令行参考](cmd-ref.md)。

运行 **list-build-batches-for-project** 命令，如下所示：

```
aws codebuild list-build-batches-for-project --project-name project-name --sort-order sort-order --next-token next-token
```

替换上一命令中的以下占位符：
+ *project-name*：必填字符串，用于表示要列出构建版本 IDs 的生成项目的名称。要获取构建项目的列表，请参阅[查看构建项目名称的列表 (AWS CLI)](view-project-list.md#view-project-list-cli)。
+ *sort-order*：用于指示如何列出版本的可选字符串 IDs。有效值包括 `ASCENDING` 和 `DESCENDING`。
+ *next-token*: 可选字符串。在上次运行时，如果列表中有 100 个以上的项目，则只能返回前 100 个项目，以及名为*下一个令牌*的唯一字符串。要获取列表中的下一批项目，请再次运行此命令，将下一个令牌添加到调用中。要获取列表中的所有项目，请借助随后返回的每个后续令牌不断运行此命令，直到不再返回后续令牌。

例如，如果您按照类似以下的方式运行此命令：

```
aws codebuild list-build-batches-for-project --project-name codebuild-demo-project --sort-order ASCENDING
```

输出中可能会显示类似于以下内容的结果：

```
{
  "nextToken": "4AEA6u7J...The full token has been omitted for brevity...MzY2OA==",
  "ids": [
    "codebuild-demo-project:9b175d16-66fd-4e71-93a0-50a08EXAMPLE"
    "codebuild-demo-project:a9d1bd09-18a2-456b-8a36-7d65aEXAMPLE"
    ... The full list of build IDs has been omitted for brevity ...
    "codebuild-demo-project:fe70d102-c04f-421a-9cfa-2dc15EXAMPLE"
  ]
}
```

如果您再次运行此命令：

```
aws codebuild list-build-batches-for-project --project-name codebuild-demo-project --sort-order ASCENDING --next-token 4AEA6u7J...The full token has been omitted for brevity...MzY2OA==
```

您可能会看到类似于以下输出的结果：

```
{
  "ids": [
    "codebuild-demo-project:98253670-7a8a-4546-b908-dc890EXAMPLE"
    "codebuild-demo-project:ad5405b2-1ab3-44df-ae2d-fba84EXAMPLE"
    ... The full list of build IDs has been omitted for brevity ...
    "codebuild-demo-project:f721a282-380f-4b08-850a-e0ac1EXAMPLE"
  ]
}
```

## 查看构建 IDs 项目的构建列表 (AWS SDKs)
<a name="view-builds-for-project-sdks"></a>

有关 AWS CodeBuild 与一起使用的更多信息 AWS SDKs，请参阅[AWS SDKs 和工具参考](sdk-ref.md)。