教程:配置 CodeBuild 托管的 GitHub Actions 运行器 - AWS CodeBuild

教程:配置 CodeBuild 托管的 GitHub Actions 运行器

本教程演示了如何配置 CodeBuild 项目来运行 GitHub Actions 作业。有关将 GitHub Actions 与 CodeBuild 结合使用的更多信息,请参阅教程:配置 CodeBuild 托管的 GitHub Actions 运行器。

要完成本教程,您首先必须:

  • 使用个人访问令牌、Secrets Manager 密钥、OAuth 应用程序或 GitHub 应用程序进行连接。如果您想使用 OAuth 应用程序来连接,则必须使用 CodeBuild 控制台进行。如果您想创建个人访问令牌,可以使用 CodeBuild 控制台,也可以使用 ImportSourceCredentials API。有关更多说明,请参阅 CodeBuild 中的 GitHub 和 GitHub Enterprise Server 访问

  • 将 CodeBuild 连接到您的 GitHub 账户。为此,您可以执行以下操作之一:

    注意

    仅当您的账户尚未连接到 GitHub 时,才需要执行此操作。

步骤 1:创建带有 webhook 的 CodeBuild 项目

在此步骤中,您将创建一个带有 webhook 的 CodeBuild 项目,并在 GitHub 控制台中进行检查。您也可以选择 GitHub Enterprise 作为源提供商。要了解有关在 GitHub Enterprise 中创建 webhook 的更多信息,请参阅GitHub 手动 webhook

创建带有 webhook 的 CodeBuild 项目
  1. https://console.aws.amazon.com/codesuite/codebuild/home 打开 AWS CodeBuild 控制台。

  2. 创建构建项目。有关信息,请参阅创建构建项目(控制台)运行构建(控制台)

  3. 项目类型中,选择运行程序项目

    运行程序中:

    1. 对于运行程序提供商,选择 GitHub

    2. 对于运行程序位置,请选择存储库

    3. 对于存储库下的存储库 URL,选择 https://github.com/user-name/repository-name

    注意

    默认情况下,您的项目将仅接收单个存储库的 WORKFLOW_JOB_QUEUED 事件。如果您想接收组织或企业内所有存储库的事件,请参阅GitHub 全局和组织 webhook

    • 环境中:

    • Buildspec (构建规范) 中:

      • 请注意,除非将 buildspec-override:true 作为标签添加,否则系统会忽略 buildspec。相反,CodeBuild 将覆盖它,以便使用特定命令来设置自托管运行器。

  4. 继续使用默认值,然后选择创建构建项目

  5. https://github.com/user-name/repository-name/settings/hooks 打开 GitHub 控制台,确认已创建一个 webhook,并已启用来传递工作流作业事件。

步骤 2:更新 GitHub Actions 工作流 YAML

在此步骤中,您将在 GitHub 中更新 GitHub Actions 工作流 YAML 文件,以便配置您的构建环境并在 CodeBuild 中使用 GitHub Actions 自托管运行器。有关更多信息,请参阅在自托管运行器中使用标签CodeBuild 托管的 GitHub Actions 运行器支持的标签覆盖

更新 GitHub Actions 工作流 YAML

导航至 GitHub 并更新 GitHub Actions 工作流 YAML 中的 runs-on 设置,以便配置您的构建环境。为此,您可以执行以下操作之一:

  • 您可以指定项目名称和运行 ID,在这种情况下,构建将使用计算、映像、映像版本和实例大小的现有项目配置。需要有项目名称才能将 GitHub Actions 作业的 AWS 相关设置链接到特定 CodeBuild 项目。通过在 YAML 中包括项目名称,CodeBuild 可以调用具有正确项目设置的作业。通过提供运行 ID,CodeBuild 会将您的构建映射到特定的工作流运行,并在工作流运行取消时停止构建。有关更多信息,请参阅 github 上下文

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

    确保您的 <project-name> 与您在上一步中创建的项目名称匹配。如果不匹配,CodeBuild 将无法处理 webhook,GitHub Actions 工作流可能会挂起。

    以下是 GitHub Actions 工作流 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 Actions 运行器支持的映像。有关使用自定义映像,请参阅CodeBuild 托管的 GitHub Actions 运行器支持的标签覆盖。标签中的计算类型和映像将覆盖项目的环境设置。要覆盖 CodeBuild EC2 或 Lambda 计算构建的环境设置,请使用以下语法:

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

    以下是 GitHub Actions 工作流 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!"
  • 您可以在标签中覆盖构建所用的实例集。这将覆盖在您的项目中配置的实例集设置,以便使用指定的实例集。有关更多信息,请参阅 在预留容量实例集上运行构建。要覆盖 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 Actions 工作流 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!"
  • 要在自定义映像中运行 GitHub Actions 作业,您可以在 CodeBuild 项目中配置自定义映像,这样就不需要提供映像覆盖标签。如果未提供映像覆盖标签,CodeBuild 将使用项目中配置的映像。

  • (可选)您可以提供 CodeBuild 支持的标签以外的其他标签。在覆盖构建的属性时会忽略这些标签,但不会导致 webhook 请求失败。例如,添加 testLabel 作为标签不会阻止构建运行。

注意

如果 GitHub 托管的运行器提供的依赖项在 CodeBuild 环境中不可用,则可以在工作流运行中使用 GitHub Actions 安装依赖项。例如,您可以使用 setup-python 操作为构建环境安装 Python。

在 INSTALL、PRE_BUILD 和 POST_BUILD 阶段运行 buildspec 命令

默认情况下,在运行自托管 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 的文件夹。当 GitHub Actions 运行器在 BUILD 阶段启动时,运行器将在 actions-runner 目录中运行。

在自托管 GitHub Actions 构建中使用 buildspec 覆盖有几个限制:

  • 因为自托管运行器在 BUILD 阶段运行,CodeBuild 不会在 BUILD 阶段运行 buildspec 命令。

  • DOWNLOAD_SOURCE 阶段,CodeBuild 不会下载任何主源或辅助源。如果您配置了 buildspec 文件,则只会从项目的主源下载该文件。

  • 如果构建命令在 PRE_BUILDINSTALL 阶段失败,则 CodeBuild 将不会启动自托管运行器,并且需要手动取消 GitHub Actions 工作流作业。

  • CodeBuild 将在 DOWNLOAD_SOURCE 阶段获取运行器令牌,该阶段的过期时间为一小时。如果 PRE_BUILDINSTALL 阶段超过一小时,则运行器令牌可能会在 GitHub 自托管运行器启动之前过期。

步骤 3:检查您的结果

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

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

在 CodeBuild 中等待自托管运行器提取作业时,您可以在日志中查看请求的标签。

正在加载作业的日志。

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

作业的日志。

GitHub Actions 运行程序配置选项

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

CODEBUILD_CONFIG_GITHUB_ACTIONS_ORG_REGISTRATION_NAME

CodeBuild 将自托管运行程序注册到组织名称(指定为该环境变量的值)。有关在组织级别注册运行程序和必要权限的更多信息,请参阅 Create configuration for a just-in-time runner for an organization

CODEBUILD_CONFIG_GITHUB_ACTIONS_ENTERPRISE_REGISTRATION_NAME

CodeBuild 将自托管运行程序注册到企业名称(指定为该环境变量的值)。有关在企业级别注册运行程序和必要权限的更多信息,请参阅 Create configuration for a just-in-time runner for an Enterprise

注意

默认情况下,企业运行程序不可用于组织存储库。要让自托管运行程序承担工作流程作业,您可能需要配置运行程序组访问权限设置。有关更多信息,请参阅 Making enterprise runners available to repositories

CODEBUILD_CONFIG_GITHUB_ACTIONS_RUNNER_GROUP_ID

CodeBuild 将自托管运行程序注册到整数运行程序组 ID(存储为该环境变量的值)。默认情况下,该值为 1。有关自托管运行程序组的更多信息,请参阅 Managing access to self-hosted runners using groups

CODEBUILD_CONFIG_GITHUB_ACTIONS_ORG_REGISTRATION_NAME

要使用 GitHub Actions 工作流程 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 Actions 工作流程 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 Actions 工作流程 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 Actions webhook 事件(CloudFormation)

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

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 Actions webhook 事件(AWS CDK)

以下 AWS CDK 模板创建一个筛选条件组,该组在计算结果为 true 时会触发构建。以下筛选条件组指定 GitHub Actions 工作流作业请求。

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 Actions webhook 事件(Terraform)

以下 Terraform 模板创建一个筛选条件组,该组在计算结果为 true 时会触发构建。以下筛选条件组指定 GitHub Actions 工作流作业请求。

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 Actions webhook 事件(AWS CLI)

以下 AWS CLI 命令创建一个自托管 GitHub Actions 运行程序项目,并具有一个 GitHub Actions 工作流程作业请求筛选条件组,该筛选条件组在计算结果为 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\"}]]"