49 lines
No EOL
2.8 KiB
Markdown
49 lines
No EOL
2.8 KiB
Markdown
# ADR-054: pipeline-status statusCheckRollup
|
||
|
||
## Статус
|
||
Accepted (2026-07-29)
|
||
|
||
## Контекст
|
||
|
||
`check_ci` в `pipeline-status.py` искал CI-ран через `gh api
|
||
repos/{org}/{repo}/actions/runs` с jq-фильтром `select(.name == "CI")`.
|
||
Этот подход ломается для docs-only PR:
|
||
|
||
- `ci.yml` имеет `paths-ignore` на `docs/**` — для docs-only PR workflow
|
||
`CI` НЕ запускается.
|
||
- Запускается только `always-ci.yml` (workflow name `CI (always)`), который
|
||
не имеет `paths-ignore`.
|
||
- jq-фильтр `select(.name == "CI")` не матчит `CI (always)` → возвращал
|
||
`null` → `_retry_no_runs` перепробовал 3 попытки → AMBIGUOUS
|
||
("нет CI run на ветке ...").
|
||
- Pipeline застревал на CI-фазе для docs-only PR, хотя CI фактически зелёный.
|
||
|
||
## Решение
|
||
|
||
Использовать `gh pr view --json statusCheckRollup` вместо `gh api
|
||
.../actions/runs`. `statusCheckRollup` — GitHub-native API, который
|
||
агрегирует ВСЕ checks (workflow runs + status checks) по head SHA PR:
|
||
|
||
- Не зависит от имени workflow (CI, CI (always), ADR check — все в одном
|
||
массиве).
|
||
- Не требует знания branch name (раньше нужен `gh pr view --json headRefName`
|
||
+ `select(.head_branch == ...)`).
|
||
- Один вызов `gh` вместо двух (`headRefName` + `actions/runs`).
|
||
|
||
Классификация `_classify_rollup`: все checks `COMPLETED` +
|
||
`SUCCESS`/`SKIPPED`/`NEUTRAL` → DONE; любой check `COMPLETED` с non-success
|
||
conclusion → NOT_DONE; любой check `IN_PROGRESS`/`QUEUED`/`PENDING` →
|
||
AMBIGUOUS (poll до timeout).
|
||
|
||
## Альтернативы
|
||
|
||
- **(B) Ослабить jq-фильтр** — убрать `select(.name == "CI")`, брать первый
|
||
run на ветке. Отвергнуто: `actions/runs` возвращает runs ВСЕХ workflows на
|
||
ветке (включая устаревшие), первый может быть не тем. Также не покрывает
|
||
status checks (не-workflow) — `statusCheckRollup` единый источник.
|
||
- **(C) SHA + all workflows** — искать runs по head SHA без фильтра по name.
|
||
Отвергнуто: та же проблема с выбором "правильного" run из нескольких, плюс
|
||
`actions/runs` не включает non-workflow status checks. `statusCheckRollup`
|
||
уже агрегирует всё корректно на стороне GitHub.
|
||
- **Оставить `actions/runs` + `name=="CI"`** — отвергнуто: баг для docs-only
|
||
PR не исправляется, pipeline застревает. |