BorisovAI
Все публикации
Исправлениеai-agents-genkitGit коммит

Как мы научили CI передавать право подписи релизам

Как мы научили CI передавать право подписи релизам

Работаю в Genkit — это Python-библиотека для генеративного ИИ. Недавно столкнулись с задачей, которая на первый взгляд казалась простой: автоматизировать выпуск версий. Но под капотом скрывалась целая история про доверие, аутентификацию и то, как машина доказывает GitHub, что она имеет право что-то коммитить.

Проблема: три способа подписать себя

При каждом автоматическом релизе нужно создать коммит с тегами, но GitHub не доверяет просто так. Проверяет CLA (Contributor License Agreement) — то есть нужен реальный аккаунт, подписавший соглашение. Мы выбрали три дорожки:

GitHub App (премиум) — приложение Genkit, созданное в самом GitHub. Оно вызывает API, API возвращает специальный ID юзера, и коммиты становятся от лица бота-приложения. CLA проходит, CI запускается.

Personal Access Token (PAT) — обычный токен для конкретного аккаунта разработчика. Уже знаком каждому, кто работал с GitHub CLI. Так же проходит CLA и запускает CI.

GITHUB_TOKEN (есть по умолчанию) — встроенный токен, даёт доступ каждому Action. Главный трюк: даже с ним можно подделать идентичность, если в переменных репо хранить имя и email человека, который подписал CLA.

Как это устроено

Все восемь рабочих потоков в Genkit теперь получили auth job на первом этапе. Он проверяет, что настроено (App? PAT? или только GITHUB_TOKEN?), и резолвит идентичность:

  • App: ищет юзер-ID через gh api, делает коммит от genkit-bot
  • PAT: берёт RELEASEKIT_GIT_USER_NAME и RELEASEKIT_GIT_USER_EMAIL из переменных репо
  • GITHUB_TOKEN: то же самое, плюс fallback на github-actions[bot]

Главное: если ты находишься в ситуации, когда App и PAT недоступны, но у тебя есть CLA-подписанный аккаунт — просто добавь две переменные в настройки репо, и даже встроенный токен пройдёт проверку CLA.

Бонус: bootstrap_tags.py

Отдельно создали скрипт, который читает конфиг releasekit.toml, находит все пакеты в library_dirs, и создаёт теги для каждого пакета отдельно. Не hardcode’ит пути типа ['packages', 'plugins'], а читает их из конфига. В итоге — 24 тега за раз, и все они указывают на правильный коммит.

На практике

Теперь разработчик может зайти на страницу переменных GitHub репо, добавить два поля (имя и почту) — и релизы будут проходить CLA, даже без App или PAT. Это снижает барьер входа для новых контрибьюторов.

Мой код работает, и я знаю почему. Мой код не работает, и я уже добавил логирование. 😄

Метаданные

Branch:
main
Dev Joke
Мой код работает, и я не знаю почему. Мой код не работает, и я не знаю почему.

Оцените материал

0/1000