/
nv-lang
/
nova
Обзор
Документация
Войти
/
nv-lang
/
nova
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
main
scripts/githooks/pre-push
58 строк
3 KB
Evgeniy Golovin
guard(№395): автоматическое слежение за внешним гейтом — check-ci-status (RED/STALE/OK/SKIP, 8 проверок самотеста) шагом в gate.sh + хук pre-push останавливает отправку в main при красном или МОЛЧАЩЕМ CI
07 авг 2026, 00:27
07 авг 2026, 00:27
9038e2f
Код
Авторство
О чём код?
#!/usr/bin/env bash # pre-push — автоматическое слежение за внешним авторитетным гейтом. # # Правило владельца 2026-08-07: «проверка и слежение должны запускаться # автоматически, а не потому что кто-то помнит, что это нужно сделать». # # Что делает: ПЕРЕД отправкой в main спрашивает GitHub про состояние прогонов # на текущем удалённом main. Красный внешний гейт или молчащий (пуш прошёл, а # прогонов нет — случай `7ed38407d` 2026-08-06) останавливают отправку. # # Почему именно здесь, а не «в ритуале интегратора»: ритуал держится на памяти # и за 24 слияния подряд не сработал ни разу (реестр №395). Хук срабатывает # сам, независимо от того, помнит ли кто-нибудь о правиле. # # Обход — осознанный и явный: NOVA_SKIP_CI_CHECK=1 git push ... # (нужен, когда внешний гейт красный по чужой причине и это уже разобрано). # Отсутствие `gh`/сети хук НЕ роняет — check-ci-status.sh отвечает SKIP. export LC_ALL=C REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" || exit 0 if [ "${NOVA_SKIP_CI_CHECK:-0}" = "1" ]; then echo "pre-push: проверка внешнего гейта пропущена (NOVA_SKIP_CI_CHECK=1)" exit 0 fi # Пушим ли мы main? Хук получает строки '<local ref> <local sha> <remote ref> <remote sha>'. PUSHING_MAIN=0 while read -r _lref _lsha rref _rsha; do case "$rref" in refs/heads/main) PUSHING_MAIN=1 ;; esac done [ "$PUSHING_MAIN" -eq 1 ] || exit 0 GUARD="$REPO_ROOT/scripts/guards/check-ci-status.sh" [ -x "$GUARD" ] || [ -f "$GUARD" ] || exit 0 echo "pre-push: проверяю внешний авторитетный гейт (GitHub Actions)…" if bash "$GUARD" --strict; then exit 0 fi cat >&2 <<'EOF' pre-push ОСТАНОВИЛ отправку: внешний авторитетный гейт не в порядке. Красный (или молчащий) CI означает, что локальное «зелено» — более слабое утверждение, чем звучит: gate.sh гоняет `nova check std`, CI — `nova test std`, и второе видит то, чего первое не видит по построению (реестр №402). Что делать: * разобрать причину (gh run list --limit 10; gh run view <id> --log-failed); * если красное разобрано и относится не к этой отправке — NOVA_SKIP_CI_CHECK=1 git push … и обязательно записать причину в реестр 221.1. EOF exit 1