3.5 KiB
3.5 KiB
pr: 122 title: fix(pipeline-status): use statusCheckRollup instead of actions/runs CI filter
Что сделано
- CI-проверка переведена с
gh api .../actions/runs+name=="CI"фильтра наgh pr view --json statusCheckRollupв.opencode/scripts/pipeline-status.py.statusCheckRollupагрегирует ВСЕ checks по head SHA PR (CI, CI (always), ADR check и т.д.) — не зависит от имени workflow. - Убраны функции:
_get_pr_head_branch,_query_ci_run,_classify_ci_status,_poll_until_done,_retry_no_runs,_extract_json_field_loose(использовалась только в CI-фазе). - Добавлены функции:
_query_ci_rollup(запрос rollup),_classify_rollup(классификация статусов/conclusions),_classify_rollup_with_poll(polling при IN_PROGRESS/QUEUED/PENDING),_retry_no_checks(ререй при пустом rollup). - Тесты переписаны (
tests/test_pipeline_status_ci.py): 23 теста под statusCheckRollup, включая ключевойtest_ci_docs_only_pr(CI (always) + ADR check без ci.yml — regression guard для PR#120 bug). Mock-фабрикаmock_run_cmd_seqтеперь принимаетpr_view_responsesвместоapi_responses. - Docstring модуля обновлён: CI-фаза описана через statusCheckRollup.
- Handoff + ADR-054 созданы.
Проверки: ruff check OK; ruff format --check OK (40 files);
pytest tests/test_pipeline_status_ci.py tests/test_pipeline_status.py 107
passed; check-permissions.py OK.
Почему
Docs-only PR (PR#120) не запускают ci.yml (paths-ignore), только
always-ci.yml. Старый код фильтровал workflow runs по name=="CI" → не
находил CI (always) → возвращал AMBIGUOUS ("нет CI run на ветке ...").
Pipeline застревал на CI-фазе. statusCheckRollup агрегирует все checks по
head SHA — не зависит от имени workflow, корректно обрабатывает docs-only PR.
Pending
—
Watch out
_extract_json_field_looseубрана — использовалась ТОЛЬКО в CI-фазе.extract_json_field(без_loose) оставлена — используется вcheck_mergeиget_pr_title.JSON_FIELD_RE(модульная константа) не используется нигде — оставлена как есть (не входит в scope issue #121, была не используется и до PR)._classify_rollupсчитаетSKIPPEDиNEUTRALconclusions успешными (вместе сSUCCESS) — GitHub помечает skipped jobs как SKIPPED, это не failure._classify_rollupиспользует regex для извлеченияstatus/conclusionиз JSON (безjsonимпорта) — стиль скрипта (см.extract_json_field). Если в JSON появятся поля с такими же именами внеstatusCheckRollup— возможны ложные matchи; ноgh pr view --json statusCheckRollupвозвращает только rollup, так что на практике безопасно.- Polling сообщение изменилось: было
gh run view --branch {head_branch}, сталоgh pr checks {pr_number}.