2.8 KiB
2.8 KiB
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 workflowCIНЕ запускается.- Запускается только
always-ci.yml(workflow nameCI (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 headRefNameselect(.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 застревает.