Гейт видит скрипты и Dockerfile, а pre-commit — затронутые файлы

- шаги shell (shellcheck) и dockerfile (hadolint) заведены; два правила hadolint
  подавлены поимённо с причиной — DL3007 до задачи pin-runtime-image-base и
  DL3018 по существу
- lefthook гоняет на затронутых файлах gofmt, golangci-lint по их каталогам,
  shellcheck, hadolint и gitleaks — около секунды; полный набор в pre-commit не
  переносится намеренно
- заведён мутационный тест скрипта сверки версий: 20 сценариев спеки toolchain
  плюс требование сообщения называть все четыре места, независимость исхода от
  установленного go и запрет звать go, docker и сеть
This commit is contained in:
av
2026-08-13 09:02:05 +03:00
parent 0353517ec4
commit e1dfe662ea
3 changed files with 421 additions and 1 deletions
+31 -1
View File
@@ -1,11 +1,41 @@
# Refer for explanation to following link:
# https://lefthook.dev/configuration/
#
# Предкоммитные проверки — дешёвая часть гейта на **затронутых файлах**. Полный
# набор здесь не гоняется намеренно: он идёт минуты, а pre-commit обязан быть
# быстрым. Что ловит pre-commit и что остаётся только гейту — CLAUDE.md,
# раздел «Гейт»; перечень правил и их дома — docs/autotests.md.
templates:
av-hooks-dir: "/home/av/projects/private/git-hooks"
pre-commit:
jobs:
# Форматирование правится на месте и добавляется в коммит: спорить тут не о
# чем, а гейт на неотформатированном файле краснеет.
- name: "gofmt"
glob: "*.go"
run: "gofmt -w {staged_files}"
stage_fixed: true
# Линтеры гоняются по пакетам затронутых файлов, а не по всему дереву:
# golangci-lint принимает файлы только из одного каталога, поэтому на вход
# идут каталоги.
- name: "golangci-lint"
glob: "*.go"
run: |
dirs=$(printf '%s\n' {staged_files} | xargs -r -n1 dirname | sort -u)
golangci-lint run $dirs
- name: "shellcheck"
glob: "*.sh"
run: "shellcheck {staged_files}"
# Подавления те же, что у шага гейта, и по тем же причинам — Taskfile.yml,
# задача `dockerfile`.
- name: "hadolint"
glob: "Dockerfile"
run: "hadolint --ignore DL3007 --ignore DL3018 {staged_files}"
- name: "gitleaks"
run: "gitleaks git --staged"