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.

Quem pode usar esse recurso?

Usuários com com acesso para gravação

Note

O administrador do site precisa configurar as Dependabot updates do sua instância do GitHub Enterprise Server para que você possa usar esse recurso. Para obter mais informações, confira "Habilitando o Dependabot para sua empresa".

Talvez você não consiga habilitar ou desabilitar Dependabot updates se um proprietário da empresa tiver definido uma política no nível da empresa. Para obter mais informações, confira "Como impor políticas para segurança e análise de código na empresa".

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.

Para fluxos de trabalho iniciados pelo Dependabot (github.actor == 'dependabot[bot]') usando os eventos pull_request, pull_request_review, pull_request_review_comment, push, create, deployment e deployment_status, as seguintes restrições se aplicam:

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

Para fluxos de trabalho iniciados pelo Dependabot (github.actor == 'dependabot[bot]') usando o evento pull_request_target, se a referência de base da solicitação de pull tiver sido criada pelo Dependabot (github.event.pull_request.user.login == 'dependabot[bot]'), o GITHUB_TOKEN será somente leitura e os segredos não ficarão disponíveis.

Essas restrições se aplicam mesmo se o fluxo de trabalho for executado novamente por um ator diferente.

Para obter mais informações, confira Como manter suas GitHub Actions e seus fluxos de trabalho seguros: prevenção contra solicitações pwn.

Como alterar as permissões GITHUB_TOKEN

Por padrão, os fluxos de trabalho do GitHub Actions disparados pelo Dependabot obtêm um GITHUB_TOKEN com permissões somente leitura. Use a chave permissions no fluxo de trabalho para aumentar o acesso ao 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 saber mais, confira Autenticação automática de 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 saber mais, confira Configurando o acesso a registros privados para Dependabot.

Os segredos do Dependabot são adicionados ao contexto secrets e referenciados usando exatamente a mesma sintaxe dos segredos do GitHub Actions. Para saber mais, confira Usar segredos em ações do GitHub.

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 ver exemplos que usam condições, confira Automações comuns abaixo.

Para acessar um registro de contêiner privado na AWS com um nome de usuário e uma senha, um fluxo de trabalho precisa incluir um segredo para username e password. No exemplo abaixo, quando o Dependabot dispara o fluxo de trabalho, os segredos do 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@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)

Reexecutando manualmente um fluxo de trabalho

Quando você executar manualmente um fluxo de trabalho dependabot outra vez, ele será executado com os mesmos privilégios de antes, mesmo que o usuário que iniciou a nova execução tenha privilégios diferentes. Para saber mais, confira Reexecutando 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 essas 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.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

Para obter mais informações, confira 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.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}}

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

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

Habilitar o merge automático em um pull request

Se você deseja permitir que os mantenedores marquem determinadas solicitações de pull para mesclagem automática,você pode usar a funcionalidade de mesclagem automática de GitHub Isto permite que a solicitação de pull seja mesclada quando todos os testes e as aprovações exigidos pelas regras de proteção de branch forem cumpridos com sucesso. Para saber mais, confira Fazer merge automático de um pull request e Gerenciar uma regra de proteção de branch.

Como alternativa às regras de proteção de ramificação, você pode criar conjuntos de regras. Para saber mais, confira Sobre os conjuntos de regras.

Note

Se você usar verificações de status para testar pull requests, precisará habilitar a opção Exigir a aprovação das verificações de status antes de mesclar para o branch de destino para pull requests de Dependabot. Essa regra de proteção de branch garante que as solicitações de pull não sejam mescladas, a menos que todas as verificações de status necessárias sejam aprovadas. Para saber mais, confira Gerenciar uma regra de proteção de branch.

Em vez disso, você pode usar GitHub Actions e GitHub CLI. Veja um exemplo que mescla automaticamente todas as atualizações de 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.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}}

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 check-out da ref correta para o 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 como escrever e depurar GitHub Actions, confira Escrevendo fluxos de trabalho.