

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

# 的跨服务示例 CodeBuild
<a name="cross-service-samples"></a>

您可以使用这些跨服务示例进行 AWS CodeBuild实验：

[Amazon ECR 示例](sample-ecr.md)  
使用 Amazon ECR 存储库中的 Docker 映像，以使用 Apache Maven 生成单个 JAR 文件。示例说明将向您展示如何创建 Docker 镜像并将其推送到 Amazon ECR、创建 Go 项目、构建项目、运行项目以及如何设置权限 CodeBuild 以允许连接 Amazon ECR。

[Amazon EFS 示例](sample-efs.md)  
演示如何配置 buildspec 文件，以便在 Amazon EFS 文件系统上安装和构建 CodeBuild 项目。示例说明将向您展示如何创建 Amazon VPC、在 Amazon VPC 中创建文件系统、创建和构建使用 Amazon VPC 的项目，然后演示如何查看生成的项目文件和变量。

[AWS CodePipeline 样本](sample-codepipeline.md)  
演示 AWS CodePipeline 如何使用创建包含批处理构建、多个输入源和多个输出工件的构建。本节中包括的示例 JSON 文件展示了使用单独构件和合并构件创建批量构建的管线结构。本节还提供了一个额外的 JSON 示例，用于展示具有多个输入源和多个输出构件的管线结构。

[AWS Config 样本](how-to-integrate-config.md)  
演示如何设置 AWS Config。列出跟踪哪些 CodeBuild 资源并描述如何在中查找 CodeBuild 项目 AWS Config。示例说明将向您展示与 AWS Config集成的先决条件 AWS Config、设置步骤以及查找 CodeBuild 项目和数据的步骤 AWS Config。

[构建通知示例](sample-build-notifications.md)  
使用 Apache Maven 生成单个 JAR 文件。给 Amazon SNS 主题的订阅者发送构建通知。示例说明向您展示了如何设置权限以便与 Amazon SNS 进行通信 CloudWatch，以及如何在 Amazon SNS 中创建和识别 CodeBuild 主题、如何为收件人订阅主题以及如何在中设置规则。 CodeBuild CloudWatch

# 的亚马逊 ECR 示例 CodeBuild
<a name="sample-ecr"></a>

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

**重要**  
运行此示例可能会导致您的 AWS 账户被扣款。其中包括与 Amazon S3、 AWS KMS、 CloudWatch 日志和 Amazon ECR 相关的 AWS 资源和操作可能产生的费用。 AWS CodeBuild 有关更多信息，请参阅[CodeBuild 定价](https://aws.amazon.com/codebuild/pricing)、[Amazon S3 定价](https://aws.amazon.com/s3/pricing)、[AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing)、[亚马逊 CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing)和[亚马逊弹性容器注册表定价](https://aws.amazon.com/ecr/pricing)。

**Topics**
+ [运行 Amazon ECR 示例](#sample-ecr-running)

## 运行 Amazon ECR 示例
<a name="sample-ecr-running"></a>

按照以下说明运行 Amazon ECR 示例。 CodeBuild

**要运行此示例，请执行以下操作：**

1. 要创建 Docker 映像并将其推送到 Amazon ECR 中的映像存储库，请完成 [“将 Docker 映像发布到 Amazon ECR”示例](sample-docker.md) 的 [运行“将 Docker 映像发布到 Amazon ECR”示例](sample-docker.md#sample-docker-running) 部分中的步骤。

1. 创建 Go 项目：

   1. 按照本主题[Go 项目结构](#ecr-sample-go-project-file-structure)和[Go 项目文件](#sample-ecr-go-project-files)部分所述创建文件，然后将其上传到 S3 输入存储桶或 AWS CodeCommit GitHub、或 Bitbucket 存储库。
**重要**  
请不要上传 `(root directory name)`，而只上传 `(root directory name)` 中的文件。  
如果您使用的是 S3 输入存储桶，请务必创建一个包含这些文件的 ZIP 文件，然后将其上传到输入存储桶。请不要将 `(root directory name)` 添加到 ZIP 文件中，而只添加 `(root directory name)` 中的文件。

   1. 创建构建项目、运行构建和查看相关构建信息。

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

      ```
      {
        "name": "sample-go-project",
        "source": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip"
        },
        "artifacts": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-output-bucket",
          "packaging": "ZIP",
          "name": "GoOutputArtifact.zip"
        },
        "environment": {
          "type": "LINUX_CONTAINER",
          "image": "aws/codebuild/standard:5.0",
          "computeType": "BUILD_GENERAL1_SMALL"
        },
        "serviceRole": "arn:aws:iam::account-ID:role/role-name",
        "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
      }
      ```

   1. 要获取构建输出构件，请打开您的 S3 输出存储桶。

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

1.  如果满足以下条件之一，则必须在 Amazon ECR 中为镜像存储库添加权限，这样 AWS CodeBuild 才能将其 Docker 映像拉入构建环境。
   +  您的项目使用 CodeBuild 凭证来提取 Amazon ECR 映像。这是由 `ProjectEnvironment` 的 `imagePullCredentialsType` 属性中的 `CODEBUILD` 值指示的。
   +  您的项目使用了跨账户 Amazon ECR 映像。在这种情况下，您的项目必须使用其服务角色拉取 Amazon ECR 映像。要启用此行为，请将您的 `ProjectEnvironment` 的 `imagePullCredentialsType` 属性设置为 `SERVICE_ROLE`。

   1. 打开 Amazon ECR 控制台，网址为[https://console.aws.amazon.com/ecr/](https://console.aws.amazon.com/ecr/)。

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

   1. 在导航窗格中，依次选择**权限**、**编辑**和**添加语句**。

   1. 对于**声明名称**，输入标识符（例如 **CodeBuildAccess**）。

   1. 对于**效果**，选择**允许**。这表示您希望允许访问另一个 AWS 账户。

   1. 对于**主体**，执行以下操作之一：
      + 如果您的项目使用 CodeBuild 凭证提取 Amazon ECR 映像，请在**服务主体**中输入**codebuild.amazonaws.com**。
      + **如果您的项目使用跨账户 Amazon ECR 图片 IDs，请输入 IDs 您想要授予访问权限的 AWS 账户。AWS **

   1. 跳过**所有 IAM 实体**列表。

   1. **在 “**操作**” 中，选择仅限拉取的操作：**ecr: GetDownloadUrlForLayer**、**ecr: 和 ecr: BatchGetImage**。BatchCheckLayerAvailability**

   1. 对于**条件**，请添加以下内容：

      ```
      {
         "StringEquals":{
            "aws:SourceAccount":"<AWS-account-ID>",
            "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>"
         }
      }
      ```

   1. 选择**保存**。

      此策略显示在**权限**中。主体是您在此过程的步骤 3 中为**主体**输入的内容：
      + 如果您的项目使用 CodeBuild 凭证提取 Amazon ECR 映像，则`"codebuild.amazonaws.com"`会显示在 “**服务主体**” 下。
      + **如果您的项目使用跨账户 Amazon ECR 图片，则您要授予访问权限的 AWS 账户的 ID 将显示在账户下方AWS 。 IDs**

        以下示例策略同时使用 CodeBuild 凭证和跨账户 Amazon ECR 映像。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceArn": "arn:aws:codebuild:us-east-1:111122223333:project/MyProject",
                          "aws:SourceAccount": "111122223333"
                      }
                  }
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*"
              }
          ]
      }
      ```

------
      + 如果您的项目使用 CodeBuild 证书，并且您希望您的 CodeBuild 项目拥有对 Amazon ECR 存储库的开放访问权限，则可以省略`Condition`密钥并添加以下示例策略。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              }
          ]
      }
      ```

------

1. 创建构建项目、运行构建和查看构建信息。

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

   ```
   {
     "name": "amazon-ecr-sample-project",
     "source": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip"
     },
     "artifacts": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-output-bucket",
       "packaging": "ZIP",
       "name": "GoOutputArtifact.zip"
     },
     "environment": {
       "type": "LINUX_CONTAINER",
       "image": "account-ID.dkr.ecr.region-ID.amazonaws.com/your-Amazon-ECR-repo-name:tag",
       "computeType": "BUILD_GENERAL1_SMALL"
     },
     "serviceRole": "arn:aws:iam::account-ID:role/role-name",
     "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
   }
   ```

1. 要获取构建输出构件，请打开您的 S3 输出存储桶。

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

### Go 项目结构
<a name="ecr-sample-go-project-file-structure"></a>

此示例采用以下目录结构。

```
(root directory name)
├── buildspec.yml
└── hello.go
```

### Go 项目文件
<a name="sample-ecr-go-project-files"></a>

此示例将使用这些文件。

`buildspec.yml`（在 `(root directory name)`）

```
version: 0.2

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

`hello.go`（在 `(root directory name)`）

```
package main
import "fmt"

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

# 的亚马逊 Elastic File System 示例 AWS CodeBuild
<a name="sample-efs"></a>

 您可能需要在 Amazon Elastic File System 上创建您的 AWS CodeBuild 构建，这是一种适用于 Amazon EC2 实例的可扩展共享文件服务。Amazon EFS 中的存储容量是弹性的，因此会随着文件的添加和删除而增长或收缩。它具有简单的 Web 服务界面，可用于创建和配置文件系统。它还为您管理所有文件存储基础设施，因此您无需担心部署、修补或维护文件系统配置。有关更多信息，请参阅 *Amazon Elastic File System 用户指南*中的[什么是 Amazon Elastic File System？](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)。

 此示例向您展示如何配置 CodeBuild 项目，使其安装并构建 Java 应用程序到 Amazon EFS 文件系统。在开始之前，您必须准备好构建并上传到 S3 输入存储桶或 AWS CodeCommit、 GitHub、 GitHub 企业服务器或 Bitbucket 存储库的 Java 应用程序。

系统会加密文件系统的传输中数据。要使用其他映像来加密传输中的数据，请参阅[加密传输中的数据](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)。

**Topics**
+ [AWS CodeBuild 与亚马逊 Elastic File System 一起使用](#sample-efs-high-level-steps)
+ [排查 Amazon EFS 集成问题](sample-efs-troubleshooting.md)

## AWS CodeBuild 与亚马逊 Elastic File System 一起使用
<a name="sample-efs-high-level-steps"></a>

该示例涵盖了使用 Amazon EFS 所需的四个高级步骤 AWS CodeBuild。它们是：

1. 在您的 AWS 账户中创建虚拟私有云 (VPC)。

1. 创建使用此 VPC 的文件系统。

1. 创建并构建使用 VPC 的 CodeBuild 项目。该 CodeBuild 项目使用以下内容来标识文件系统：
   +  文件系统的唯一标识符。当您在构建项目中指定文件系统时，可以选择该标识符。
   + 文件系统 ID。当您在 Amazon EFS 控制台中查看文件系统时，系统会显示该 ID。
   +  挂载点。这是 Docker 容器中用于挂载文件系统的目录。
   + 挂载选项。这些选项包含了有关如何挂载文件系统的详细信息。

1. 查看构建项目，确保生成了正确的项目文件和变量。

**注意**  
 只有 Linux 平台支持在 Amazon EFS 中创建的文件系统。

 

**Topics**
+ [步骤 1：使用创建 VPC CloudFormation](#sample-efs-create-vpc)
+ [步骤 2：使用 VPC 创建 Amazon Elastic File System 文件系统](#sample-efs-create-efs)
+ [第 3 步：创建要用于 Amazon EFS 的 CodeBuild 项目](#sample-efs-create-acb)
+ [步骤 4：检查构建项目](#sample-efs-summary)

### 步骤 1：使用创建 VPC CloudFormation
<a name="sample-efs-create-vpc"></a>

 使用 CloudFormation 模板创建您的 VPC。

1.  按照中的说明进行操作[CloudFormation VPC 模板](cloudformation-vpc-template.md)， CloudFormation 使用创建 VPC。
**注意**  
 此 CloudFormation 模板创建的 VPC 有两个私有子网和两个公有子网。当您使用 AWS CodeBuild 挂载在 Amazon EFS 中创建的文件系统时，只能使用私有子网。如果您使用其中一个公有子网，则构建会失败。

1. 登录 AWS 管理控制台 并打开 Amazon VPC 控制台，网址为[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1.  选择您创建时使用的 VPC CloudFormation。

1. 在**描述**选项卡上，记下 VPC 的名称及其 ID。在本示例的后面部分中创建您的 AWS CodeBuild 项目时，需要这两者。

### 步骤 2：使用 VPC 创建 Amazon Elastic File System 文件系统
<a name="sample-efs-create-efs"></a>

 使用您之前创建的 VPC 为本示例创建简单的 Amazon EFS 文件系统。

1. 登录 AWS 管理控制台 并打开 Amazon EFS 控制台，网址为[ https://console.aws.amazon.com/efs/](https://console.aws.amazon.com/efs/)。

1.  选择**创建文件系统**。

1.  从 **VPC**，选择您之前在本示例中记录的 VPC 名称。

1.  保持可用区与您选定子网的关联。

1.  选择**下一步**。

1.  在**添加标签**中，对于默认的**名称**键，在**值**中，输入 Amazon EFS 文件系统的名称。

1.  保留**突增**和**通用型**选定为您的默认性能和吞吐量模式，然后选择**下一步**。

1. 对于**配置客户端访问**，请选择**下一步**。

1.  选择**创建文件系统**。

1.  （可选）我们建议您为您的 Amazon EFS 文件系统添加策略，以强制对传输中的数据进行加密。在 Amazon EFS 控制台中，选择**文件系统策略**，选择**编辑**，选中标有**针对所有客户端强制执行传输中加密**的复选框，然后选择**保存**。

### 第 3 步：创建要用于 Amazon EFS 的 CodeBuild 项目
<a name="sample-efs-create-acb"></a>

 创建一个使用您在本示例前面创建的 VPC 的 AWS CodeBuild 项目。运行构建时，它会挂载之前创建的 Amazon EFS 文件系统。接下来，它会将 Java 应用程序创建的 .jar 文件存储在文件系统的挂载点目录中。

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

1.  从导航窗格中选择**构建项目**，然后选择**创建构建项目**。

1.  在**项目名称**中输入项目名称。

1.  从**源提供商**中，选择包含要构建的 Java 应用程序的存储库。

1.  输入 CodeBuild 用于定位应用程序的信息，例如存储库 URL。每个源提供商的选项有所不同。有关更多信息，请参阅 [Choose source provider](create-project.md#create-project-source-provider)。

1.  从**环境映像**中，选择**托管映像**。

1.  从**操作系统**中，选择 **Amazon Linux 2**。

1. 从**运行时**中，选择**标准**。

1.  从**图片中**，选择 **aws/codebuild/amazonlinux-x** 86\$164-standards: 4.0。

1.  从**环境类型**中，选择 **Linux**。

1.  在**服务角色**下，选择**新建服务角色**。在**角色名称**中，输入为您 CodeBuild 创建的角色的名称。

1. 展开**其他配置**。

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

1.  从 **VPC** 中，选择 VPC ID。

1.  从**子网**中，选择一个或多个与您的 VPC 关联的私有子网。您必须在挂载 Amazon EFS 文件系统的构建项目中使用私有子网。如果您使用公有子网，则构建会失败。

1.  从**安全组**中，选择默认安全组。

1.  在**文件系统**中，输入以下信息：
   + 针对**标识符**，输入文件系统的唯一标识符。该标识符必须少于 129 个字符，并且只能包含字母数字字符和下划线。 CodeBuild 使用此标识符来创建用于标识弹性文件系统的环境变量。该环境变量的格式为采用大写字母的 `CODEBUILD_<file_system_identifier>`。例如，如果输入 `my_efs`，则环境变量为 `CODEBUILD_MY_EFS`。
   + 对于 **ID**，请选择文件系统 ID。
   + （可选）输入文件系统中的一个目录。 CodeBuild 装入此目录。如果将 **Directory path (目录路径)** 留为空白，则 CodeBuild 会挂载整个文件系统。该路径相对于文件系统的根目录指定。
   + 对于**挂载点**，输入构建容器中用于挂载文件系统的目录的绝对路径。如果此目录不存在，则在构建过程中 CodeBuild 创建该目录。
   + （可选）输入挂载选项。如果将**装载选项**留空，则 CodeBuild 使用其默认装载选项：

     ```
     nfsvers=4.1
     rsize=1048576
     wsize=1048576
     hard
     timeo=600
     retrans=2
     ```

     有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[建议的 NFS 挂载选项](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-nfs-mount-settings.html)。

1.  对于**构建规范**，选择**插入构建命令**，然后选择**切换到编辑器**。

1.  在编辑器中输入以下构建规范命令。将 `<file_system_identifier>` 替换为您在步骤 17 中输入的标识符。使用大写字母（例如 `CODEBUILD_MY_EFS`）。

   ```
   version: 0.2
   phases:
     install:
       runtime-versions:
         java: corretto11    
     build:
       commands:
         - mvn compile -Dgpg.skip=true -Dmaven.repo.local=$CODEBUILD_<file_system_identifier>
   ```

1.  对所有其他设置使用默认值，然后选择**创建构建项目**。构建完成后，系统会显示项目的控制台页面。

1.  选择**开始构建**。

### 步骤 4：检查构建项目
<a name="sample-efs-summary"></a>



 AWS CodeBuild 项目构建完成后：
+  您会拥有一个由 Java 应用程序创建的 .jar 文件，该文件已被构建到您的挂载点目录下的 Amazon EFS 文件系统中。
+  系统会使用您在创建项目时输入的文件系统标识符，创建标识文件系统的环境变量。

 有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[装载文件系统](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)。

# 排查 Amazon EFS 集成问题
<a name="sample-efs-troubleshooting"></a>

以下是您在设置 Amazon EFS 时可能遇到的错误 CodeBuild。

**Topics**
+ [CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。权限被拒绝](#sample-efs-troubleshooting.permission-denied)
+ [CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。连接被对等方重置](#sample-efs-troubleshooting.connection-reset)
+ [VPC\$1CLIENT\$1ERROR：意外的 EC2 错误： UnauthorizedOperation](#sample-efs-troubleshooting.unauthorized-operation)

## CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。权限被拒绝
<a name="sample-efs-troubleshooting.permission-denied"></a>

通过挂载 Amazon EFS 不支持 IAM 授权 CodeBuild。如果您使用的是自定义 Amazon EFS 文件系统策略，则需要向所有 IAM 主体授予读写权限。例如：

```
"Principal": {
  "AWS": "*"
}
```

## CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。连接被对等方重置
<a name="sample-efs-troubleshooting.connection-reset"></a>

有两种可能的原因会导致此错误：
+  CodeBuild VPC 子网与 Amazon EFS 挂载目标位于不同的可用区中。您可以通过在 Amazon EFS 挂载目标所在的同一可用区中添加 VPC 子网来解决此问题。
+ 安全组不具备与 Amazon EFS 通信的权限。您可以通过添加入站规则来允许来自 VPC（为您的 VPC 添加主要 CIDR 块）或安全组本身的所有流量，从而解决此问题。

## VPC\$1CLIENT\$1ERROR：意外的 EC2 错误： UnauthorizedOperation
<a name="sample-efs-troubleshooting.unauthorized-operation"></a>

当 CodeBuild项目的 VPC 配置中的所有子网均为公有子网时，就会发生此错误。您在 VPC 中必须至少有一个私有子网才能确保网络连接正常。

# AWS CodePipeline 的样品 CodeBuild
<a name="sample-codepipeline"></a>

本节介绍 CodePipeline 和 CodeBuild之间的集成示例。


| 样本 | 说明 | 
| --- | --- | 
|  [CodePipeline/CodeBuild 集成和批量构建示例](#sample-pipeline-batch)  |  这些示例演示了如何使用 AWS CodePipeline 来创建使用批量构建的构建项目。  | 
|  [具有多个输入源和输出工件的 CodePipeline/CodeBuild 集成示例](#sample-pipeline-multi-input-output)  |  此示例演示 AWS CodePipeline 如何使用创建使用多个输入源来创建多个输出构件的构建项目。  | 

## CodePipeline/CodeBuild 集成和批量构建示例
<a name="sample-pipeline-batch"></a>

AWS CodeBuild 支持批量构建。以下示例演示 AWS CodePipeline 如何使用创建使用批量构建的构建项目。

您可以使用 JSON 格式的文件来定义管道的结构，然后将其与一起使用 AWS CLI 来创建管道。有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的 [AWS CodePipeline 管道结构参考](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)。

### 使用单个构件进行批量构建
<a name="sample-pipeline-batch.separate-artifacts"></a>

使用以下 JSON 文件作为管道结构的示例，该结构使用单个构件创建批量构建。要在中启用批量构建 CodePipeline，请将`configuration`对象的`BatchEnabled`参数设置为`true`。

```
{
  "pipeline": {
    "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
    "stages": [
      {
        "name": "Source",
        "actions": [
          {
            "inputArtifacts": [],
            "name": "Source1",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source1"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-input-bucket-name>",
              "S3ObjectKey": "my-source-code-file-name.zip"
            },
            "runOrder": 1
          },
          {
            "inputArtifacts": [],
            "name": "Source2",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source2"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-other-input-bucket-name>",
              "S3ObjectKey": "my-other-source-code-file-name.zip"
            },
            "runOrder": 1
          }
        ]
      },
      {
        "name": "Build",
        "actions": [
          {
            "inputArtifacts": [
              {
                "name": "source1"
              },
              {
                "name": "source2"
              }
            ],
            "name": "Build",
            "actionTypeId": {
              "category": "Build",
              "owner": "AWS",
              "version": "1",
              "provider": "CodeBuild"
            },
            "outputArtifacts": [
              {
                "name": "build1"
              },
              {
                "name": "build1_artifact1"
              },
              {
                "name": "build1_artifact2"
              },
              {
                "name": "build2_artifact1"
              },
              {
                "name": "build2_artifact2"
              }
            ],
            "configuration": {
              "ProjectName": "my-build-project-name",
              "PrimarySource": "source1",
              "BatchEnabled": "true"
            },
            "runOrder": 1
          }
        ]
      }
    ],
    "artifactStore": {
      "type": "S3",
      "location": "<AWS-CodePipeline-internal-bucket-name>"
    },
    "name": "my-pipeline-name",
    "version": 1
  }
}
```

以下是适用于此工作流配置的 CodeBuild buildspec 文件的示例。

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
  secondary-artifacts:
    artifact1:
      files:
        - output_file
    artifact2:
      files:
        - output_file
```

管道的 JSON 文件中指定的输出构件的名称必须与 buildspec 文件中定义的构建和构件的标识符相匹配。语法*buildIdentifier*用于主工件，*buildIdentifier*\$1 *artifactIdentifier* 用于次要工件。

例如，对于输出对象名称`build1`， CodeBuild 会将的主构件上传`build1`到的位置`build1`。对于输出名称`build1_artifact1`， CodeBuild 会将的次要工件`artifact1`上传`build1`到的位置`build1_artifact1`，依此类推。如果只指定了一个输出位置，则名称应为 “*buildIdentifier*只有”。

创建 JSON 文件后，可以创建管道。使用运行 **create-pipelin** e 命令并将文件传递给参数。 AWS CLI `--cli-input-json`有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的[创建管道（CLI）](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

### 使用合并的构件进行批量构建
<a name="sample-pipeline-batch.combined-artifacts"></a>

使用以下 JSON 文件作为管道结构的示例，该结构使用合并的构件创建批量构建。要在中启用批量构建 CodePipeline，请将`configuration`对象的`BatchEnabled`参数设置为`true`。要将构建构件合并到同一位置，请将 `configuration` 对象的 `CombineArtifacts` 参数设置为 `true`。

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-input-bucket-name>",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-other-input-bucket-name>",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "output1 "
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1",
             "BatchEnabled": "true",
             "CombineArtifacts": "true"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "<AWS-CodePipeline-internal-bucket-name>"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

以下是适用于此工作流配置的 CodeBuild buildspec 文件的示例。

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
```

如果为批量生成启用了组合工件，则只允许一个输出。 CodeBuild 会将所有版本的主要构件合并到一个 ZIP 文件中。

创建 JSON 文件后，可以创建管道。使用运行 **create-pipelin** e 命令并将文件传递给参数。 AWS CLI `--cli-input-json`有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的[创建管道（CLI）](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

## 具有多个输入源和输出工件的 CodePipeline/CodeBuild 集成示例
<a name="sample-pipeline-multi-input-output"></a>

一个 AWS CodeBuild 项目可以采用多个输入源。也可以创建多个输出构件。此示例演示 AWS CodePipeline 如何使用创建使用多个输入源来创建多个输出构件的构建项目。有关更多信息，请参阅 [多输入源和输出构件示例](sample-multi-in-out.md)。

您可以使用 JSON 格式的文件来定义管道的结构，然后将其与一起使用 AWS CLI 来创建管道。使用以下 JSON 文件作为管道结构的示例，此管道结构可以创建一个具有多输入源和多输出构件的构建。稍后，此示例会介绍该文件如何指定多个输入和输出。有关更多信息，请参阅《*AWS CodePipeline 用户指南》*中的[CodePipeline 管道结构参考](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)。

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "my-input-bucket-name",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "my-other-input-bucket-name",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "AWS CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "artifact1"
            },
            {
              "name": "artifact2"
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "AWS-CodePipeline-internal-bucket-name"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

 在此 JSON 文件中：
+ 必须将输入源之一指定为 `PrimarySource`。这个源代码是 CodeBuild 查找和运行你的 buildspec 文件的目录。关键字`PrimarySource`用于指定 JSON 文件中 CodeBuild 舞台`configuration`部分的主要来源。
+ 每个输入源都安装在各自的目录中。此目录存储在内置环境变量 `$CODEBUILD_SRC_DIR`（对于主要源）和 `$CODEBUILD_SRC_DIR_yourInputArtifactName`（对于所有其他源）中。对于此示例中的管道，两个输入源目录为 `$CODEBUILD_SRC_DIR` 和 `$CODEBUILD_SRC_DIR_source2`。有关更多信息，请参阅 [构建环境中的环境变量](build-env-ref-env-vars.md)。
+ 管道的 JSON 文件中指定的输出构件的名称必须与 buildspec 文件中定义的辅助构件的名称相匹配。此管道使用以下 buildspec 文件。有关更多信息，请参阅 [buildspec 语法](build-spec-ref.md#build-spec-ref-syntax)。

  ```
  version: 0.2
  
  phases:
    build:
      commands:
        - touch source1_file
        - cd $CODEBUILD_SRC_DIR_source2
        - touch source2_file
  
  artifacts:
    files:
      - '**/*'
    secondary-artifacts:
      artifact1:
        base-directory: $CODEBUILD_SRC_DIR
        files:
          - source1_file
      artifact2:
        base-directory: $CODEBUILD_SRC_DIR_source2
        files:
          - source2_file
  ```

 创建 JSON 文件后，可以创建管道。使用运行 **create-pipelin** e 命令并将文件传递给参数。 AWS CLI `--cli-input-json`有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的[创建管道（CLI）](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

# AWS Config 样品与 CodeBuild
<a name="how-to-integrate-config"></a>

AWS Config 提供了您的 AWS 资源清单以及这些资源的配置更改历史记录。 AWS Config 现在支持 AWS CodeBuild 作为 AWS 资源，这意味着该服务可以跟踪您的 CodeBuild 项目。有关的更多信息 AWS Config，请参阅[什么是 AWS Config？](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html) 在《*AWS Config 开发人员指南》*中。

您可以在 AWS Config 控制台的 “ CodeBuild 资源**清单” 页面上看到以下有关资源**的信息：
+ 您的 CodeBuild 配置更改的时间表。
+ 每个 CodeBuild 项目的配置详细信息。
+ 与其他 AWS 资源的关系。
+ 您的 CodeBuild 项目变更清单。

**Topics**
+ [CodeBuild 搭配使用 AWS Config](#how-to-integrate-config-run)
+ [步骤 3：在 AWS Config 控制台中查看 AWS CodeBuild 数据](#viewing-config-details)

## CodeBuild 搭配使用 AWS Config
<a name="how-to-integrate-config-run"></a>

本主题中的过程向您展示了如何设置 AWS Config 和查找 CodeBuild项目。

**Topics**
+ [先决条件](#how-to-create-a-build-project)
+ [第 1 步：设置 AWS Config](#setup-config)
+ [第 2 步：查找 AWS CodeBuild 项目](#lookup-projects)

### 先决条件
<a name="how-to-create-a-build-project"></a>

创建您的 AWS CodeBuild 项目。有关说明，请参阅[创建构建项目](create-project.md)。

### 第 1 步：设置 AWS Config
<a name="setup-config"></a>
+ [设置 AWS Config （控制台）](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)
+ [设置 AWS Config (AWS CLI)](https://docs.aws.amazon.com/config/latest/developerguide/gs-cli.html)

**注意**  
完成设置后，最长可能需要 10 分钟才能在 AWS Config 控制台中看到 AWS CodeBuild 项目。

### 第 2 步：查找 AWS CodeBuild 项目
<a name="lookup-projects"></a>

1. 登录 AWS 管理控制台并通过 [https://console.aws.amazon.com/config](https://console.aws.amazon.com/config) 打开 AWS Config 控制台。

1. 在**资源清单**页面上，在 “**资源类型**” 下选择 “**AWS CodeBuild 项目**”。向下滚动并选中**CodeBuild项目**复选框。

1. 选择**查找**。

1. 添加 CodeBuild 项目列表后，在 **Config 时间轴**列中选择 CodeBuild 项目名称链接。

## 步骤 3：在 AWS Config 控制台中查看 AWS CodeBuild 数据
<a name="viewing-config-details"></a>

在资源**清单页面上查找资源**时，您可以选择 AWS Config 时间表来查看有关您的 CodeBuild 项目的详细信息。资源的详细信息页面提供了有关该资源的配置、关系和更改次数的信息。

页面顶部的块统称为时间线。时间线显示了记录的创建日期和时间。

有关更多信息，请参阅《*AWS Config 开发人员指南》*[中的在 AWS Config 控制台中查看配置详细信息](https://docs.aws.amazon.com/config/latest/developerguide/view-manage-resource-console.html)。

# 为以下内容构建通知示例 CodeBuild
<a name="sample-build-notifications"></a>

Amazon E CloudWatch vents 内置了对以下内容的支持 AWS CodeBuild。 CloudWatch 事件是描述 AWS 资源变化的系统事件流。使用 E CloudWatch vents，您可以编写声明性规则，将感兴趣的事件与要采取的自动操作关联起来。此示例使用 Amazon Events 和亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 在构建成功、失败、从一个构建阶段进入另一个构建阶段或这些 CloudWatch 事件的任意组合时向订阅者发送构建通知。

**重要**  
运行此示例可能会导致您的 AWS 账户被扣款。其中包括与 Amazon CodeBuild 和 Amazon SNS 相关的 AWS 资源 CloudWatch 和操作可能产生的费用。有关更多信息，请参阅[CodeBuild 定价](https://aws.amazon.com/codebuild/pricing)、[亚马逊定 CloudWatch价](https://aws.amazon.com/cloudwatch/pricing)和[亚马逊 SNS](https://aws.amazon.com/sns/pricing) 定价。

**Topics**
+ [运行构建通知示例](#sample-build-notifications-running)
+ [构建通知输入格式参考](sample-build-notifications-ref.md)

## 运行构建通知示例
<a name="sample-build-notifications-running"></a>

按照以下过程运行构建通知示例。

**要运行此示例，请执行以下操作：**

1. 如果您已在 Amazon SNS 中设置并订阅用于此示例的主题，请跳至第 4 步。否则，如果您使用 IAM 用户而不是 AWS 根账户或管理员用户来使用 Amazon SNS，请向用户（或用户关联的 IAM 群组*\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1*）添加以下语句（介于*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1*和之间）。不建议使用 r AWS oot 账户。此语句可用于查看、创建、订阅和测试向 Amazon SNS 中的主题发送通知的情况。为了简洁起见，也为了帮您查找添加语句的位置，此处使用了省略号 (`...`)。请勿删除任何语句，也不要将这些省略号键入现有策略中。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sns:CreateTopic",
                   "sns:GetTopicAttributes",
                   "sns:List*",
                   "sns:Publish",
                   "sns:SetTopicAttributes",
                   "sns:Subscribe"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**注意**  
修改该策略的 IAM 实体必须拥有在 IAM 中修改策略的权限。  
有关更多信息，请参阅《IAM 用户指南》**中的[编辑客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#edit-managed-policy-console)或[使用内联策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)中的“编辑或删除组、用户或角色的内联策略”部分。

1. 在 Amazon SNS 中创建或标识主题。 AWS CodeBuild 使用 CloudWatch 事件通过 Amazon SNS 向该主题发送构建通知。

   要创建主题，请执行以下操作:

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

   1. 选择**创建主题**。

   1. 在**创建新主题**对话框中，为**主题名称**输入主题的名称（例如 **CodeBuildDemoTopic**）。（如果您选择了其他名称，请用该名称替换掉本示例中对应的名称。） 

   1. 选择**创建主题**。

   1. 在**主题详情： CodeBuildDemoTopic**页面上，复制**主题 ARN 值。**在下一个步骤中，您需要用到此值。

        
![\[主题 ARN 值。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/topic-arn.png)

      

   有关更多信息，请参阅《Amazon SNS 开发人员指南》**中的[创建主题](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。

1. 为一个或多个收件人订阅主题以接收电子邮件通知。

   为收件人订阅主题：

   1. 使用上一步中打开的 Amazon SNS 控制台，在导航窗格中，选择**订阅**，然后选择**创建订阅**。

   1. 在**创建订阅**中，对于**主题 ARN**，粘贴您在上一步中复制的主题 ARN。

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

   1. 对于**端点**，输入收件人的完整电子邮件地址。

        
![\[订阅配置。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/create-subscription.png)

      

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

   1. Amazon SNS 向收件人发送订阅确认电子邮件。要开始接收电子邮件通知，收件人必须在订阅确认电子邮件中选择**确认订阅**链接。在收件人单击该链接后，如果成功订阅，Amazon SNS 将在收件人的 Web 浏览器中显示一条确认消息。

   有关更多信息，请参阅《Amazon SNS 开发人员指南》**中的[订阅主题](https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html)。

1. 如果您使用用户而不是 AWS 根账户或管理员用户来处理 Ev CloudWatch ents，请向用户（或用户关联的 IAM 群组*\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1*）添加以下语句（介于*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1*和之间）。不建议使用 r AWS oot 账户。此语句用于允许用户使用 CloudWatch 事件。为了简洁起见，也为了帮您查找添加语句的位置，此处使用了省略号 (`...`)。请勿删除任何语句，也不要将这些省略号键入现有策略中。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "events:*",
                   "iam:PassRole"
               ],
               "Resource": "arn:aws:iam::*:role/Service*"
           }
       ]
   }
   ```

------
**注意**  
修改该策略的 IAM 实体必须拥有在 IAM 中修改策略的权限。  
有关更多信息，请参阅《IAM 用户指南》**中的[编辑客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#edit-managed-policy-console)或[使用内联策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)中的“编辑或删除组、用户或角色的内联策略”部分。

1. 在 “ CloudWatch 事件” 中创建规则。为此，请打开 CloudWatch 控制台，位于 [https://console.aws.amazon.com/cloudwatch](https://console.aws.amazon.com/cloudwatch)。

1. 在导航窗格中的**事件**下，选择**规则**，然后选择**创建规则**。

1. 在**步骤 1：创建规则页面**上，**事件模式**和**构建事件模式以按服务匹配事件**应已选中。

1. 对于**服务名称**，选择 **CodeBuild**。对于**事件类型**，**所有事件**应已选中。

1. **事件模式预览**中应显示以下代码：

   ```
   {
     "source": [ 
       "aws.codebuild"
     ]
   }
   ```

1. 选择**编辑**并将**事件模式预览**中的代码替换为以下两个规则模式之一。

   每当一个构建开始或完成时，第一个规则模式就会为 AWS CodeBuild中的指定构建项目触发一个事件。

   ```
   {
     "source": [ 
       "aws.codebuild"
     ], 
     "detail-type": [
       "CodeBuild Build State Change"
     ],
     "detail": {
       "build-status": [
         "IN_PROGRESS",
         "SUCCEEDED", 
         "FAILED",
         "STOPPED" 
       ],
       "project-name": [
         "my-demo-project-1",
         "my-demo-project-2"
       ]
     }  
   }
   ```

   在前面的规则中，根据需要更改以下代码。
   + 要在每次构建开始或完成时触发事件，请保留 `build-status` 数组中显示的所有值，或删除整个 `build-status` 数组。
   + 要仅在构建完成时触发事件，请从 `build-status` 阵列中删除 `IN_PROGRESS`。
   + 要仅在构建开始时触发事件，请从 `build-status` 阵列中删除除 `IN_PROGRESS` 以外的所有值。
   + 要为所有构建项目触发事件，请删除整个 `project-name` 阵列。
   + 要仅为单个构建项目触发事件，请在 `project-name` 阵列中指定每个构建项目的名称。

   每当构建从一个构建阶段转到另一个构建阶段时，第二个规则模式将为 AWS CodeBuild中的指定构建项目触发一个事件。

   ```
   {
     "source": [ 
       "aws.codebuild"
     ], 
     "detail-type": [
       "CodeBuild Build Phase Change" 
     ],
     "detail": {
       "completed-phase": [
         "SUBMITTED",
         "PROVISIONING",
         "DOWNLOAD_SOURCE",
         "INSTALL",
         "PRE_BUILD",
         "BUILD",
         "POST_BUILD",
         "UPLOAD_ARTIFACTS",
         "FINALIZING"
       ],
       "completed-phase-status": [
         "TIMED_OUT",
         "STOPPED",
         "FAILED", 
         "SUCCEEDED",
         "FAULT",
         "CLIENT_ERROR"
       ],
       "project-name": [
         "my-demo-project-1",
         "my-demo-project-2"
       ]
     }  
   }
   ```

   在前面的规则中，根据需要更改以下代码。
   + 要为每个构建阶段更改触发一个事件（这可以为每个构建发送最多 9 条通知），请保留 `completed-phase` 数组中显示的所有值，或删除整个 `completed-phase` 数组。
   + 要仅针对单个构建阶段更改触发事件，请删除 `completed-phase` 阵列中您不希望为其触发事件的每个构建阶段的名称。
   + 要针对所有构建阶段状态更改触发事件，请保留 `completed-phase-status` 阵列中显示的所有值，或删除整个 `completed-phase-status` 阵列。
   + 要仅针对单个构建阶段状态更改触发事件，请删除 `completed-phase-status` 阵列中您不希望对其触发事件的每个构建阶段状态的名称。
   + 要为所有构建项目触发事件，请删除 `project-name` 阵列。
   + 要为单个构建项目触发事件，请在 `project-name` 阵列中指定每个构建项目的名称。

   有关事件模式的更多信息，请参阅 Amazon EventBridge 用户指南中的[事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/filtering-examples-structure.html)。

   有关使用事件模式进行筛选的更多信息，请参阅 Amazon EventBridge 用户指南中的[使用事件模式进行基于内容的筛选](https://docs.aws.amazon.com/eventbridge/latest/userguide/content-filtering-with-event-patterns.html)。
**注意**  
如果要同时为构建状态更改和构建阶段更改触发事件，则必须创建两个单独的规则：一个针对构建状态更改，另一个针对构建阶段更改。如果您尝试将两个规则合并为一个规则，则合并后的规则可能产生意外结果或停止协作。

   替换完代码后，选择**保存**。

1. 对于**目标**，选择**添加目标**。

1. 在目标列表中，选择 **SNS 主题**。

1. 对于**话题**，选择您之前标识或创建的主题。

1. 展开**配置输入**，然后选择**输入转换器**。

1. 在**输入路径**框中，输入以下输入路径之一。

   对于 `detail-type` 值为 `CodeBuild Build State Change` 的规则，输入以下内容。

   ```
   {"build-id":"$.detail.build-id","project-name":"$.detail.project-name","build-status":"$.detail.build-status"}
   ```

   对于 `detail-type` 值为 `CodeBuild Build Phase Change` 的规则，输入以下内容。

   ```
   {"build-id":"$.detail.build-id","project-name":"$.detail.project-name","completed-phase":"$.detail.completed-phase","completed-phase-status":"$.detail.completed-phase-status"}
   ```

   要获取其他类型的信息，请参阅[构建通知输入格式参考](sample-build-notifications-ref.md)。

1. 在**输入模板**框中，输入以下输入模板之一。

   对于 `detail-type` 值为 `CodeBuild Build State Change` 的规则，输入以下内容。

   ```
   "Build '<build-id>' for build project '<project-name>' has reached the build status of '<build-status>'."
   ```

   对于 `detail-type` 值为 `CodeBuild Build Phase Change` 的规则，输入以下内容。

   ```
   "Build '<build-id>' for build project '<project-name>' has completed the build phase of '<completed-phase>' with a status of '<completed-phase-status>'."
   ```

1. 选择**配置详细信息**。

1. 在**步骤 2：配置规则详细信息**页面上，输入名称和可选描述。对于**状态**，将**已启用**保持选中状态。

1. 选择****创建规则。

1. 创建构建项目、运行构建和查看构建信息。

1. 确认 CodeBuild 现在已成功发送构建通知。例如，检查您的收件箱中现在是否有构建通知电子邮件。

要更改规则的行为，请在 CloudWatch 控制台中选择要更改的规则，选择**操作**，然后选择**编辑**。对该规则进行更改，选择**配置详细信息**，然后选择**更新规则**。

要停止使用规则发送生成通知，请在 CloudWatch 控制台中选择要停止使用的规则，选择**操作**，然后选择**禁用**。

要完全删除规则，请在 CloudWatch 控制台中选择要删除的规则，选择**操作**，然后选择**删除**。

# 构建通知输入格式参考
<a name="sample-build-notifications-ref"></a>

CloudWatch 以 JSON 格式发送通知。

构建状态更改通知使用以下格式：

```
{
  "version": "0",
  "id": "c030038d-8c4d-6141-9545-00ff7b7153EX",
  "detail-type": "CodeBuild Build State Change",
  "source": "aws.codebuild",
  "account": "123456789012",
  "time": "2017-09-01T16:14:28Z",
  "region": "us-west-2",
  "resources":[
    "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX"
  ],
  "detail":{
    "build-status": "SUCCEEDED",
    "project-name": "my-sample-project",
    "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
    "additional-information": {
      "artifact": {
        "md5sum": "da9c44c8a9a3cd4b443126e823168fEX",
        "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX",
        "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip"
      },
      "environment": {
        "image": "aws/codebuild/standard:5.0",
        "privileged-mode": false,
        "compute-type": "BUILD_GENERAL1_SMALL",
        "type": "LINUX_CONTAINER",
        "environment-variables": []
      },
      "timeout-in-minutes": 60,
      "build-complete": true,
      "initiator": "MyCodeBuildDemoUser",
      "build-start-time": "Sep 1, 2017 4:12:29 PM",
      "source": {
        "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip",
        "type": "S3"
      },
      "logs": {
        "group-name": "/aws/codebuild/my-sample-project",
        "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX",
        "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX"
      },
      "phases": [
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:12:29 PM",
          "duration-in-seconds": 0,
          "phase-type": "SUBMITTED",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:13:05 PM",
          "duration-in-seconds": 36,
          "phase-type": "PROVISIONING",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:05 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 4,
          "phase-type": "DOWNLOAD_SOURCE",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "INSTALL",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "PRE_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 70,
          "phase-type": "BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "POST_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "UPLOAD_ARTIFACTS",
          "phase-status": "SUCCEEDED"
        },
         {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:26 PM",
          "duration-in-seconds": 4,
          "phase-type": "FINALIZING",
          "phase-status": "SUCCEEDED"
        },
        {
          "start-time": "Sep 1, 2017 4:14:26 PM",
          "phase-type": "COMPLETED"
        }
      ]
    },
    "current-phase": "COMPLETED",
    "current-phase-context": "[]",
    "version": "1"
  }
}
```

构建阶段更改通知使用以下格式：

```
{
  "version": "0",
  "id": "43ddc2bd-af76-9ca5-2dc7-b695e15adeEX",
  "detail-type": "CodeBuild Build Phase Change",
  "source": "aws.codebuild",
  "account": "123456789012",
  "time": "2017-09-01T16:14:21Z",
  "region": "us-west-2",
  "resources":[
    "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX"
  ],
  "detail":{
    "completed-phase": "COMPLETED",
    "project-name": "my-sample-project",
    "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
    "completed-phase-context": "[]",
    "additional-information": {
      "artifact": {
        "md5sum": "da9c44c8a9a3cd4b443126e823168fEX",
        "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX",
        "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip"
      },
      "environment": {
        "image": "aws/codebuild/standard:5.0",
        "privileged-mode": false,
        "compute-type": "BUILD_GENERAL1_SMALL",
        "type": "LINUX_CONTAINER",
        "environment-variables": []
      },
      "timeout-in-minutes": 60,
      "build-complete": true,
      "initiator": "MyCodeBuildDemoUser",
      "build-start-time": "Sep 1, 2017 4:12:29 PM",
      "source": {
        "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip",
        "type": "S3"
      },
      "logs": {
        "group-name": "/aws/codebuild/my-sample-project",
        "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX",
        "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX"
      },
      "phases": [
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:12:29 PM",
          "duration-in-seconds": 0,
          "phase-type": "SUBMITTED",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:13:05 PM",
          "duration-in-seconds": 36,
          "phase-type": "PROVISIONING",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:05 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 4,
          "phase-type": "DOWNLOAD_SOURCE",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "INSTALL",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "PRE_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 70,
          "phase-type": "BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "POST_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "UPLOAD_ARTIFACTS",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:26 PM",
          "duration-in-seconds": 4,
          "phase-type": "FINALIZING",
          "phase-status": "SUCCEEDED"
        },
        {
          "start-time": "Sep 1, 2017 4:14:26 PM",
          "phase-type": "COMPLETED"
        }
      ]  
    },
    "completed-phase-status": "SUCCEEDED",
    "completed-phase-duration-seconds": 4,
    "version": "1",
    "completed-phase-start": "Sep 1, 2017 4:14:21 PM",
    "completed-phase-end": "Sep 1, 2017 4:14:26 PM"
  }
}
```