Skip to main content

Automatizando o Dependabot com GitHub Actions

Exemplos de como você pode usar GitHub Actions para automatizar tarefas comuns de Dependabot relacionadas.

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

Sobre Dependabot e GitHub Actions

Dependabot cria pull requests para manter suas dependências atualizadas, e você pode usar GitHub Actions para executar tarefas automatizadas quando estes pull requests forem criados. Por exemplo, busque artefatos adicionais, adicione etiquetas, execute testes ou modifique o pull request.

Respondendo aos eventos

Dependabot consegue acionar fluxos de trabalho de GitHub Actions nos seus pull requests e comentários. No entanto, certos eventos são tratados de maneira diferente.

For workflows initiated by Dependabot (github.actor == 'dependabot[bot]') using the pull_request, pull_request_review, pull_request_review_comment, push, create, deployment, and deployment_status events, the following restrictions apply:

  • GITHUB_TOKEN tem permissões somente leitura por padrão.
  • Os segredos são preenchidos a partir dos segredos de Dependabot. Os segredos de GitHub Actions não estão disponíveis.

For workflows initiated by Dependabot (github.actor == 'dependabot[bot]') using the pull_request_target event, if the base ref of the pull request was created by Dependabot (github.actor == 'dependabot[bot]'), the GITHUB_TOKEN will be read-only and secrets are not available.

These restrictions apply even if the workflow is re-run by a different actor.

Para obter mais informações, consulte "Manter seus GitHub Actions e fluxos de trabalho seguro: Evitando solicitações de pwn".

Alterando as permissões de GITHUB_TOKEN

Por padrão, os fluxos de trabalho de GitHub Actions acionados por Dependabot obtêm um GITHUB_TOKEN com permissões de somente leitura. Você pode usar a chave de permissões no seu fluxo de trabalho para aumentar o acesso do 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 obter mais informações, consulte "Modificar as permissões para o GITHUB_TOKEN".

Acessar segredos

Quando um evento de Dependabot aciona um fluxo de trabalho, os únicos segredos disponíveis para o fluxo de trabalho são segredos de Dependabot. Os segredos de GitHub Actions não estão disponíveis. Consequentemente, você deve armazenar todos os segredos que são usados por um fluxo de trabalho acionado por eventos Dependabot como segredos de Dependabot. Para obter mais informações, consulte "Gerenciar segredos criptografados para o Dependabot. ".

Os segredos de Dependabot são adicionados ao contexto segredos e referenciados usando exatamente a mesma sintaxe que os segredos para GitHub Actions. Para obter mais informações, consulte "Segredos criptografados".

Se você tiver um fluxo de trabalho que será acionado por Dependabot e também por outros atores, a solução mais simples é armazenar o token com as permissões necessárias em uma ação e em um segredo Dependabot com nomes idênticos. Em seguida, o fluxo de trabalho pode incluir uma única chamada para esses segredos. Se o segredo de Dependabot tiver um nome diferente, use condições para especificar os segredos corretos para diferentes atores. Para exemplos que usam condições, consulte "automações comuns" abaixo.

Para acessar um registro de contêiner privado no AWS com um nome de usuário e senha, um fluxo de trabalho deverá incluir um segredo para nome de usuário e senha. No exemplo abaixo, quando Dependabot aciona o fluxo de trabalho, os segredos de Dependabot com os nomes READONLY_AWS_ACCESS_KEY_ID e READONLY_AWS_ACCESS_KEY são usados. Se outro ator disparar o fluxo de trabalho, as ações secretas com esses nomes serão usadas.

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

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

      - 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)

Reexecutando manualmente um fluxo de trabalho

When you manually re-run a Dependabot workflow, it will run with the same privileges as before even if the user who initiated the rerun has different privileges. Para obter mais informações, consulte "Executando novamente os fluxos de trabalho e trabalhos".

Automações comuns de dependência

Aqui estão vários cenários comuns que podem ser automatizados usando GitHub Actions.

Obter metadados sobre um pull request

Uma grande quantidade de automação supõe o conhecimento do conteúdo do pull request: qual era o nome da dependência, se for uma dependência de produção, e se for uma atualização maior, menor ou de patch.

A ação dependabot/fetch-metadata fornece todas as informações para você:

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 obter mais informações, consulte o repositório dependabot/fetch-metadata.

Etiquetar um pull request

Se você tiver outras automações ou fluxos de trabalho de triagem com base nas etiquetas de GitHub, poderá configurar uma ação para atribuir etiquetas com base nos metadados fornecidos.

Por exemplo, se você quiser sinalizar todas as atualizações de dependências de produção com uma 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}}

Aprovar um pull request

Se você quiser aprovar automaticamente os pull requests do Dependabot, você poderá usar o GitHub CLI em um fluxo de trabalho:

name: Dependabot auto-approve
on: pull_request_target

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}}

Habilitar o merge automático em um pull request

Se você quiser permitir que os mantenedores marquem certos pull requests para o merge automático, você pode usar a funcionalidade de merge automático de GitHub. Isto permite que o pull request seja mesclado quando todos os testes e aprovações forem cumpridos com sucesso. Para obter mais informações sobre merge automático, consulte "Fazer merge automático de um pull request".

Em vez disso, você pode usar GitHub Actions e GitHub CLI. Aqui está um exemplo que faz o merge automático de todas as atualizações do patch para 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}}

Ocorreu uma falha na solução de problemas de execução do fluxo de trabalho

Se a execução do fluxo de trabalho falhar, verifique o seguinte:

  • Você só está executando o fluxo de trabalho quando o ator correto o acionar.
  • Você está fazendo o checkout do ref correto para o seu pull_request.
  • Os seus segredos estão disponíveis nos secredos de Dependabot, ao invés estar nos segredos de GitHub Actions.
  • Você tem um GITHUB_TOKEN com as permissões corretas.

Para obter informações sobre gravação e depuração de GitHub Actions, consulte "Conhecendo o GitHub Actions".