CI: сверять версию в pyproject.toml с наличием одноимённого тега #28

Closed
opened 2026-08-27 13:37:19 +07:00 by claude-secretary · 1 comment

Второй пункт #16. Теги v0.10.0v0.18.0 проставлены задним числом, но причина рассинхрона осталась: версия живёт в pyproject.toml, тег ставится руками, и разойтись они могут молча. Именно так и накопилось девять невыпущенных версий — консьюмер по пину из README не вставал вовсе.

Что проверять

Шаг в .forgejo/workflows/ci.yml рядом со smoke: прочитать version из pyproject.toml и сверить с тегами.

Тонкость в том, что на ветке версия обязана опережать теги — её бампают в PR до релиза. Поэтому проверка осмысленна в двух местах и по-разному:

  • на main — версия из pyproject.toml должна иметь одноимённый тег; нет тега — красный CI с текстом «выпустите vX.Y.Z»;
  • на ветке — версия должна быть строго больше последнего тега и не совпадать ни с одним существующим (иначе два PR молча заняли один номер — за сегодня это едва не случилось трижды).

Второй вариант заодно снимает ручную сверку очереди версий при параллельных PR.

Приёмка

  • Шаг в CI, отдельный от smoke, с внятным сообщением об обеих ошибках
  • На main отсутствие тега для текущей версии — красный CI
  • На ветке версия, равная существующему тегу или меньшая последнего, — красный CI
  • Проверка не требует полного клона (fetch-depth в workflow уже задан для тегов или дотягивает их явно)
Второй пункт [#16](https://git.homedevlab.ru/senokosov/pre-commit-hooks/issues/16). Теги `v0.10.0`–`v0.18.0` проставлены задним числом, но причина рассинхрона осталась: версия живёт в `pyproject.toml`, тег ставится руками, и разойтись они могут молча. Именно так и накопилось девять невыпущенных версий — консьюмер по пину из README не вставал вовсе. ## Что проверять Шаг в `.forgejo/workflows/ci.yml` рядом со smoke: прочитать `version` из `pyproject.toml` и сверить с тегами. Тонкость в том, что на ветке версия **обязана** опережать теги — её бампают в PR до релиза. Поэтому проверка осмысленна в двух местах и по-разному: - **на `main`** — версия из `pyproject.toml` должна иметь одноимённый тег; нет тега — красный CI с текстом «выпустите `vX.Y.Z`»; - **на ветке** — версия должна быть **строго больше** последнего тега и не совпадать ни с одним существующим (иначе два PR молча заняли один номер — за сегодня это едва не случилось трижды). Второй вариант заодно снимает ручную сверку очереди версий при параллельных PR. ## Приёмка - [ ] Шаг в CI, отдельный от smoke, с внятным сообщением об обеих ошибках - [ ] На `main` отсутствие тега для текущей версии — красный CI - [ ] На ветке версия, равная существующему тегу или меньшая последнего, — красный CI - [ ] Проверка не требует полного клона (`fetch-depth` в workflow уже задан для тегов или дотягивает их явно)
Author
Owner

Закрываю: сделано в #29, выпущено тегом v0.22.0.

Гейт fixtures/check_version_tag.sh отдельным шагом CI, три ветки проверки:

Прогон Требование
пуш тега vX.Y.Z версия совпадает с тегом — это и есть релиз
main тег для текущей версии существует и стоит на коммите с той же версией
ветка версия новая и больше последней выпущенной

Третья ветка — то, ради чего задача заводилась во второй части: ручную сверку очереди версий при параллельных PR теперь делает CI. За сегодня было три PR подряд, претендовавших на соседние номера, и очередь приходилось держать в голове.

Первая ветка появилась по ревью и оказалась важнее, чем выглядела: on: push срабатывает и на пуш тега, ref_name там — имя тега, поэтому без неё гейт диагностировал бы корректный выпуск как «номер занят» и красил ровно тот коммит, на который консьюмер ставит rev:. Проверка «тег стоит на коммите с той же версией» тоже пришла из ревью — без неё исходная проблема закрывалась наполовину: тег на постороннем коммите резолвится у консьюмера в чужой код.

fetch-depth: 0 в checkout — при shallow-клоне тегов нет, и гейт падает с объяснением вместо зелёного вхолостую.

Самопроверка — 12 кейсов на временных репозиториях (на живом репо вердикт меняется от коммита к коммиту). Фикстуры изолированы от наследованного git-контекста: под git-хуком они коммитили бы в посторонний репозиторий и печатали «пройден» вхолостую.

Порядок выпуска и следствия записаны в README: прогон main между мержем и тегом остаётся красным (тега тогда ещё не было), любой PR обязан бампать версию, ветки поддержки и пререлизные суффиксы не поддержаны.

Сам этот релиз выпущен по новому порядку: мерж → тег → проверка. bash fixtures/check_version_tag.sh main на текущем main — зелёный.

Закрываю: сделано в [#29](https://git.homedevlab.ru/senokosov/pre-commit-hooks/pulls/29), выпущено тегом `v0.22.0`. Гейт `fixtures/check_version_tag.sh` отдельным шагом CI, три ветки проверки: | Прогон | Требование | |---|---| | пуш тега `vX.Y.Z` | версия совпадает с тегом — это и есть релиз | | `main` | тег для текущей версии существует **и** стоит на коммите с той же версией | | ветка | версия новая и больше последней выпущенной | Третья ветка — то, ради чего задача заводилась во второй части: ручную сверку очереди версий при параллельных PR теперь делает CI. За сегодня было три PR подряд, претендовавших на соседние номера, и очередь приходилось держать в голове. Первая ветка появилась по ревью и оказалась важнее, чем выглядела: `on: push` срабатывает и на пуш тега, `ref_name` там — имя тега, поэтому без неё гейт диагностировал бы **корректный выпуск** как «номер занят» и красил ровно тот коммит, на который консьюмер ставит `rev:`. Проверка «тег стоит на коммите с той же версией» тоже пришла из ревью — без неё исходная проблема закрывалась наполовину: тег на постороннем коммите резолвится у консьюмера в чужой код. `fetch-depth: 0` в checkout — при shallow-клоне тегов нет, и гейт падает с объяснением вместо зелёного вхолостую. Самопроверка — 12 кейсов на временных репозиториях (на живом репо вердикт меняется от коммита к коммиту). Фикстуры изолированы от наследованного git-контекста: под git-хуком они коммитили бы в посторонний репозиторий и печатали «пройден» вхолостую. Порядок выпуска и следствия записаны в README: прогон `main` между мержем и тегом остаётся красным (тега тогда ещё не было), любой PR обязан бампать версию, ветки поддержки и пререлизные суффиксы не поддержаны. Сам этот релиз выпущен по новому порядку: мерж → тег → проверка. `bash fixtures/check_version_tag.sh main` на текущем `main` — зелёный.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
senokosov/pre-commit-hooks#28
No description provided.