Skip to content

chore(ci): stop burning runs on superseded pushes and docs-only PRs - #135

Merged
ManSio merged 3 commits into
mainfrom
chore/ci-cost-control
Nov 15, 2026
Merged

ManSio merged 3 commits into
mainfrom
chore/ci-cost-control

Conversation

@ManSio

@ManSio ManSio commented Nov 15, 2026

Copy link
Copy Markdown
Owner

Зачем

CI стоит не деньгами (репозиторий публичный — стандартные раннеры бесплатны), а временем до вердикта и шумом. Замер по 120 последним прогонам (2026-11-15):

Метрика Значение
Прогоны CI / CodeQL 64 / 56
PR-прогоны 46
Из них перезапуски того же дерева 28 (61%)
Один прогон CI 12.6 runner-минут, 7 job'ов

По job'ам: test windows 5.0 мин, ubuntu 2.7, clean-state 1.7, manifest-parity 1.4, docker-build 0.8, transport-equiv-e2e 0.8, secret-scan 0.2.

Второй источник лишних прогонов — AGENT_DIARY.md: его правит каждый PR, поэтому почти каждый второй PR получал конфликт, новый merge-коммит и новый полный прогон.

Что изменено

  1. concurrency — устаревший прогон того же PR отменяется:

    concurrency:
      group: ci-${{ github.workflow }}-${{ github.ref }}
      cancel-in-progress: ${{ github.event_name == 'pull_request' }}

    main намеренно не отменяется: его история прогонов — доказательство, а не черновик.

  2. Job changes + scripts/ci_changed_code.py — «менялся ли код». Тяжёлые job'ы (clean-state, manifest-parity, transport-equiv-e2e, docker-build) получили needs: changes и if: push || code == 'true'. Docs-only PR экономит ~4.7 из 12.6 минут.
    Логика — в Python, не в inline-shell: тестируется штатным pytest и одинаково работает на ubuntu/windows. Неизвестная база → true (fail-open: лучше лишний прогон, чем пропущенная проверка).

  3. .gitattributes: AGENT_DIARY.md merge=union — дневник только дописывается, поэтому «оба правы» и есть верное разрешение конфликта. Локальные merge'и (и любой git merge у человека/агента) больше не спотыкаются о дневник.

    ⚠️ Граница: GitHub выполняет server-side merge без пользовательских merge-драйверов; применяет ли он встроенный union — не проверено (⏳). Если нет, конфликт в PR останется, но:

    • локальный путь (а он у нас основной: merge main в ветку перед push) перестаёт требовать ручной правки;
    • проверить можно одним PR, который дописывает дневник при уже изменённом main — если GitHub покажет конфликт, утверждение в этом пункте остаётся верным только для локальных merge.

Проверка

pytest tests/test_ci_changed_code.py -q    -> 9 passed
ruff check scripts/... tests/...           -> All checks passed
YAML: 7 job'ов, changes первым, concurrency читается парсером

Тесты фиксируют: docs/, *.md, experiments/, logo/ — не код; src/, install.py, pyproject.toml — код; смесь docs+src — код; неизвестная база — true; HEAD..HEAD — false; у четырёх тяжёлых job'ов есть needs: changes; cancel-in-progress привязан к PR.

Union-merge проверен отдельным репозиторием: две ветки дописывают разные строки в дневник → merge без конфликта, обе строки на месте.

Эффект (оценка, не замер)

  • −28 прогонов из 46 в наблюдаемом окне (отмена устаревших);
  • −4.7 из 12.6 runner-минут на docs-only PR;
  • минус повторные merge-прогоны из-за дневника;
  • main не теряет ни одного job'а: фильтр не действует на push в main.

Не проверено

  • Реальный экономический эффект — только после нескольких недель; цифры выше измерены на прошлых прогонах, не предсказаны.
  • Ветка защиты: если changes упадёт, зависимые job'ы будут skipped. Если это станет проблемой, добавлю if: always() с явным провалом.

@coderabbitai

coderabbitai Bot commented Nov 15, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 75e474f3-bc28-4f00-8645-3db7ec46f011

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@ManSio
ManSio merged commit a535c2c into main Nov 15, 2026
14 checks passed
@ManSio
ManSio deleted the chore/ci-cost-control branch November 15, 2026 07:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant