Skip to main content

Automatizar al Dependabot con las GitHub Actions

Ejemplos de cómo puedes utilizar las GitHub Actions para automatizar las tareas comunes relacionadas con el Dependabot.

People with write permissions to a repository can configure GitHub Actions to respond to Dependabot-created pull requests.

Nota: La seguridad del Dependabot y las actualizaciones de versión actualmente se encuentran en beta público y están sujetas a cambios.

Nota: Tu administrador de sitio debe configurar las Actualizaciones del dependabot para tu instancia de GitHub Enterprise Server antes de que puedas utilizar esta característica. Para obtener más información, consulta la sección "Habilitar la Dependabot en tu empresa".

Acerca del Dependabot y de las GitHub Actions

El Dependabot crea las solicitudes de cambios para mantener actualizadas tus dependencias y puedes utilizar las GitHub Actions para llevar a cabo tareas automatizadas cuando se creen estas solicitudes de cambios. Por ejemplo, recupera artefactos adicionales, agrega etiquetas, ejecuta pruebas o modifica la solicitud de cambios de cualquier otra forma.

Responder a los eventos

El Dependabot puede activar flujos de trabajo de las GitHub Actions en sus solicitudes de cambios y comentarios; sin embargo, algunos eventos se tratan de forma distinta.

Las siguientes restricciones aplican para los flujos de trabajo que inicia el Dependabot (github.actor == 'dependabot[bot]') y que utilizan los eventos pull_request, pull_request_review, pull_request_review_comment, push, create, deployment y deployment_status:

  • El GITHUB_TOKEN tiene permisos de solo lectura predeterminadamente.
  • Los secretos se llenan desde los secretos del Dependabot. Los secretos de las GitHub Actions no están disponibles.

Para los flujos de trabajo que inicia el Dependabot (github.actor == 'dependabot[bot]') y que utilizan el evento pull_request_target, si el Dependabot (github.actor == 'dependabot[bot]') creó la referencia base de la solicitud de cambios, el GITHUB_TOKEN será de solo lectura y los secretos no estarán disponibles.

Para obtener màs informaciòn, consulta la secciòn "Mantener seguras tus GitHub Actions y flujos de trabajo: Prevenir solicitudes de tipo pwn".

Cambiar los permisos de GITHUB_TOKEN

Predeterminadamente, los flujos de trabajo de las GitHub Actions que activa el Dependabot obtendrán un GITHUB_TOKEN con permisos de solo lectura. Puedes utilizar la llave de permissions en tu flujo de trabajo para incrementar el acceso del token:

name: CI
on: pull_request

# Set the access for individual scopes, or use permissions: write-all
permissions:
  pull-requests: write
  issues: write
  repository-projects: write
  ...

jobs:
  ...

Para obtener màs informaciòn, consulta la secciòn "Modificar los permisos para el GITHUB_TOKEN".

Acceder a los secretos

Cuando un evento del Dependabot activa un flujo de trabajo, los únicos secretos disponibles para dicho flujo de trabajo son los del Dependabot. Los secretos de las GitHub Actions no están disponibles. Por lo tanto, debes almacenar cualquier secreto que utilice un flujo de trabajo activado mediante los eventos del Dependabot como secretos del Dependabot. Para obtener más información, consulta la sección "Administrar los secretos cifrados del Dependabot".

Los secretos del Dependabot se agregan al contexto de secrets y se referencian utilizando exactamente la misma sintaxis que la de los secretos para las GitHub Actions. Para obtener más información, consulta la sección "Secretos cifrados".

Si tienes un flujo de trabajo que se activará mediante el Dependabot y también mediante otros actores, la solución más simple es almacenar el token con los permisos requeridos en una acción y en un secreto del Dependabot con nombres idénticos. Entonces, el flujo de trabajo puede incluir una llamada simple a estos secretos. Si el secreto del Dependabot tiene un nombre diferente, utiliza condiciones para especificar los secretos correctos para que los utilicen los diferentes actores. Para ver ejemplos que utilizan condiciones, consulta la sección de "Automatizaciones comunes" a continuación.

Para acceder a un registro de contenedor privado en AWS con un nombre de usuario y contraseña, un flujo de trabajo deberá incluir un secreto para el username y la password. En el siguiente ejemplo, cuando el Dependabot activa el flujo de trabajo, se utilizan los secretos del Dependabot con los nombres READONLY_AWS_ACCESS_KEY_ID y READONLY_AWS_ACCESS_KEY. Si otro actor activa el flujo de trabajo, se utilizarán los secretos de las acciones con estos nombres.

name: CI
on:
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Login to private container registry for dependencies
        uses: docker/login-action@v1
        with:
          registry: https://1234567890.dkr.ecr.us-east-1.amazonaws.com
          username: ${{ secrets.READONLY_AWS_ACCESS_KEY_ID }}
          password: ${{ secrets.READONLY_AWS_ACCESS_KEY }}

      - name: Build the Docker image
        run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)

Volver a ejecutar un flujo de trabajo manualmente

También puedes volver a ejecutar un flujo de trabajo fallido del Dependabot manualmente y este seguirá ejecutándose con un token de lectura-escritura y con acceso a los secretos. Antes de volver a ejecutar los flujos de trabajo fallidos manualmente, siempre debes verificar la dependencia que se está actualizando para asegurarte de que el cambio no introduzca ningún comportamiento imprevisto o malicioso.

Automatizaciones comunes del Dependabot

Aquí mostramos varios escenarios comunes que pueden automatizarse utilizando las GitHub Actions.

Recuperar metadatos de una solicitud de cambios

Automatizar mucho requiere saber información del contenido de la solicitud de cambios: cuál era el nombre de la dependencia, si es una dependencia productva y si es una actualización de parche menor o mayor.

La acción dependabot/fetch-metadata te proporciona toda esta información:

name: Dependabot fetch metadata
on: pull_request

permissions:
  pull-requests: write
  issues: write
  repository-projects: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1.1.1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      # The following properties are now available:
      #  - steps.metadata.outputs.dependency-names
      #  - steps.metadata.outputs.dependency-type
      #  - steps.metadata.outputs.update-type      

Para obtener más información, consulta el repositorio dependabot/fetch-metadata.

Etiquetar una solicitud de cambios

Si tienes otros flujos de trabajo de automatización o clasificación que se basen en etiquetas de GitHub, puedes configurar una acción para asignar etiquetas con base en los metadatos proporcionados.

Por ejemplo, si quieres etiquetar todas las actualizaciones de las dependencias de producción con una etiqueta:

name: Dependabot auto-label
on: pull_request

permissions:
  pull-requests: write
  issues: write
  repository-projects: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1.1.1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Add a label for all production dependencies
        if: ${{ steps.metadata.outputs.dependency-type == 'direct:production' }}
        run: gh pr edit "$PR_URL" --add-label "production"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}

Aprobar una solicitud de cambios

Si quieres aprobar las solicitudes de cambios del Dependabot automáticamente, puedes utilizar el CLI de GitHub en un flujo de trabajo:

name: Dependabot auto-approve
on: pull_request

permissions:
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1.1.1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Approve a PR
        run: gh pr review --approve "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

Habilita la fusión automática en una solicitud de cambios

Si quieres permitir que los mantenedores marquen solicitudes de cambio específicas para su fusión automática, puedes utilizar la funcionalidad de fusión automática de GitHub. Esto habilita a la solicitud de cambios para que se fusione cuando se cumpla con todas las pruebas y aprobaciones requeridas. Para obtener más información sobre la fusión automática, consulta la sección "Fusionar una solicitud de cambios automáticamente".

En vez de esto, puedes trabajar con las GitHub Actions y el CLI de GitHub. Aquí tienes un ejemplo que fusiona todas las actualizaciones de parches automáticamente a my-dependency:

name: Dependabot auto-merge
on: pull_request

permissions:
  contents: write
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1.1.1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Enable auto-merge for Dependabot PRs
        if: ${{contains(steps.metadata.outputs.dependency-names, 'my-dependency') && steps.metadata.outputs.update-type == 'version-update:semver-patch'}}
        run: gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

Solucionar los problemas de las ejecuciones de flujo de trabajo fallidas

Si tu ejecución de flujo de trabajo falla, verifica lo siguiente:

  • Estás ejecutando el flujo de trabajo únicamente cuando el actor adecuado lo activa.
  • Estás verificando la ref de tu pull_request.
  • Tus secretos están disponibles en los secretos del Dependabot, en vez de como secretos de las GitHub Actions.
  • Si tienes un GITHUB_TOKEN con los permisos correctos.

Para obtener más información sobre cómo escribir y depurar las GitHub Actions, consulta la sección "Aprender sobre las Acciones de GitHub".