Skip to content

ci: гонять гейт на pull request, а не только после мержа - #6

Merged
fUS1ONd merged 2 commits into
devfrom
feat/ci-pr-gate
Jul 29, 2026
Merged

ci: гонять гейт на pull request, а не только после мержа#6
fUS1ONd merged 2 commits into
devfrom
feat/ci-pr-gate

Conversation

@fUS1ONd

@fUS1ONd fUS1ONd commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Проблема

Тесты в CI были, но запускались только после мержа. Триггер у docker-publish.ymlpush в dev и теги, поэтому на самих pull request'ах проверок не было вообще:

$ gh pr checks 5
no checks reported on the 'dev' branch

PR #2, #3, #4 были смержены без единой проверки — make gate прогонялся уже по факту, на смердженном dev. Сломанный PR выглядел бы зелёным до последнего момента, а падение обнаружилось бы когда образ уже собирается и едет в GHCR.

Решение

Гейт вынесен в переиспользуемый workflow и вызывается из двух мест:

Файл Событие Что делает
gate.yml workflow_call Определение гейта: make gate + проверка детерминизма артефактов
ci.yml (новый) pull_request вызывает gate.yml
docker-publish.yml push в dev / теги вызывает gate.yml, затем публикует образ

Почему переиспользуемый workflow, а не копия в двух файлах. Копии со временем расходятся, и расхождение здесь даёт худший из возможных исходов: PR зелёный, а dev красный. Одно определение гарантирует, что проверки PR — ровно то, что гейтит публикацию образа.

Дублирования прогонов нет: ci.yml висит только на pull_request, push в dev по-прежнему обслуживается docker-publish.yml.

Заодно

  • Отмена устаревших прогонов (concurrency + cancel-in-progress): новый пуш в ветку PR отменяет предыдущий, иначе очередь копит проверки неактуальных коммитов.
  • Кэш Tailwind CLI: make gate качает 120 МБ standalone-бинарник на каждом прогоне, а цель tailwind-bin пропускает скачивание при наличии файла. Ключ кэша берёт версию из TAILWIND_VERSION в Makefile, чтобы инвалидировался ровно при обновлении версии, а не при любой правке Makefile.

Вне объёма

Интеграционные тесты (-tags=integration, требуют Postgres и MinIO) — они не запускались нигде и раньше, ни в CI, ни в make gate. Схема БД, миграции, internal/db и internal/s3 под тестами есть, но эти тесты мёртвые. Это осознанно отдельная задача.

Проверено

  • actionlint на всех трёх workflow — без замечаний
  • make gate на этой ветке — зелёный
  • Проверка, что job с uses: не содержит несовместимых ключей (runs-on/steps)
  • Живая проверка — этот самый PR: он должен стать первым в истории репозитория, на котором появились проверки

fUS1ONd added 2 commits July 29, 2026 23:12
Тесты запускались только по push в dev, то есть уже после мержа PR: на
самом pull request не было ни одной проверки (gh pr checks — «no checks
reported»), и падение обнаруживалось на dev, когда образ уже собирался.

Гейт вынесен в переиспользуемый workflow_call и вызывается из двух мест:
нового ci.yml на pull_request и существующего docker-publish.yml перед
публикацией образа. Одно определение вместо двух копий — копии со временем
разошлись бы, и получилось бы худшее: PR зелёный, dev красный.

Добавлены отмена устаревших прогонов при новом пуше в ветку PR и кэш
Tailwind CLI (make gate качает 120 МБ бинарник, цель tailwind-bin
пропускает скачивание при наличии файла).

Интеграционные тесты (-tags=integration, нужны Postgres и MinIO) в объём
не входят — они и раньше не запускались нигде, это отдельная задача.
checkout v4→v7, setup-go v5→v7, cache v4→v6. Прогон выдавал
предупреждение, что эти экшены нацелены на Node.js 20 и принудительно
запускаются на Node.js 24.

Экшены docker/* и action-gh-release в publish-джобе намеренно не тронуты:
путь публикации образа на pull request не выполняется, проверить его этим
PR невозможно, а молча сломать выкат хуже предупреждения.
@fUS1ONd
fUS1ONd merged commit f1b1032 into dev Jul 29, 2026
1 check passed
@fUS1ONd
fUS1ONd deleted the feat/ci-pr-gate branch July 29, 2026 23:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant