适用于 CodeBuild 的构建通知示例 - Amazon CodeBuild
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

适用于 CodeBuild 的构建通知示例

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

重要

运行该示例可能会导致您的 Amazon 账户产生相关费用。其中包括可能收取的费用CodeBuild而对于Amazon与亚马逊相关的资源和操作CloudWatch和亚马逊 SNS。有关更多信息,请参阅CodeBuild定价亚马逊CloudWatch定价,以及亚马逊 SNS 定价

运行示例

要运行此示例,请执行以下操作:
  1. 如果您已经在 Amazon SNS 中设置并订阅了要用于此示例的主题,请跳至步骤 4。否则,如果您使用的是 IAM 用户而不是Amazonroot 账户或管理员用户要使用 Amazon SNS,请添加以下语句(介于### 开始在这里添加语句 ###### 在这里结束添加语句 ###) 发送给用户(或用户关联的 IAM 群组)。建议不使用 Amazon 根账户。此声明允许查看、创建、订阅和测试向 Amazon SNS 中的主题发送通知。为了简洁起见,也为了帮您查找添加语句的位置,此处使用了省略号 (...)。请勿删除任何语句,也不要将这些省略号键入现有策略中。

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "sns:CreateTopic", "sns:GetTopicAttributes", "sns:List*", "sns:Publish", "sns:SetTopicAttributes", "sns:Subscribe" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    注意

    修改此策略的 IAM 实体必须在 IAM 中拥有修改策略的权限。

    有关更多信息,请参阅编辑客户托管策略或中的 “编辑或删除群组、用户或角色的内联策略” 部分使用内联策略(控制台)IAM 用户指南

  2. 在亚马逊 SNS 中创建或标识主题。Amazon CodeBuild使用CloudWatch通过亚马逊 SNS 向该主题发送构建通知的事件。

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

    1. 打开亚马逊 SNS 控制台,网址为https://console.aws.amazon.com/sns

    2. 选择 Create topic(创建主题)

    3. Create new topic (创建新主题) 对话框中,为 Topic name (主题名称) 输入主题的名称(例如 CodeBuildDemoTopic)。(如果您选择了其他名称,请用该名称替换掉本示例中对应的名称。)

    4. 选择 Create topic(创建主题)

    5. 话题详情:CodeBuildDemoTopic页面,复制话题 ARN价值。在下一个步骤中,您需要用到此值。

    有关更多信息,请参阅创建话题亚马逊 SNS 开发者指南

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

    为收件人订阅主题:

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

    2. Create subscription (创建订阅) 中,对于 Topic ARN (主题 ARN),粘贴您在上一步中复制的主题 ARN。

    3. 对于协议,选择电子邮件

    4. 对于 Endpoint (终端节点),输入收件人的完整电子邮件地址。

    5. 选择创建订阅

    6. Amazon SNS 会向收件人发送一封订阅确认电子邮件。要开始接收电子邮件通知,收件人必须在订阅确认电子邮件中选择 Confirm subscription 链接。收件人点击链接后,如果成功订阅,Amazon SNS 将在收件人的网络浏览器中显示一条确认消息。

    有关更多信息,请参阅订阅话题亚马逊 SNS 开发者指南

  4. 如果您使用的是用户而不是Amazon要使用的 root 账户或管理员用户CloudWatch事件,添加以下语句(介于### 开始在这里添加语句 ###### 在这里结束添加语句 ###) 发送给用户(或用户关联的 IAM 群组)。建议不使用 Amazon 根账户。此语句用于允许用户使用CloudWatch大事记。为了简洁起见,也为了帮您查找添加语句的位置,此处使用了省略号 (...)。请勿删除任何语句,也不要将这些省略号键入现有策略中。

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "events:*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    注意

    修改此策略的 IAM 实体必须在 IAM 中拥有修改策略的权限。

    有关更多信息,请参阅编辑客户托管策略或中的 “编辑或删除群组、用户或角色的内联策略” 部分使用内联策略(控制台)IAM 用户指南

  5. 在中创建规则CloudWatch大事记。为此,请打开CloudWatch控制台,在https://console.aws.amazon.com/cloudwatch

  6. 在导航窗格中的 Events 下,选择 Rules,然后选择 Create rule

  7. Step 1: Create rule page (步骤 1: 创建规则页面) 上,Event Pattern (事件模式)Build event pattern to match events by service (构建事件模式以按服务匹配事件) 应已选中。

  8. 对于 Service Name (服务名称),选择 CodeBuild。对于 Event Type (事件类型)All Events (所有事件) 应已选中。

  9. Event Pattern Preview (事件模式预览) 中应显示以下代码:

    { "source": [ "aws.codebuild" ] }
  10. 选择编辑并替换中的代码事件模式预览使用以下两种规则模式之一。

    每当一个构建开始或完成时,第一个规则模式就会为 Amazon 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 阵列中指定每个构建项目的名称。

    每当构建从一个构建阶段转到另一个构建阶段时,第二个规则模式将为 Amazon 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 阵列中指定每个构建项目的名称。

    有关事件模式的更多信息,请参阅事件模式在亚马逊EventBridge用户指南。

    有关使用事件模式进行筛选的更多信息,请参阅使用事件模式进行基于内容的过滤在亚马逊EventBridge用户指南。

    注意

    如果要同时为构建状态更改和构建阶段更改触发事件,则必须创建两个单独的规则:一个针对构建状态更改,另一个针对构建阶段更改。如果您尝试将两个规则合并为一个规则,则合并后的规则可能产生意外结果或停止协作。

    替换完代码后,选择 Save

  11. 对于 Targets,选择 Add target

  12. 在目标列表中,选择 SNS 主题

  13. 对于 Topic,选择您之前标识或创建的主题。

  14. 展开配置输入,然后选择输入转换器

  15. Input Path (输入路径) 框中,输入以下输入路径之一。

    对于 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"}

    要获取其他类型的信息,请参阅构建通知输入格式参考

  16. Input Template (输入模板) 框中,输入以下输入模板之一。

    对于 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>'."
  17. 选择 Configure details (配置详细信息)

  18. Step 2: Configure rule details (步骤 2: 配置规则详细信息) 页面上,输入名称和可选描述。对于 State (状态),将 Enabled (已启用) 保持选中状态。

  19. 选择 Create rule(创建规则)。

  20. 按照运行 CodeBuild 直接地中的步骤操作,创建构建项目、运行构建并查看构建信息。

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

要更改规则的行为,请在 CloudWatch 控制台中,选择要更改的规则,然后依次选择 Actions (操作)Edit (编辑)。对该规则进行更改,选择 Configure details (配置详细信息),然后选择 Update rule (更新规则)

要停止使用规则发送构建通知,请在 CloudWatch 控制台中,选择要停止使用的规则,然后依次选择 Actions (操作)Disable (禁用)

要删除整个规则,请在 CloudWatch 控制台中,选择要删除的规则,然后依次选择 Actions (操作)Delete (删除)

相关资源

构建通知输入格式参考

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" } }