

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

# 为以下内容构建通知示例 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"
  }
}
```