

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

# 自托管的 GitHub 操作运行器在 AWS CodeBuild
<a name="action-runner-overview"></a>

您可以将项目配置为在 CodeBuild容器中设置自托管的 Action GitHub s 运行器来处理您的 Actions 工作流程 GitHub 作业。这可以通过使用您的 CodeBuild 项目设置 webhook，然后更新 GitHub 操作工作流程 YAML 以使用托管在计算机上的自托管运行器来完成。 CodeBuild 

配置 CodeBuild 项目以运行 GitHub 操作作业的高级步骤如下：

1. 如果您还没有这样做，请创建个人访问令牌或连接 OAuth 应用程序以将您的项目连接到该应用程序 GitHub。

1. 导航到 CodeBuild 控制台并使用 webhook 创建 CodeBuild 项目，然后设置 webhook 过滤器。

1. 更新您的 GitHub 操作工作流程 YAML GitHub 以配置您的构建环境。

有关更详细的过程，请参阅[教程：配置 CodeBuild托管的 GitHub 操作运行器](action-runner.md)。

此功能允许您的 A GitHub ctions 工作流程任务与之进行原生集成 AWS，从而通过 IAM AWS CloudTrail、 AWS Secrets Manager 集成和 Amazon VPC 等功能提供安全性和便利性。您可以访问最新的实例类型，包括基于 ARM 的实例。

**Topics**
+ [关于 CodeBuild托管的 GitHub 操作运行器](action-runner-questions.md)
+ [教程：配置 CodeBuild托管的 GitHub 操作运行器](action-runner.md)
+ [排查 webhook 的问题](action-runner-troubleshoot-webhook.md)
+ [CodeBuild托管的操作运行器支持的 GitHub 标签覆盖](sample-github-action-runners-update-labels.md)
+ [计算 CodeBuild托管的 GitHub 操作运行器支持的图像](sample-github-action-runners-update-yaml.images.md)

# 关于 CodeBuild托管的 GitHub 操作运行器
<a name="action-runner-questions"></a>

以下是有关 CodeBuild托管 GitHub 操作运行器的一些常见问题。

## 我应该何时在标签中包括映像和实例覆盖？
<a name="action-runner-image-label"></a>

您可以在标签中包含图像和实例覆盖，以便为每个 Actions 工作流程任务指定不同的构建环境。 GitHub 无需创建多个 CodeBuild 项目或 webhook 即可完成此操作。例如，当您需要[为工作流作业使用矩阵](https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs)时，这很有用。

```
name: Hello World
on: [push]
jobs:
  Hello-World-Job:
    runs-on:
      - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
        image:${{ matrix.os }}
        instance-size:${{ matrix.size }}
    strategy:
      matrix:
        include:
          - os: arm-3.0
            size: small
          - os: linux-5.0
            size: large
    steps:
      - run: echo "Hello World!"
```

**注意**  
如果`runs-on`有多个包含 GitHub 操作上下文的标签，则可能需要使用引号。

## 我可以 CloudFormation 用这个功能吗？
<a name="action-runner-cfn"></a>

是的，您可以在 CloudFormation 模板中包含一个筛选器组，用于在项目 webhook 中指定 GitHub操作工作流程作业事件过滤器。

```
Triggers:
  Webhook: true
  FilterGroups:
    - - Type: EVENT
        Pattern: WORKFLOW_JOB_QUEUED
```

有关更多信息，请参阅 [筛选 GitHub webhook 事件 ()CloudFormation](github-webhook-events-cfn.md)。

如果您在 CloudFormation 模板中设置项目凭证时需要帮助，请参阅*AWS CloudFormation 用户指南[AWS::CodeBuild::SourceCredential](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-sourcecredential.html)*中的了解更多信息。

## 使用此特征时如何屏蔽密钥？
<a name="action-runner-secrets"></a>

默认情况下，系统不会屏蔽日志中显示的密钥。如果您想屏蔽密钥，可以使用以下语法：`::add-mask::value`。以下是如何在 YAML 中使用此语法的示例：

```
name: Secret Job
on: [push]
jobs:
  Secret-Job:
    runs-on: codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
    env:
      SECRET_NAME: "secret-name"
    steps:
      - run: echo "::add-mask::$SECRET_NAME"
```

有关更多信息，请参阅[屏蔽登录 GitHub中的值](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#masking-a-value-in-a-log)。

## 我能否在一个项目中接收 GitHub 来自多个存储库的 Actions webhook 事件？
<a name="action-runner-webhooks"></a>

CodeBuild 支持组织和全局级 webhook，它们接收来自指定组织或企业的事件。有关更多信息，请参阅 [GitHub 全球和组织 webhook](github-global-organization-webhook.md)。

## 哪些区域支持使用 CodeBuild托管的 GitHub 操作运行器？
<a name="action-runner-hosted-regions"></a>

CodeBuild所有 CodeBuild 区域都支持托管的 GitHub 操作运行器。有关 AWS 区域 何处 CodeBuild 可用的更多信息，请参阅[按地区划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。

## 哪些平台支持使用 CodeBuild托管的 GitHub 操作运行器？
<a name="action-runner-platform"></a>

CodeBuildAmazon EC2 和[AWS Lambda](lambda.md)计算均支持托管的 GitHub 操作运行器。您可以使用以下平台：Amazon Linux 2、Amazon Linux 2023、Ubuntu 和 Windows Server Core 2019。有关更多信息，请参阅[EC2 计算映像](ec2-compute-images.md)和[Lambda 计算映像](lambda-compute-images.md)。

# 教程：配置 CodeBuild托管的 GitHub 操作运行器
<a name="action-runner"></a>

本教程向您展示如何配置 CodeBuild 项目以运行 Action GitHub s 作业。有关将 GitHub 操作与配合使用的更多信息， CodeBuild 请参阅[教程：配置 CodeBuild托管的 GitHub 操作运行器](#action-runner)。<a name="sample-github-action-runners-prerequisites"></a>

要完成本教程，您首先必须：
+ 使用个人访问令牌、Secrets Manager 密钥、 OAuth 应用程序或 GitHub 应用程序进行连接。如果您想连接 OAuth 应用程序，则必须使用 CodeBuild 控制台进行连接。如果您想创建个人访问令牌，则可以使用 CodeBuild 控制台或使用 [ImportSourceCredentials API](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ImportSourceCredentials.html)。有关更多说明，请参阅 [GitHub 和 GitHub 企业服务器访问权限 CodeBuild](access-tokens-github-overview.md)。
+ Connect CodeBuild 到您的 GitHub 账户。为此，您可以执行以下操作之一：
  + 您可以在控制台中添加 GitHub 为源提供商。您可以使用个人访问令牌、Secrets Manager 密钥、 OAuth 应用程序或 GitHub 应用程序进行连接。有关说明，请参阅[GitHub 和 GitHub 企业服务器访问权限 CodeBuild](access-tokens-github-overview.md)。
  + 您可以通过 [ImportSourceCredentials API](https://docs.aws.amazon.com/cli/latest/reference/codebuild/import-source-credentials.html) 导入您的 GitHub 证书。只有使用个人访问令牌才能执行此操作。如果您使用 OAuth 应用程序进行连接，则必须改用控制台进行连接。有关说明，请参阅[GitHub 使用访问令牌 (CLI) 连接](access-tokens-github.md#access-tokens-github-cli)。
**注意**  
只有当你的账户还没有连接时， GitHub 才需要这样做。

## 第 1 步：使用 webhook 创建 CodeBuild 项目
<a name="sample-github-action-runners-create-project"></a>

在此步骤中，您将创建一个带有 webhook 的 CodeBuild 项目，并在 GitHub 控制台中对其进行审核。您也可以选择 E GitHub nterprise 作为您的源提供商。要了解有关在 GitHub 企业版中创建 webhook 的更多信息，请参阅[GitHub 手动 webhook](github-manual-webhook.md)。

**使用 webhook 创建 CodeBuild 项目**

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. 对于**跑步者提供商**，请选择**GitHub**。

   1. 对于**运行程序位置**，请选择**存储库**。

   1. 在 “存储库” 下的 “**存储库 URL” 中**，选择**https://github.com/user-name/存储库名称**。
**注意**  
默认情况下，您的项目将仅接收单个存储库的 `WORKFLOW_JOB_QUEUED` 事件。如果您想接收组织或企业内所有存储库的事件，请参阅[GitHub 全球和组织 webhook](github-global-organization-webhook.md)。

1. 
   +  在**环境**中：
     + 选择支持的**环境映像**和**计算**。请注意，您可以选择在 GitHub 操作工作流程 YAML 中使用标签来覆盖图像和实例设置。有关更多信息，请参阅 [第 2 步：更新您的 GitHub 操作工作流程 YAML](#sample-github-action-runners-update-yaml)。
   +  在 **Buildspec (构建规范)** 中：
     + 请注意，除非将 `buildspec-override:true` 作为标签添加，否则系统会忽略 buildspec。相反， CodeBuild 将覆盖它以使用设置自托管运行器的命令。

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

1. 打开 GitHub 控制台，验证是否已创建一个 webhook 并已启用 webhook 来传送**工作流作业**事件。`https://github.com/user-name/repository-name/settings/hooks`

## 第 2 步：更新您的 GitHub 操作工作流程 YAML
<a name="sample-github-action-runners-update-yaml"></a>

在此步骤中，您将更新 GitHub 操作工作流程 YAML 文件[https://github.com/](https://github.com/)以配置您的构建环境并在中使用 GitHub Actions 自托管运行器。 CodeBuild有关更多信息，请参阅[在自托管运行器中使用标签](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-labels-with-self-hosted-runners)和[CodeBuild托管的操作运行器支持的 GitHub 标签覆盖](sample-github-action-runners-update-labels.md)。

### 更新你的 GitHub 操作工作流程 YAML
<a name="sample-github-action-runners-update-yaml.setup"></a>

导航到 GitHub 操作工作流程 YAML 中的[https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-labels-with-self-hosted-runners](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-labels-with-self-hosted-runners)设置[https://github.com/](https://github.com/)并进行更新，以配置您的构建环境。为此，您可以执行以下操作之一：
+ 您可以指定项目名称和运行 ID，在这种情况下，构建将使用计算、映像、映像版本和实例大小的现有项目配置。需要项目名称才能将 Actions 作业的 AWS相关设置链接到特定 CodeBuild项目。 GitHub 通过在 YAML 中包含项目名称 CodeBuild ，可以调用具有正确项目设置的作业。通过提供运行 ID， CodeBuild 会将您的构建映射到特定的工作流程运行，并在取消工作流程运行时停止构建。有关更多信息，请参阅 [`github` 上下文](https://docs.github.com/en/actions/learn-github-actions/contexts#github-context)。

  ```
  runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}
  ```
**注意**  
请确保您的名称与您在上一步中创建的项目名称*<project-name>*相匹配。如果不匹配， CodeBuild 则不会处理 webhook， GitHub操作工作流程可能会挂起。

  以下是 GitHub 操作工作流程 YAML 的示例：

  ```
  name: Hello World
  on: [push]
  jobs:
    Hello-World-Job:
      runs-on:
        - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
      steps:
        - run: echo "Hello World!"
  ```
+ 您也可以在标签中覆盖映像和计算类型。有关精选映像的列表，请参阅[计算 CodeBuild托管的 GitHub 操作运行器支持的图像](sample-github-action-runners-update-yaml.images.md)。有关使用自定义映像，请参阅[CodeBuild托管的操作运行器支持的 GitHub 标签覆盖](sample-github-action-runners-update-labels.md)。标签中的计算类型和映像将覆盖项目的环境设置。要替换 CodeBuild EC2 或 Lambda 计算版本的环境设置，请使用以下语法：

  ```
  runs-on:
    - codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}
      image:<environment-type>-<image-identifier>
      instance-size:<instance-size>
  ```

  以下是 GitHub 操作工作流程 YAML 的示例：

  ```
  name: Hello World
  on: [push]
  jobs:
    Hello-World-Job:
      runs-on:
        - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
          image:arm-3.0
          instance-size:small
      steps:
        - run: echo "Hello World!"
  ```
+ 您可以在标签中覆盖构建所用的实例集。这将覆盖在您的项目中配置的实例集设置，以便使用指定的实例集。有关更多信息，请参阅 [在预留容量实例集上运行构建](fleets.md)。要覆盖 Amazon EC2 计算构建的实例集设置，请使用以下语法：

  ```
  runs-on:
    - codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}
      fleet:<fleet-name>
  ```

  要同时覆盖构建所用的实例集和映像，请使用以下语法：

  ```
  runs-on:
    - codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}
      fleet:<fleet-name>
      image:<environment-type>-<image-identifier>
  ```

  以下是 GitHub 操作工作流程 YAML 的示例：

  ```
  name: Hello World
  on: [push]
  jobs:
    Hello-World-Job:
      runs-on:
        - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
          fleet:myFleet
          image:arm-3.0
      steps:
        - run: echo "Hello World!"
  ```
+ 要在自定义图像上运行 Actions GitHub 作业，您可以在 CodeBuild 项目中配置自定义图像，避免提供图像覆盖标签。 CodeBuild 如果未提供图像覆盖标签，则将使用项目中配置的图像。
+ 或者，您可以在 CodeBuild 支持的标签之外提供标签。在覆盖构建的属性时会忽略这些标签，但不会导致 webhook 请求失败。例如，添加 `testLabel` 作为标签不会阻止构建运行。

**注意**  
如果 GitHub托管运行器提供的依赖项在 CodeBuild环境中不可用，则可以在工作流程运行中使用 Acti GitHub ons 安装依赖项。例如，您可以使用 [https://github.com/actions/setup-python](https://github.com/actions/setup-python) 操作为构建环境安装 Python。

### 在 INSTALL、PRE\$1BUILD 和 POST\$1BUILD 阶段运行 buildspec 命令
<a name="sample-github-action-runners-update-yaml.buildspec"></a>

默认情况下，在运行自托管 GitHub 的 Actions 版本时 CodeBuild 会忽略所有 buildspec 命令。要在构建期间运行 buildspec 命令，可以将 `buildspec-override:true` 作为后缀添加到标签中：

```
runs-on:
  - codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}
    buildspec-override:true
```

通过使用此命令， CodeBuild 将在容器的主源文件夹`actions-runner`中创建一个名为的文件夹。当 Ac GitHub tions 运行器在该`BUILD`阶段启动时，运行器将在`actions-runner`目录中运行。

在自托管的 Actions 版本中使用 buildspec 覆盖有几个限制 GitHub ：
+ CodeBuild 在此`BUILD`阶段不会运行 buildspec 命令，因为自托管运行器将在该`BUILD`阶段运行。
+ CodeBuild 在此`DOWNLOAD_SOURCE`阶段不会下载任何主要或次要来源。如果您配置了 buildspec 文件，则只会从项目的主源下载该文件。
+ 如果构建命令在`PRE_BUILD`或`INSTALL`阶段失败， CodeBuild 则无法启动自托管运行器，并且需要手动取消 GitHub 操作工作流程作业。
+ CodeBuild 在该阶段获取跑步者令牌，该`DOWNLOAD_SOURCE`阶段的到期时间为一小时。如果您的`PRE_BUILD`或`INSTALL`阶段超过一小时，则运行器令牌可能会在 GitHub 自托管运行器启动之前过期。

## 步骤 3：检查您的结果
<a name="sample-github-action-runners-verify"></a>

每当 GitHub 操作工作流程运行时， CodeBuild 都会通过 webhook 接收工作流程作业事件。对于工作流程中的每个作业， CodeBuild 启动构建以运行临时的 Actions GitHub 运行器。该运行器负责执行单个工作流作业。作业完成后，运行器和关联的构建过程会立即终止。

要查看您的工作流程作业日志，请导航到中的 GitHub存储库，选择**操作**，选择所需的工作流程，然后选择要查看日志的特定**作业**。

当任务等待中的自托管运行器接管时，您可以在日志中 CodeBuild查看请求的标签。

![\[正在加载作业的日志。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/hello-world-loading.png)


作业完成后，您将能够查看该作业的日志。

![\[作业的日志。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/hello-world-log.png)


## GitHub 操作运行器配置选项
<a name="sample-github-action-runners-config"></a>

您可以在项目配置中指定以下环境变量，以修改自托管运行程序的设置配置。

`CODEBUILD_CONFIG_GITHUB_ACTIONS_ORG_REGISTRATION_NAME`  
CodeBuild 会将自托管的运行器注册到指定为该环境变量值的组织名称。有关在组织级别注册运行器和必要权限的更多信息，请参阅[为组织的 just-in-time运行器创建配置](https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-configuration-for-a-just-in-time-runner-for-an-organization)。

`CODEBUILD_CONFIG_GITHUB_ACTIONS_ENTERPRISE_REGISTRATION_NAME`  
CodeBuild 会将自托管的运行器注册到指定为该环境变量值的企业名称。有关在企业级别注册运行器和必要权限的更多信息，请参阅[为企业 just-in-time运行器创建配置](https://docs.github.com/en/enterprise-server/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-configuration-for-a-just-in-time-runner-for-an-enterprise)。  
默认情况下，企业运行程序不可用于组织存储库。要让自托管运行程序承担工作流程作业，您可能需要配置运行程序组访问权限设置。有关更多信息，请参阅 [Making enterprise runners available to repositories](https://docs.github.com/en/enterprise-server/actions/hosting-your-own-runners/managing-self-hosted-runners/adding-self-hosted-runners#making-enterprise-runners-available-to-repositories)。

`CODEBUILD_CONFIG_GITHUB_ACTIONS_RUNNER_GROUP_ID`  
CodeBuild 会将自托管的运行器注册到存储为该环境变量值的整数运行器组 ID。默认情况下，该值为 1。有关自托管运行程序组的更多信息，请参阅 [Managing access to self-hosted runners using groups](https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-configuration-for-a-just-in-time-runner-for-an-organization)。

`CODEBUILD_CONFIG_GITHUB_ACTIONS_ORG_REGISTRATION_NAME`  
要使用 GitHub操作工作流程 YAML 文件配置组织级别的运行器注册，可以使用以下语法：  

```
name: Hello World
on: [push]
jobs:
  Hello-World-Job:
    runs-on:
      - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
        organization-registration-name:myOrganization
    steps:
      - run: echo "Hello World!"
```

`CODEBUILD_CONFIG_GITHUB_ACTIONS_ENTERPRISE_REGISTRATION_NAME`  
要使用 GitHub操作工作流程 YAML 文件配置企业级运行器注册，可以使用以下语法：  

```
name: Hello World
on: [push]
jobs:
  Hello-World-Job:
    runs-on:
      - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
        enterprise-registration-name:myEnterprise
    steps:
      - run: echo "Hello World!"
```

`CODEBUILD_CONFIG_GITHUB_ACTIONS_RUNNER_GROUP_ID`  
要使用 GitHub 操作工作流程 YAML 文件配置将运行器注册到特定的运行器组 ID，可以使用以下语法：  

```
name: Hello World
on: [push]
jobs:
  Hello-World-Job:
    runs-on:
      - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
        registration-group-id:3
    steps:
      - run: echo "Hello World!"
```

## 筛选 GitHub 操作 webhook 事件 ()CloudFormation
<a name="sample-github-action-runners-webhooks-cfn"></a>

 CloudFormation 模板的以下 YAML 格式部分创建一个筛选条件组，该组在计算结果为 true 时会触发构建。以下筛选器组指定了工作流名称与正则表达式匹配的 Actions 工作流任务请求`\[CI-CodeBuild\]`。 GitHub 

```
CodeBuildProject:
  Type: AWS::CodeBuild::Project
  Properties:
    Name: MyProject
    ServiceRole: service-role
    Artifacts:
      Type: NO_ARTIFACTS
    Environment:
      Type: LINUX_CONTAINER
      ComputeType: BUILD_GENERAL1_SMALL
      Image: aws/codebuild/standard:5.0
    Source:
      Type: GITHUB
      Location: CODEBUILD_DEFAULT_WEBHOOK_SOURCE_LOCATION
    Triggers:
      Webhook: true
      ScopeConfiguration:
        Name: organization-name
        Scope: GITHUB_ORGANIZATION
      FilterGroups:
        - - Type: EVENT
            Pattern: WORKFLOW_JOB_QUEUED
          - Type: WORKFLOW_NAME
            Pattern: \[CI-CodeBuild\]
```

## 筛选 GitHub 操作 webhook 事件 ()AWS CDK
<a name="sample-github-action-runners-webhooks-cdk"></a>

以下 AWS CDK 模板创建了一个筛选器组，当生成结果为 true 时会触发构建。以下筛选器组指定了 GitHub 操作工作流程任务请求。

```
import { aws_codebuild as codebuild } from 'aws-cdk-lib';
import {EventAction, FilterGroup} from "aws-cdk-lib/aws-codebuild";

const source = codebuild.Source.gitHub({
      owner: 'owner',
      repo: 'repo',
      webhook: true,
      webhookFilters: [FilterGroup.inEventOf(EventAction.WORKFLOW_JOB_QUEUED)],
    })
```

## 筛选 GitHub 操作 webhook 事件 (Terraform)
<a name="sample-github-action-runners-webhooks-terraform"></a>

以下 Terraform 模板创建一个筛选条件组，该组在计算结果为 true 时会触发构建。以下筛选器组指定了 GitHub 操作工作流程任务请求。

```
resource "aws_codebuild_webhook" "example" {
  project_name = aws_codebuild_project.example.name
  build_type   = "BUILD"
  filter_group {
    filter {
      type    = "EVENT"
      pattern = "WORKFLOW_JOB_QUEUED"
    }
  }
}
```

## 筛选 GitHub 操作 webhook 事件 ()AWS CLI
<a name="sample-github-action-runners-webhooks-cli"></a>

以下 AWS CLI 命令创建一个自托管 GitHub 的 Actions 运行器项目，其中包含一个 Acti GitHub ons 工作流任务请求筛选器组，该筛选器组在计算结果为 true 时触发构建。

```
aws codebuild create-project \
--name <project name> \
--source "{\"type\":\"GITHUB\",\"location\":\"<repository location>\",\"buildspec\":\"\"}" \
--artifacts {"\"type\":\"NO_ARTIFACTS\""} \
--environment "{\"type\": \"LINUX_CONTAINER\",\"image\": \"aws/codebuild/amazonlinux-x86_64-standard:5.0\",\"computeType\": \"BUILD_GENERAL1_MEDIUM\"}" \
--service-role "<service role ARN>"
```

```
aws codebuild create-webhook \
--project-name <project name> \
--filter-groups "[[{\"type\":\"EVENT\",\"pattern\":\"WORKFLOW_JOB_QUEUED\"}]]"
```

# 排查 webhook 的问题
<a name="action-runner-troubleshoot-webhook"></a>

**问题：**您在中设置的 webhook [教程：配置 CodeBuild托管的 GitHub 操作运行器](action-runner.md) 无法正常工作或您的工作流程任务暂停。 GitHub

**可能的原因：**
+ 您的 webhook **工作流程作业**事件可能无法触发构建。检查**响应**日志以查看响应或错误消息。
+ 由于标签配置，您的作业分配给了不正确的运行程序代理。当单个工作流程运行中一个作业的标签少于另一个作业时，就会出现此问题。例如，如果您在同一个工作流程运行中具有两个带有以下标签的作业：
  + **作业 1**：`codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}`
  + **作业 2**：`codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}`、`instance-size:medium`

  路由自托管的 Ac GitHub tions 作业时， GitHub 会将该任务路由到具有所有作业指定标签的任何运行器。此行为意味着为**作业 1** 或**作业 2** 创建的运行程序可以承担**作业 1**，但是由于**作业 2** 有附加标签，因此只能由为**作业 2** 创建的运行程序承担该作业。如果为**作业 2** 创建的运行程序承担了**作业 1**，则**作业 2** 将卡住，因为**作业 1** 运行程序没有 `instance-size:medium` 标签。

**推荐的解决方案：**

在同一个工作流程运行中创建多个作业时，请为每个作业使用相同数量的标签覆盖，或者为每个作业分配一个自定义标签，例如 `job1` 或 `job2`。

如果错误仍然存在，请按照以下说明调试问题。

1. 打开 GitHub 控制台，查看存储库的 webhook 设置。`https://github.com/user-name/repository-name/settings/hooks`在此页面上，您将看到为您的存储库创建的 webhook。

1. 选择**编辑**并确认已启用该 webhook 来传递**工作流作业**事件。  
![\[工作流作业事件已在您的 webhook 中启用。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/github-actions-workflow-jobs.png)

1.  导航至**最近传输**选项卡，找到相应的 `workflow_job.queued` 事件，然后展开该事件。

1.  查看**负载**中的**标签**字段，并确保该字段符合预期。

1.  最后，查看 “**响应**” 选项卡，因为其中包含返回的响应或错误消息 CodeBuild。  
![\[返回的响应或错误消息 CodeBuild。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/github-actions-workflow-jobs-response.png)

1.  或者，你可以使用 GitHub's APIs 调试 webhook 故障。您可以使用[列出存储库 webhook 的传输](https://docs.github.com/en/rest/repos/webhooks?apiVersion=2022-11-28#list-deliveries-for-a-repository-webhook) API 来查看 webhook 的近期传输：

   ```
   gh api \
     -H "Accept: application/vnd.github+json" \
     -H "X-GitHub-Api-Version: 2022-11-28" \
     /repos/owner/repo/hooks/hook-id/deliveries
   ```

    找到要调试的 webhook 交付并记下交付 ID 后，您可以使用[获取存储库 webhook 的交付](https://docs.github.com/en/rest/repos/webhooks?apiVersion=2022-11-28#get-a-delivery-for-a-repository-webhook) API。 CodeBuild对 webhook 交付有效负载的响应可以在以下`response`部分中找到：

   ```
   gh api \
     -H "Accept: application/vnd.github+json" \
     -H "X-GitHub-Api-Version: 2022-11-28" \
     /repos/owner/repo/hooks/hook-id/deliveries/delivery-id
   ```

**问题：**启用[部署保护](https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-deployments/reviewing-deployments)规则的 GitHub 操作会在部署获得批准 CodeBuild 之前在内部生成触发器。

**可能的原因：** CodeBuild 获取与 Actions 作业关联的 GitHub 部署和环境（如果存在），以验证是否获得批准。如果 CodeBuild 无法获取部署或环境，则可能会过早触发 CodeBuild 构建。

**推荐的解决方案：**验证与您的 CodeBuild 项目关联的凭证是否具有内部部署和操作的读取权限 GitHub。

# CodeBuild托管的操作运行器支持的 GitHub 标签覆盖
<a name="sample-github-action-runners-update-labels"></a>

在你的 A GitHub ctions 工作流程 YAML 中，你可以提供各种标签覆盖来修改你的自托管运行器构建。任何未被识别的版本都 CodeBuild 将被忽略，但不会使您的 webhook 请求失败。例如，以下工作流程 YAML 包括映像、实例大小、实例集和 buildspec 的覆盖：

```
name: Hello World
on: [push]
jobs:
  Hello-World-Job:
    runs-on:
      - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}
        image:${{ matrix.os }}
        instance-size:${{ matrix.size }}
        fleet:myFleet
        buildspec-override:true
    strategy:
      matrix:
        include:
          - os: arm-3.0
            size: small
          - os: linux-5.0
            size: large
    steps:
      - run: echo "Hello World!"
```

**注意**  
如果您的工作流程任务处于暂停 GitHub状态，请参阅[排查 webhook 的问题](action-runner-troubleshoot-webhook.md)和[使用自定义标签路由作业](https://docs.github.com/en/enterprise-server@3.12/actions/hosting-your-own-runners/managing-self-hosted-runners/using-self-hosted-runners-in-a-workflow?learn=hosting_your_own_runners&learnProduct=actions#using-custom-labels-to-route-jobs)。

`codebuild-<project-name>-${{github.run_id}}-${{github.run_attempt}}`（必需）
+ 示例：`codebuild-fake-project-${{ github.run_id }}-${{ github.run_attempt }}`
+ 所有 GitHub 操作工作流程均为必填项 YAMLs。 *<project name>*应等于为其配置自托管运行器 webhook 的项目的名称。

`image:<environment-type>-<image-identifier>`
+ 示例：`image:arm-3.0`
+ 覆盖在通过精选映像启动自托管运行程序构建时使用的映像和环境类型。要了解支持的值，请参阅[计算 CodeBuild托管的 GitHub 操作运行器支持的图像](sample-github-action-runners-update-yaml.images.md)。
  + 要覆盖与自定义映像结合使用的映像和环境类型，请使用 `image:custom-<environment-type>-<custom-image-identifier>`
  + 示例：`image:custom-arm-public.ecr.aws/codebuild/amazonlinux-aarch64-standard:3.0`
**注意**  
如果自定义映像位于私有注册表中，请参阅[为自托管运行程序配置私有注册表凭证](private-registry-sample-configure-runners.md)。

`instance-size:<instance-size>`
+ 示例：`instance-size:medium`
+ 覆盖在启动自托管运行器构建时使用的实例类型。要了解支持的值，请参阅[计算 CodeBuild托管的 GitHub 操作运行器支持的图像](sample-github-action-runners-update-yaml.images.md)。

`fleet:<fleet-name>`
+ 示例：`fleet:myFleet`
+ 覆盖在您的项目中配置的实例集设置，以便使用指定的实例集。有关更多信息，请参阅 [在预留容量实例集上运行构建](fleets.md)。

`buildspec-override:<boolean>`
+ 示例：`buildspec-override:true`
+ 如果设置为 `true`，则允许构建以在 `INSTALL`、`PRE_BUILD` 和 `POST_BUILD` 阶段运行 buildspec 命令。

## 单个标签覆盖（旧版）
<a name="sample-github-action-runners-update-single-labels"></a>

CodeBuild 允许您使用以下方法在单个标签中提供多个覆盖：
+ 要覆盖 Amazon EC2/Lambda 计算构建的环境设置，请使用以下语法：

  ```
  runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}-<environment-type>-<image-identifier>-<instance-size>
  ```
+ 要覆盖 Amazon EC2 计算构建的实例集设置，请使用以下语法：

  ```
  runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}-fleet-<fleet-name>
  ```
+ 要同时覆盖构建所用的实例集和映像，请使用以下语法：

  ```
  runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}-image-<image-version>-fleet-<fleet-name>
  ```
+ 要在构建期间运行 buildspec 命令，可以将 `-with-buildspec` 作为后缀添加到标签中：

  ```
  runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}-<image>-<image-version>-<instance-size>-with-buildspec
  ```
+ 或者，您也可以提供实例大小覆盖，而不覆盖映像。对于 Amazon EC2 构建，您可以排除环境类型和映像标识符。对于 Lambda 构建，您可以排除映像标识符。

# 计算 CodeBuild托管的 GitHub 操作运行器支持的图像
<a name="sample-github-action-runners-update-yaml.images"></a>

在中配置的标签中[教程：配置 CodeBuild托管的 GitHub 操作运行器](action-runner.md)，您可以使用前三列中的值来覆盖您的 Amazon EC2 环境设置。 CodeBuild 提供了以下 Amazon EC2 计算映像。有关 

<a name="build-env-ref.supported-images"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/sample-github-action-runners-update-yaml.images.html)

此外，您还可以使用以下值来覆盖 Lambda 环境设置。有关 CodeBuild Lambda 计算的更多信息，请参阅。[在 AWS Lambda 计算基础上运行构建](lambda.md) CodeBuild 支持以下 Lambda 计算映像：

<a name="lambda.supported-images"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/sample-github-action-runners-update-yaml.images.html)

有关更多信息，请参阅[构建环境计算模式和类型](build-env-ref-compute-types.md)和[提供的 Docker 镜像 CodeBuild](build-env-ref-available.md)。