Skip to main content

Automatisation de Dependabot avec GitHub Actions

Exemples d’utilisation de GitHub Actions pour automatiser les tâches courantes liées à Dependabot.

Qui peut utiliser cette fonctionnalité ?

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

À propos de Dependabot et de GitHub Actions

Dependabot crée des demandes de tirage (pull request) pour maintenir vos dépendances à jour et vous pouvez utiliser GitHub Actions pour effectuer des tâches automatisées quand ces demandes de tirage sont créées. Par exemple, extraire des artefacts supplémentaires, ajouter des étiquettes, exécuter des tests ou modifier la demande de tirage.

Note

Cet article explique comment automatiser les tâches liées à Dependabot en utilisant GitHub Actions. Pour plus d’informations sur l’utilisation de Dependabot updates sur GitHub Actions, consultez « À propos de Dependabot sur les exécuteurs GitHub Actions ».

Réponse aux événements

Dependabot est en mesure de déclencher des workflows GitHub Actions sur ses demandes de tirage requêtes et commentaires ; toutefois, certains événements sont traités différemment.

Pour les workflows lancés par Dependabot (github.actor == 'dependabot[bot]') en utilisant les événements pull_request, pull_request_review, pull_request_review_comment, push, create, deployment et deployment_status, les restrictions suivantes s’appliquent :

  • GITHUB_TOKEN dispose d’autorisations en lecture seule par défaut.
  • Les secrets sont remplis à partir des secrets Dependabot. Les secrets GitHub Actions ne sont pas disponibles.

Pour les workflows lancés par Dependabot (github.actor == 'dependabot[bot]') en utilisant l’événement pull_request_target, si la référence de base de la demande de tirage a été créée par Dependabot (github.event.pull_request.user.login == 'dependabot[bot]'), le GITHUB_TOKEN est en lecture seule et les secrets ne sont pas disponibles.

Ces restrictions s’appliquent même si le workflow est réexécuté par un autre acteur.

Pour plus d’informations, consultez « Maintien de la sécurité de votre instance GitHub Actions et vos flux de travail : Prévention des demandes pwn ».

Changement des autorisations GITHUB_TOKEN

Par défaut, les workflows GitHub Actions déclenchés par Dependabot obtiennent un GITHUB_TOKEN avec des autorisations de lecture seule. Vous pouvez utiliser la clé permissions dans votre workflow afin d’augmenter l’accès pour le jeton :

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:
  ...

Pour plus d’informations, consultez « Authentification par jeton automatique ».

Accès aux secrets

Quand un événement Dependabot déclenche un workflow, les seuls secrets disponibles pour le workflow sont les secrets Dependabot. Les secrets GitHub Actions ne sont pas disponibles. Ainsi, vous devez stocker tous les secrets utilisés par un workflow déclenché par des événements Dependabot en tant que secrets Dependabot. Pour plus d’informations, consultez « Configuration de l’accès aux registres privés pour Dependabot ».

Les secrets Dependabot sont ajoutés au contexte secrets et référencés avec exactement la même syntaxe que les secrets pour GitHub Actions. Pour plus d’informations, consultez « Utilisation de secrets dans GitHub Actions ».

Si vous disposez d’un workflow destiné à être déclenché par Dependabot et par d’autres acteurs, la solution la plus simple consiste à stocker le jeton avec les autorisations requises dans une action et dans un secret Dependabot portant des noms identiques. Ensuite, le workflow peut inclure un seul appel à ces secrets. Si le secret pour Dependabot a un nom différent, utilisez des conditions pour spécifier les secrets corrects que doivent utiliser les différents acteurs. Pour obtenir des exemples qui utilisent des conditions, consultez « Automatisations courantes » ci-après.

Pour accéder à un registre de conteneurs privé sur AWS avec un nom d’utilisateur et un mot de passe, un workflow doit inclure un secret pour username et password. Dans l’exemple ci-dessous, quand Dependabot déclenche le workflow, les secrets Dependabot portant les noms READONLY_AWS_ACCESS_KEY_ID et READONLY_AWS_ACCESS_KEY sont utilisés. Si un autre acteur déclenche le workflow, les secrets d’actions portant ces noms sont utilisés.

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

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

      - name: Login to private container registry for dependencies
        uses: docker/login-action@3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c
        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)

Réexécution manuelle d’un workflow

Lorsque vous réexécutez manuellement un workflow Dependabot, celui-ci s’exécute avec les mêmes privilèges qu’avant même si l’utilisateur qui a lancé la réexécution a des privilèges différents. Pour plus d’informations, consultez « Ré-exécution de workflows et de travaux ».

Automatisations Dependabot courantes

Voici plusieurs scénarios courants qui peuvent être automatisés avec GitHub Actions.

Extraire des métadonnées sur une demande de tirage

Pour une automatisation de grande envergure, il est nécessaire de connaître certaines informations sur le contenu de la demande de tirage : le nom de la dépendance, s’il s’agit ou non d’une dépendance de production et s’il s’agit d’une mise à jour principale, mineure ou corrective.

L’action dependabot/fetch-metadata fournit toutes ces informations pour vous :

name: Dependabot fetch metadata
on: pull_request

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

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
        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

Pour plus d’informations, consultez le dépôt dependabot/fetch-metadata.

Étiqueter une demande de tirage

Si vous avez d’autres workflows d’automatisation ou de triage basés sur des étiquettes GitHub, vous pouvez configurer une action pour affecter des étiquettes en fonction des métadonnées fournies.

Par exemple, si vous souhaitez marquer toutes les mises à jour de dépendance de production avec une étiquette :

name: Dependabot auto-label
on: pull_request

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

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
        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}}

Approuver une demande de tirage

Si vous souhaitez approuver automatiquement les demandes de tirage Dependabot, vous pouvez utiliser l’GitHub CLI dans un workflow :

name: Dependabot auto-approve
on: pull_request

permissions:
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
        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}}
          GH_TOKEN: ${{secrets.GITHUB_TOKEN}}

Activer la fusion automatique sur une demande de tirage

Si vous souhaitez autoriser les responsables de la maintenance à marquer certaines demandes de tirage pour la fusion automatique, vous pouvez utiliser la fonctionnalité de fusion automatique de GitHub. Cela permet à la demande de tirage d’être fusionnée une fois que les tests et approbations requis par les règles de protection de branche sont réussis. Pour plus d’informations, consultez « Fusion automatique d'une demande de tirage » et « Gestion d’une règle de protection de branche ».

Comme solution pour remplacer les règles de protection de branche, vous pouvez créer des ensembles de règles. Pour plus d’informations, consultez « À propos des ensembles de règles ».

Remarque : Si vous utilisez des vérifications d’état pour tester les demandes de tirage, vous devez activer Exiger la réussite des vérifications d’état avant de fusionner pour la branche cible des demandes de tirage Dependabot. Cette règle de protection de branche garantit que les demandes de tirage ne sont pas fusionnées tant que toutes les vérifications d’état requises ne sont pas réussies. Pour plus d’informations, consultez « Gestion d’une règle de protection de branche ».

Vous pouvez plutôt utiliser GitHub Actions et l’GitHub CLI. Voici un exemple qui fusionne automatiquement toutes les mises à jour correctives dans my-dependency :

name: Dependabot auto-merge
on: pull_request

permissions:
  contents: write
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
        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}}
          GH_TOKEN: ${{secrets.GITHUB_TOKEN}}

Résolution des problèmes liés aux exécutions de workflow ayant échoué

Si votre exécution de workflow échoue, vérifiez les éléments suivants :

  • Vous exécutez le workflow uniquement quand l’acteur approprié le déclenche.
  • Vous extrayez la ref correcte pour votre pull_request.
  • Vos secrets sont disponibles dans des secrets Dependabot plutôt qu’en tant que secrets GitHub Actions.
  • Vous disposez d’un GITHUB_TOKEN avec les autorisations appropriées.

Pour plus d’informations sur l’écriture et le débogage de GitHub Actions, consultez « Écriture de workflows ».