opencode-config/docs/decisions/054-pr-122-pipeline-status-statuscheckrollup.md
Sergey d724e29f96
fix(pipeline-status): use statusCheckRollup instead of actions/runs CI filter (#122)
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 05:29:10 +03:00

49 lines
No EOL
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 застревает.