Tutorial: Configuración de un ejecutor de GitHub Actions alojado en CodeBuild - AWS CodeBuild

Tutorial: Configuración de un ejecutor de GitHub Actions alojado en CodeBuild

En este tutorial, se muestra cómo configurar los proyectos de CodeBuild para ejecutar trabajos de GitHub Actions. Para obtener más información sobre cómo usar GitHub Actions con CodeBuild, consulte Tutorial: Configuración de un ejecutor de GitHub Actions alojado en CodeBuild.

Para completar este tutorial, primero debe:

  • Conéctese con un token de acceso personal, un secreto de Secrets Manager, una aplicación OAuth o una aplicación GitHub. Si quiere conectarse con una aplicación OAuth, debe usar la consola de CodeBuild para ello. Si quiere crear un token de acceso personal, puede usar la consola de CodeBuild o la API ImportSourceCredentials. Para obtener instrucciones adicionales, consulte Acceso a GitHub y GitHub Enterprise Server en CodeBuild.

  • Conecte CodeBuild a su cuenta de GitHub. Para ello, puede hacer una de las acciones siguientes:

    nota

    Esto solo es necesario hacerlo si no se ha conectado a GitHub para su cuenta.

Paso 1: creación de un proyecto de CodeBuild con un webhook

En este paso, va a crear un proyecto de CodeBuild con un webhook y lo revisará en la consola de GitHub. También puede elegir GitHub Enterprise como proveedor de origen. Para obtener más información acerca de cómo crear un webhook en GitHub Enterprise, consulte Webhooks manuales de GitHub.

Para crear un proyecto de CodeBuild con un webhook
  1. Abra la consola de AWS CodeBuild en https://console.aws.amazon.com/codesuite/codebuild/home.

  2. Cree un proyecto de compilación. Para obtener más información, consulte Creación de un proyecto de compilación (consola) y Ejecutar una compilación (consola).

  3. En Tipo de proyecto, seleccione Proyecto de ejecutor.

    En Ejecutor:

    1. En Proveedor de ejecutor, elija GitHub.

    2. En Ubicación del ejecutor, seleccione Repositorio.

    3. En URL del repositorio en Repositorio, elija https://github.com/user-name/repository-name.

    nota

    De forma predeterminada, el proyecto únicamente recibirá eventos WORKFLOW_JOB_QUEUED para un solo repositorio. Si quiere recibir eventos para todos los repositorios de una organización o empresa, consulte Webhooks de organización y globales de GitHub.

    • En Environment (Entorno):

    • En Buildspec:

      • Tenga en cuenta que su especificación de compilación se ignorará a menos que se agregue buildspec-override:true como etiqueta. En su lugar, CodeBuild la anulará para usar comandos que configurarán el ejecutor autoalojado.

  4. Continúe con los valores predeterminados y, a continuación, elija Crear el proyecto de compilación.

  5. Abra la consola de GitHub en https://github.com/user-name/repository-name/settings/hooks para verificar que se haya creado un webhook y que esté habilitado para entregar eventos de trabajos de flujo de trabajo.

Paso 2: actualización del YAML del flujo de trabajo de GitHub Actions

En este paso, se va a actualizar el archivo YAML del flujo de trabajo de GitHub Actions en GitHub para configurar el entorno de compilación y usar los ejecutores autoalojados de GitHub Actions en CodeBuild. Para obtener más información, consulte Uso de etiquetas con ejecutores autohospedados y Anulaciones de etiquetas admitidas con el ejecutor de GitHub Actions alojado en CodeBuild.

Actualización del YAML del flujo de trabajo de GitHub Actions

Desplácese hasta GitHub y actualice la configuración de runs-on en el archivo YAML del flujo de trabajo de GitHub Actions para configurar su entorno de compilación. Para ello, puede hacer una de las acciones siguientes:

  • Puede especificar el nombre del proyecto y el ID de ejecución, en cuyo caso la compilación usará la configuración de proyecto existente para la computación, la imagen, la versión de la imagen y el tamaño de la instancia. El nombre del proyecto es necesario para vincular la configuración relacionada con AWS del trabajo de GitHub Actions a un proyecto de CodeBuild específico. Al incluir el nombre del proyecto en el YAML, CodeBuild puede invocar trabajos con la configuración de proyecto correcta. Al proporcionar el ID de ejecución, CodeBuild asignará su compilación a ejecuciones de flujo de trabajo específicas y la detendrá cuando se cancele la ejecución del flujo de trabajo. Para obtener más información, consulte el contexto de github.

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

    Asegúrese de que el valor de <project-name> coincida con el nombre del proyecto que ha creado en el paso anterior. Si no coincide, CodeBuild no procesará el webhook y el flujo de trabajo de GitHub Actions puede dejar de responder.

    A continuación se muestra un ejemplo de YAML de flujo de trabajo de GitHub Actions:

    name: Hello World on: [push] jobs: Hello-World-Job: runs-on: - codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }} steps: - run: echo "Hello World!"
  • También puede anular el tipo de computación e imagen en la etiqueta. Consulte Imágenes de computación compatibles con el ejecutor de GitHub Actions alojado en CodeBuild para ver una lista de imágenes seleccionadas. Para usar imágenes personalizadas, consulte Anulaciones de etiquetas admitidas con el ejecutor de GitHub Actions alojado en CodeBuild. El tipo de computación y la imagen de la etiqueta anularán la configuración del entorno en el proyecto. Para anular la configuración del entorno para una compilación de computación de EC2 de CodeBuild o Lambda, utilice la siguiente sintaxis:

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

    A continuación se muestra un ejemplo de YAML de flujo de trabajo de GitHub Actions:

    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!"
  • Puede anular la flota utilizada para su compilación en la etiqueta. Al hacerlo, se anularán los valores de flota configurados en el proyecto para usar la flota especificada. Para obtener más información, consulte Ejecución de compilaciones en flotas de capacidad reservada. Si quiere anular la configuración de la flota para una compilación de computación de Amazon EC2, utilice la siguiente sintaxis:

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

    Para anular tanto la flota como la imagen utilizadas para la compilación, utilice la sintaxis siguiente:

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

    A continuación se muestra un ejemplo de YAML de flujo de trabajo de GitHub Actions:

    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!"
  • Para ejecutar sus trabajos de GitHub Actions en una imagen personalizada, puede configurar una imagen personalizada en el proyecto de CodeBuild y evitar proporcionar una etiqueta de anulación de imagen. CodeBuild usará la imagen configurada en el proyecto si no se proporciona ninguna etiqueta de anulación de imagen.

  • Como opción, puede proporcionar etiquetas distintas a las admitidas por CodeBuild. Estas etiquetas se ignorarán para el fin de anular los atributos de la compilación, pero no provocarán un error de la solicitud de webhook. Por ejemplo, agregar testLabel como etiqueta no impedirá que la compilación se ejecute.

nota

Si una dependencia proporcionada por los ejecutores alojados en GitHub no está disponible en el entorno de CodeBuild, puede instalar la dependencia mediante GitHub Actions en la ejecución del flujo de trabajo. Por ejemplo, puede usar la acción setup-python para instalar Python en su entorno de compilación.

Ejecución de comandos buildspec durante las fases INSTALL, PRE_BUILD y POST_BUILD

De forma predeterminada, CodeBuild ignora cualquier comando buildspec al ejecutar una compilación de GitHub Actions autoalojada. Para ejecutar comandos buildspec durante la compilación, se puede agregar buildspec-override:true como sufijo a la etiqueta:

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

Con este comando, CodeBuild creará una carpeta llamada actions-runner en la carpeta de origen principal del contenedor. Cuando el ejecutor de GitHub Actions se inicie durante la fase BUILD, este se ejecutará en el directorio actions-runner.

Existen varias limitaciones al usar una anulación de buildspec en una compilación de GitHub Actions autoalojada:

  • CodeBuild no ejecutará comandos buildspec durante la fase BUILD, ya que el ejecutor autoalojado se ejecuta en la fase BUILD.

  • CodeBuild no descargará ningún origen principal o secundario durante la fase DOWNLOAD_SOURCE. Si ha configurado un archivo buildspec, solo se descargará ese archivo del origen principal del proyecto.

  • Si un comando de compilación genera un error en la fase PRE_BUILD o INSTALL, CodeBuild no iniciará el ejecutor autoalojado y el trabajo del flujo de trabajo de GitHub Actions deberá cancelarse de forma manual.

  • CodeBuild obtiene el token del ejecutor durante la fase DOWNLOAD_SOURCE, que tiene un tiempo de vencimiento de una hora. Si las fases PRE_BUILD o INSTALL duran más de una hora, el token del ejecutor puede caducar antes de que se inicie el ejecutor autoalojado de GitHub.

Paso 3: revisión de los resultados

Siempre que se ejecuta un flujo de trabajo de GitHub Actions, CodeBuild recibe los eventos del trabajo del flujo de trabajo a través del webhook. Para cada trabajo del flujo de trabajo, CodeBuild inicia una compilación para utilizar un ejecutor efímero de GitHub Actions. Este es responsable de ejecutar un único trabajo del flujo de trabajo. Una vez que se complete el trabajo, el ejecutor y el proceso de compilación asociado finalizarán de forma inmediata.

Para ver los registros de los trabajos de flujo de trabajo, navegue hasta su repositorio en GitHub, elija Actions, elija el flujo de trabajo que desee y, a continuación, seleccione el elemento Job específico para el que le gustaría revisar los registros.

Puede revisar las etiquetas solicitadas en el registro mientras el trabajo espera a que lo seleccione un ejecutor autoalojado en CodeBuild.

El registro del trabajo se carga.

Una vez que se haya completado el trabajo, podrá ver el registro de este.

El registro del trabajo

Opciones de configuración del ejecutor de GitHub Actions

Puede especificar las siguientes variables de entorno en la configuración del proyecto para modificar la configuración de instalación de los ejecutores autoalojados.

CODEBUILD_CONFIG_GITHUB_ACTIONS_ORG_REGISTRATION_NAME

CodeBuild registrará los ejecutores autoalojados con el nombre de la organización especificado como valor de esta variable de entorno. Para obtener más información sobre el registro de ejecutores en el nivel de organización y los permisos necesarios, consulte Creación de una configuración para un ejecutor justo a tiempo para una organización.

CODEBUILD_CONFIG_GITHUB_ACTIONS_ENTERPRISE_REGISTRATION_NAME

CodeBuild registrará los ejecutores autoalojados con el nombre de la empresa especificado como valor de esta variable de entorno. Para obtener más información sobre el registro de ejecutores en el nivel de empresa y los permisos necesarios, consulte Creación de una configuración para un ejecutor justo a tiempo para una empresa.

nota

De forma predeterminada, los ejecutores empresariales no están disponibles en los repositorios de la organización. Para que los ejecutores autoalojados recojan trabajos de flujos de trabajo, es posible que deba configurar los ajustes de acceso al grupo de ejecutores. Para obtener más información, consulte Adición de ejecutores de empresa a repositorios.

CODEBUILD_CONFIG_GITHUB_ACTIONS_RUNNER_GROUP_ID

CodeBuild registrará los ejecutores autoalojados con el ID entero del grupo de ejecutores almacenado como valor de esta variable de entorno. De forma predeterminada este valor es 1. Para obtener más información sobre los grupos de ejecutores autoalojados, consulte Administración del acceso a ejecutores autoalojados mediante grupos.

CODEBUILD_CONFIG_GITHUB_ACTIONS_ORG_REGISTRATION_NAME

Para configurar el registro de ejecutores de nivel de organización mediante un archivo YAML de flujo de trabajo de GitHub Actions, puede usar la siguiente sintaxis:

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

Para configurar el registro de ejecutores de nivel de empresa mediante un archivo YAML de flujo de trabajo de GitHub Actions, puede usar la siguiente sintaxis:

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

Para configurar el registro de ejecutores con el ID específico del grupo de ejecutores mediante un archivo YAML de flujo de trabajo de GitHub Actions, puede usar la siguiente sintaxis:

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

Filtrado de eventos de webhook de GitHub Actions (CloudFormation)

La siguiente parte de una plantilla de CloudFormation con formato YAML crea un grupo de filtros que desencadena una compilación cuando se evalúa como true. El siguiente grupo de filtros especifica una solicitud de trabajo de flujo de trabajo de GitHub Actions con un nombre de flujo de trabajo que coincide con la expresión regular \[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\]

Filtrado de eventos de webhook de GitHub Actions (AWS CDK)

La siguiente plantilla de AWS CDK crea un grupo de filtros que desencadena una compilación cuando se evalúa como true. El siguiente grupo de filtros especifica una solicitud de trabajo de flujo de trabajo de 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)], })

Filtrado de eventos de webhook de GitHub Actions (Terraform)

La siguiente plantilla de Terraform crea un grupo de filtros que desencadena una compilación cuando se evalúa como true. El siguiente grupo de filtros especifica una solicitud de trabajo de flujo de trabajo de 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" } } }

Filtrado de eventos de webhook de GitHub Actions (AWS CLI)

Los siguientes comandos de la AWS CLI crean un proyecto de ejecutor de GitHub Actions autoalojado con un grupo de filtros de solicitudes de trabajo del flujo de trabajo de GitHub Actions que desencadena una compilación cuando se evalúa como 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\"}]]"