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

2.8 KiB
Raw Permalink Blame History

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