Skip to main content

Автоматизация Dependabot с помощью GitHub Actions

Примеры использования GitHub Actions для автоматизации распространенных задач, связанных с Dependabot.

Кто может использовать эту функцию?

Пользователи с доступом на запись

Сведения о Dependabot и GitHub Actions

Dependabot создает запросы на вытягивание для поддержания актуальности зависимостей, и вы можете использовать GitHub Actions для выполнения автоматических задач при создании этих запросов на вытягивание. Например, получение дополнительных артефактов, добавление меток, выполнение тестов или изменение запроса на вытягивание.

Note

В этой статье объясняется, как автоматизировать задачи Dependabot, связанные с %}, с помощью GitHub Actions. Дополнительные сведения о выполнении Dependabot updates на GitHub Actions, см. в разделе "Сведения о зависимостях на GitHub Actions runners".

Реагирование на события

Dependabot может активировать рабочие процессы GitHub Actions в запросах на вытягивание и комментариях; однако некоторые события обрабатываются иначе.

Для рабочих процессов, инициированных Dependabot (github.actor == 'dependabot[bot]') с помощью pull_request, pull_request_review, , pull_request_review_comment``push, create``deploymentи deployment_status событий, применяются следующие ограничения:

  • GITHUB_TOKEN имеет разрешения только для чтения по умолчанию.
  • Секреты заполняются секретами из секретов Dependabot. Секреты GitHub Actions недоступны.

Для рабочих процессов, инициированных Dependabot (github.actor == 'dependabot[bot]') с помощью pull_request_target события, если базовый ссылок запроса на вытягивание был создан Dependabot (),github.event.pull_request.user.login == 'dependabot[bot]' доступ к ним будет доступен только для чтения, GITHUB_TOKEN а секреты недоступны.

Эти ограничения применяются, даже если рабочий процесс повторно выполняется другим субъектом.

Дополнительные сведения см. в статье "Обеспечение безопасности действий и рабочих процессов GitHub: предотвращение запросов pwn".

Изменение разрешений GITHUB_TOKEN

По умолчанию рабочие процессы GitHub Actions, активированныеDependabot, получают GITHUB_TOKEN с разрешениями только на чтение. В рабочем процессе можно использовать ключ permissions для увеличения доступа к маркеру:

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

Дополнительные сведения см. в разделе Автоматическая проверка подлинности токенов.

Доступ к секретам

Когда событие Dependabot активирует рабочий процесс, единственными секретами, доступными для рабочего процесса, являются секреты Dependabot. Секреты GitHub Actions недоступны. Следовательно, необходимо хранить все секреты, используемые рабочим процессом, инициированным событиями Dependabot, в виде секретов Dependabot. Дополнительные сведения см. в разделе Настройка доступа к частным реестрам для Dependabot.

Секреты Dependabot добавляются в контекст secrets, и ссылки на них имеют точно такой же синтаксис, что и секреты для GitHub Actions. Дополнительные сведения см. в разделе Использование секретов в GitHub Actions.

Если у вас есть рабочий процесс, который будет активироваться Dependabot, а также другими субъектами, проще всего сохранить маркер с необходимыми разрешениями в действии и в секрете Dependabot с идентичными именами. Затем рабочий процесс может включать один вызов этих секретов. Если у секрета для Dependabot другое имя, используйте условия, чтобы указать правильные секреты для различных субъектов. Примеры использования условий см. в разделе Распространенные автоматизации ниже.

Чтобы получить доступ к частному реестру контейнеров в AWS с именем пользователя и паролем, рабочий процесс должен содержать секрет для username и password. В приведенном ниже примере, когда Dependabot активирует рабочий процесс, используются секреты Dependabot с именами READONLY_AWS_ACCESS_KEY_ID и READONLY_AWS_ACCESS_KEY. Если другой субъект активирует рабочий процесс, используются секреты действий с этими именами.

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)

Повторный запуск рабочего процесса вручную

При повторном запуске рабочего процесса Dependabot вручную он будет выполняться с теми же привилегиями, что и раньше, даже если пользователь, инициировавший повторный запуск, обладает другими привилегиями. Дополнительные сведения см. в разделе Повторный запуск рабочих процессов и заданий.

Распространенные автоматизации Dependabot

Ниже приведены несколько распространенных сценариев, которые можно автоматизировать с помощью GitHub Actions.

Получение метаданных о запросе на вытягивание

Для большого объема автоматизации требуется знать о содержимом запроса на вытягивание: имя зависимости, если это зависимость в производственной среде, и является ли это обновлением основной или дополнительной версии или исправлением.

Действие dependabot/fetch-metadata предоставляет все эти сведения:

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

Дополнительные сведения см. в репозитории dependabot/fetch-metadata.

Пометка запроса на вытягивание

Если у вас есть другие рабочие процессы автоматизации или рассмотрения на основе меток GitHub, можно настроить действие для назначения меток на основе предоставленных метаданных.

Например, если вы хотите пометить все обновления зависимости в рабочей среде:

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

Одобрение запроса на вытягивание

Если вы хотите автоматически утверждать запросы на вытягивание Dependabot, можно использовать GitHub CLI в рабочем процессе:

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

Включение автоматического слияния для запроса на вытягивание

Если вы хотите разрешить специалистам по поддержке помечать определенные запросы на вытягивание для автоматического слияния, можно использовать функцию автоматического слияния GitHub. Это позволяет объединить запрос на вытягивание при успешном выполнении любых тестов и утверждений, необходимых правилам защиты ветви. Дополнительные сведения см. в разделе "[AUTOTITLE" и "Автоматическое слияние запроса на вытягивание](/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule)".

В качестве альтернативы правилам защиты ветви можно создавать наборы правил. Дополнительные сведения см. в разделе "Сведения о наборе правил".

Note

Если вы используете проверки состояния для тестирования запросов на вытягивание, перед слиянием** целевой ветви для Dependabot запросы на вытягивание необходимо включить **проверки состояния. Это правило защиты ветви гарантирует, что запросы на вытягивание не объединяются, если только обязательная проверка состояния не передаются. Дополнительные сведения см. в разделе Управление правилом защиты ветвей.

Вместо этого можно использовать GitHub Actions и GitHub CLI. Ниже приведен пример автоматического слияния всех исправлений с 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}}

Устранение неполадок неудачных запусков рабочих процессов

Если выполнение рабочего процесса завершается сбоем, проверьте следующее:

  • Вы выполняете рабочий процесс только в том случае, если он активируется правильным субъектом.
  • Вы извлекаете корректную ref для pull_request.
  • Секреты доступны в секретах Dependabot, а не GitHub Actions.
  • У вас есть GITHUB_TOKEN с надлежащими разрешениями.

Сведения о написании и отладке GitHub Actionsсм. в разделе "Написание рабочих процессов".