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

Когда теги создаются, но не доходят: история молчаливого отказа git

Когда теги создаются, но не доходят: история молчаливого отказа git

Представь ситуацию: ты выпускаешь версию v0.6.0 Python пакета в проекте Genkit. Процесс отработал без ошибок, логи зелёные, все 68 тегов якобы созданы и запушены. Релиз опубликован. Но через час выясняется — на GitHub никаких тегов нет. Призрак, а не релиз.

Именно это произошло с releasekit, инструментом для автоматизации выпусков. Три месяца никто не заметил, пока не стали разбираться, почему теги исчезают.

Охота на невидимого врага

Проблема крылась в create_tags() — функции, которая формирует названия тегов по шаблону из releasekit.toml: {label}/{name}-v{version}. Например, py/genkit-v0.6.0.

Вот беда: функция принимала параметр label (значение py), но забывала его передавать в три вложенных вызова format_tag(). Результат — теги создавались с ведущей косой чертой: /genkit-v0.6.0 вместо py/genkit-v0.6.0.

Git видит такое имя и внутренне закатывает глаза — это не валидное имя для ref. Но ошибку не выкидывает. Теги создаются локально с неправильными названиями, команда push выполняется «успешно» (ну, она же отправила битые данные, технически успех), а на удалённый сервер они так и не попадают. Молчком. Без единого предупреждения.

Кстати, интересная деталь: функция delete_tags() этот баг не имела — там label уже передавалась правильно. Так бывает.

От исправления к защите

Первое решение — очевидное. Добавить label=label во все три вызова format_tag(). Но это лишь пластырь.

Вторая часть исправления — валидация перед действием. Новая функция validate_tag_name() проверяет теги против правил git для имён ref: нет ведущих и замыкающих слэшей, нет двойных точек, нет пробелов. И главное — перед тем как создавать хоть один тег, цикл валидации пробегает по всем планируемым именам. Если одно невалидно — весь процесс падает с информативной ошибкой. Fail-fast вместо тихого отказа.

Третья проблема была скромнее, но реальна. При подготовке окружения в GitHub Actions команда git checkout -- . очищает только отслеживаемые файлы. Если uv sync создаёт неотслеживаемые (.venv/, __pycache__/), рабочая директория остаётся грязной. Решение — git reset --hard && git clean -fd. Полная очистка, как надо.

Итог: 54 теста и спокойный сон

Все изменения покрыты регрессионными тестами — 12 новых, итого 54 проходящих. Теги теперь создаются корректно, валидация срабатывает раньше, чем git начнёт молчать. И, знаешь, есть такое правило в Figma: если она работает — не трогай 😄

Метаданные

Branch:
main
Dev Joke
Если Figma работает — не трогай. Если не работает — тоже не трогай, станет хуже.

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

0/1000