ревью: govulncheck в task setup и статус WARN в гейте
Инструмент ставится вместе с остальными (версия закреплена), гейт его больше не пропускает. Уязвимость почти всегда унаследована — это состояние зависимостей и тулчейна, а не диффа, — поэтому шаг не краснит гейт, а получает статус WARN: виден в сводке, уезжает в находки и в границы покрытия. Иначе красный гейт на каждом прогоне перестают читать. Уязвимость, приехавшую с новой зависимостью change, агент отличает по трассам вызовов и выводит как major. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,8 +19,8 @@ color: red
|
|||||||
1. Определи базу диффа: `git merge-base HEAD master` (на master — `HEAD~1`) или
|
1. Определи базу диффа: `git merge-base HEAD master` (на master — `HEAD~1`) или
|
||||||
возьми её из задания.
|
возьми её из задания.
|
||||||
2. Запусти `task gate BASE=<база>` (обёртка над `scripts/gate.sh`). Он гонит все
|
2. Запусти `task gate BASE=<база>` (обёртка над `scripts/gate.sh`). Он гонит все
|
||||||
шаги до конца и печатает сводку `OK`/`FAIL`/`SKIP`; подробности — в
|
шаги до конца и печатает сводку `OK`/`FAIL`/`WARN`/`SKIP`; подробности — в
|
||||||
`tmp/gate/<шаг>.log`.
|
`tmp/gate/<шаг>.log`. Краснит гейт только `FAIL`.
|
||||||
3. По каждому `FAIL` открой лог и прочитай **реальную** причину. Не пересказывай
|
3. По каждому `FAIL` открой лог и прочитай **реальную** причину. Не пересказывай
|
||||||
строку «FAIL» — назови упавший тест, файл и утверждение.
|
строку «FAIL» — назови упавший тест, файл и утверждение.
|
||||||
4. **Отдели новое от унаследованного.** Если отказ выглядит не связанным с
|
4. **Отдели новое от унаследованного.** Если отказ выглядит не связанным с
|
||||||
@@ -45,6 +45,13 @@ color: red
|
|||||||
- **`SKIP` любого шага** — идёт в границы покрытия дословно, с причиной. Молча
|
- **`SKIP` любого шага** — идёт в границы покрытия дословно, с причиной. Молча
|
||||||
пропущенная проверка — это ложное ощущение проверенности, ровно то, ради чего
|
пропущенная проверка — это ложное ощущение проверенности, ровно то, ради чего
|
||||||
гейт и заводился.
|
гейт и заводился.
|
||||||
|
- **`WARN` от `govulncheck`** — гейт не краснеет, но находка нужна. Открой
|
||||||
|
`tmp/gate/govulncheck.log` и посмотри трассы вызовов: уязвимость, приехавшая с
|
||||||
|
зависимостью **этого** change, — `major`; уязвимость в стандартной библиотеке
|
||||||
|
или в давно стоящей зависимости — `minor` с пометкой «унаследовано» и с
|
||||||
|
конкретным лекарством (версия тулчейна или модуля, в которой исправлено).
|
||||||
|
Недостижимые из нашего кода уязвимости в отчёт не выноси — только строкой в
|
||||||
|
границах покрытия.
|
||||||
- **Правило есть в конвенциях, но не в линтере.** Если по ходу видно, что
|
- **Правило есть в конвенциях, но не в линтере.** Если по ходу видно, что
|
||||||
`FAIL`/замечание могло быть поймано правилом — пиши `Promote candidate` по
|
`FAIL`/замечание могло быть поймано правилом — пиши `Promote candidate` по
|
||||||
процедуре `references/promote.md`.
|
процедуре `references/promote.md`.
|
||||||
|
|||||||
+4
-2
@@ -8,8 +8,9 @@ version: '3'
|
|||||||
vars:
|
vars:
|
||||||
BINARY: jellybit
|
BINARY: jellybit
|
||||||
PKG: ./cmd/jellybit
|
PKG: ./cmd/jellybit
|
||||||
# Версия линтера для воспроизводимой установки (см. задачу setup).
|
# Версии инструментов для воспроизводимой установки (см. задачу setup).
|
||||||
GOLANGCI_VERSION: v2.12.2
|
GOLANGCI_VERSION: v2.12.2
|
||||||
|
GOVULNCHECK_VERSION: v1.6.0
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
default:
|
default:
|
||||||
@@ -86,7 +87,8 @@ tasks:
|
|||||||
- rm -f {{.BINARY}}
|
- rm -f {{.BINARY}}
|
||||||
|
|
||||||
setup:
|
setup:
|
||||||
desc: Установка инструментов разработки (линтер + git-хуки lefthook)
|
desc: Установка инструментов разработки (линтер, govulncheck + git-хуки lefthook)
|
||||||
cmds:
|
cmds:
|
||||||
- go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{.GOLANGCI_VERSION}}
|
- go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{.GOLANGCI_VERSION}}
|
||||||
|
- go install golang.org/x/vuln/cmd/govulncheck@{{.GOVULNCHECK_VERSION}}
|
||||||
- lefthook install
|
- lefthook install
|
||||||
|
|||||||
+14
-4
@@ -9,7 +9,10 @@
|
|||||||
#
|
#
|
||||||
# Коды возврата: 0 — все обязательные шаги зелёные, 1 — есть красные.
|
# Коды возврата: 0 — все обязательные шаги зелёные, 1 — есть красные.
|
||||||
# Пропущенные шаги (нет инструмента) НЕ красят гейт, но попадают в сводку:
|
# Пропущенные шаги (нет инструмента) НЕ красят гейт, но попадают в сводку:
|
||||||
# молча пропущенная проверка — это ложное ощущение проверенности.
|
# молча пропущенная проверка — это ложное ощущение проверенности. То же с WARN:
|
||||||
|
# отказ, который почти всегда унаследован (уязвимость в зависимости или в
|
||||||
|
# стандартной библиотеке), не должен краснить каждый прогон ревью — иначе
|
||||||
|
# красный гейт перестают читать. Разбирает такой отказ агент.
|
||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
@@ -127,10 +130,17 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# --- Уязвимости зависимостей ---
|
# --- Уязвимости зависимостей ---
|
||||||
|
# Не блокирует: находка тут — состояние зависимостей и тулчейна, а не диффа.
|
||||||
|
# Исключение (уязвимость приехала с новой зависимостью в этом change) разбирает
|
||||||
|
# агент по списку вызовов.
|
||||||
if command -v govulncheck >/dev/null; then
|
if command -v govulncheck >/dev/null; then
|
||||||
step govulncheck "" govulncheck ./...
|
if govulncheck ./... >"$OUT_DIR/govulncheck.log" 2>&1; then
|
||||||
|
record OK govulncheck ""
|
||||||
|
else
|
||||||
|
record WARN govulncheck "достижимо из кода уязвимостей: $(grep -c '^Vulnerability #' "$OUT_DIR/govulncheck.log") → $OUT_DIR/govulncheck.log"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
record SKIP govulncheck "govulncheck не установлен (go install golang.org/x/vuln/cmd/govulncheck@latest)"
|
record SKIP govulncheck "govulncheck не установлен (task setup)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -144,4 +154,4 @@ if [ "$FAILED" -eq 1 ]; then
|
|||||||
echo "ГЕЙТ КРАСНЫЙ — опиниативные проходы не запускаются"
|
echo "ГЕЙТ КРАСНЫЙ — опиниативные проходы не запускаются"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "гейт зелёный (пропущенные шаги см. в сводке — они идут в границы покрытия)"
|
echo "гейт зелёный (шаги WARN и SKIP см. в сводке — они идут в находки и в границы покрытия)"
|
||||||
|
|||||||
Reference in New Issue
Block a user