Я завершил автоматизацию процесса обновления зависимостей для моего pet-проекта. Теперь Dependabot проверяет наличие обновлений и создаёт pull-реквесты. После успешного прохождения всех проверок изменения автоматически вливаются в основную ветку.

Зачем все это

Воспроизводимость сборки и пакетов — это фундамент разработки проектов любого масштаба. В ее отсутствии кратно возрастают затраты на построение проекта и пакетов, так как приходиться подбирать рабочие конфигурации и окружение. А также часто возникают ситуации «а у меня все работает».

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

Однако воспроизводимость не даётся бесплатно. Зависимости нужно периодически обновлять — ради безопасности, новых возможностей или совместимости. И именно эти усилия по обновлению и тестированию становятся платой за стабильность и предсказуемость сборки.

Существующие подходы

В целом, подходы к обновлению зависимостей варьируются от полного контроля вручную до полной автоматизации. Рассмотрим кратко два крайних случая: полностью ручной и полностью автоматический.

Ручной подход позволяет проводить более осознанное обновление зависимостей: разработчики изучают изменения, принимают взвешенные решения об интеграции новых версий и заранее минимизируют возможные проблемы. Такой подход особенно ценен в критичных или сложных проектах. Однако осознанность требует времени и усилий, которые растут пропорционально количеству зависимостей. В больших проектах ручное обновление может стать серьёзной нагрузкой.

Автоматический подход, напротив, обеспечивает высокую степень автономности. Обновления происходят регулярно и без участия разработчиков, что экономит их время. Но при этом возрастает нагрузка на CI-инфраструктуру: требуется дополнительное машинное время для проверки интеграции каждой новой версии, а также надёжное тестовое покрытие для выявления регрессий. Кроме того, автоматическое обновление может создавать «шум» в истории коммитов — большое количество мелких изменений, не всегда значимых с точки зрения логики проекта.

Выбор подхода

То, где именно окажется подход к обновлению зависимостей в проекте между двумя крайностями — зависит от специфики проекта, предъявляемых к нему требований и доступных ресурсов.

В моем случае — это open source pet-проект, размещённый на GitHub и развиваемый исключительно в свободное время. Поэтому мне важно минимизировать ручной труд, связанный с поддержкой зависимостей, даже если это приведёт к некоторому «шуму» в истории коммитов. К тому же GitHub предоставляет бесплатные ресурсы для GitHub Actions (GA) для open source проектов, что делает привлекательной автоматизацию для проекта с использованием GA. В результате я решил максимально автоматизировать процесс обновления зависимостей, используя предоставляемые GitHub инструменты: Dependabot и GA.

Настройка Dependabot

Настройка Dependabot для маленького проекта ничем особо не отличается от примеров из документации: Configuring Dependabot version updates. И в моем конкретном случае выглядит как:

version: 2
updates:
  - package-ecosystem: "github-actions"
    directories: [".github/workflows", ".github/actions/**"]
    schedule:
      interval: "daily"
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "daily"

Здесь обязательное поле version, которое может принимать только значение 2. И секция updates, в ней описываются настройки для каждого отдельного пакетного менеджера:

  • package-ecosystem – определяет какая экосистема зависимостей отслеживается;

  • directories – список каталогов, в которых будут искаться файлы определяющие зависимости;

  • schedule – расписание проверок новых версий

После того как файл конфигурации (.github/dependabot.yml) будет добавлен в основную ветку, Dependabot начнет проверку зависимостей согласно заданному расписанию. И как только появится новая версия для зависимости, он создаст pull-реквест на ее обновление.

Настройка GitHub Actions

В целом, реализация CI-пайплайна ограничена лишь фантазией и доступными ресурсами. Главное, чтобы он запускался при создании pull-реквестов. А тестовое покрытие позволяло выявлять регрессии при обновлении зависимостей.

Для автоматического аппрува и мерджа можно использовать пример из официальной документации: Automating Dependabot with GitHub Actions.

Единственный нюанс, который здесь стоит отметить, что если есть workflow настроенный на push в основную ветку, то автоматический мердж изменений, сделанный с использованием GITHUB_TOKEN согласно примеру из документации выше, не запустит такой workflow. Это ограничение описано в разделе Triggering a workflow и введено для предотвращения рекурсивных вызовов. Чтобы обойти это ограничение, можно вручную запустить нужный workflow сразу после мерджа изменений. Например, код ниже производит слияние изменений с основной веткой, а после запускает workflow на push в основную ветку:

- name: Merge a PR
  run: |
    gh pr merge "${{github.event.pull_request.html_url}}" \
                --delete-branch --squash
    gh workflow run ci-main-push.yml \
                --ref "${{github.event.pull_request.base.ref}}" \
                --repo "${{github.event.pull_request.base.repo.html_url}}"
  env:
    GH_TOKEN: ${{secrets.GITHUB_TOKEN}}

Итог

С помощью связки Dependabot + GitHub Actions удалось полностью автоматизировать процесс обновления зависимостей в проекте, практически исключив ручной труд. При этом сохранив контроль над качеством благодаря CI-пайплайну и тестовому покрытию.

Полные конфигурации Dependabot и GitHub Actions доступны в репозитории проекта на GitHub.

Альтернативы

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

В таких случаях стоит рассмотреть Renovate как более гибкую альтернативу. Этот инструмент предлагает расширенные возможности кастомизации, позволяя адаптировать процесс обновления зависимостей под специфические требования проекта. И он получил статус Adopt в Technology Radar Vol. 32 (April 2025), что означает рекомендацию к активному использованию.

Комментарии (1)


  1. Spyman
    10.08.2025 23:17

    Страшно, очень страшно. Даже в ручную то страшно обновлять зависимости больше чем по одной, а тут автоматика наобновляла в случайном порядке их несколько раз подряд - потом ищи - какой конкретно апдейт все сломал.

    Но при 100% покрытии тестами инструмент интересный