Как мы научили 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
- Мой код работает, и я не знаю почему. Мой код не работает, и я не знаю почему.