Skip to content

CI: пропущенная джоба — не «выполняется», а обязательная джоба — обязательна - #60

Merged
markpolyak merged 5 commits into
mainfrom
fix/ci-skipped-jobs
Sep 24, 2026
Merged

markpolyak merged 5 commits into
mainfrom
fix/ci-skipped-jobs

Conversation

@markpolyak

@markpolyak markpolyak commented Sep 23, 2026 •

Copy link
Copy Markdown
Owner

Зачем

Проверка CI различала только success и failure, а остальные шесть значений conclusion вместе с None сваливала в «ещё выполняется». Пропущенная по своему if: джоба (skipped) — это не «ещё не закончилось»: шаблон контрольной пропускает personalize, когда вариант уже сгенерирован, и has_pending перекрывал успешный grade. В результате контрольная СПиВР не выставлялась никому — та же поломка, что чинилась конфигом в 96ad351 для НН и в ed1e25e для СПиВР.

Попутно вскрылась обратная, более опасная поломка: джоба, перечисленная в ci.workflows, но отсутствующая среди проверок, молча выбрасывалась фильтром, и работа оценивалась по оставшимся. ЛР3 ОС-2026 требует три джобы, а образ windows-раннера сменил build (MSVC, Visual Studio 17 2022) на build (MSVC, Visual Studio 18 2026) — репозитории получали v по двум обязательным джобам из трёх, сборка MSVC не участвовала в решении вовсе. В ЛР1 ML-2026 то же самое с run-autograding-tests, которой в репозиториях курса нет.

Что сделано

1. Классификация исходов CI

conclusion Как учитывается
success Засчитывается
failure, timed_out, cancelled, stale, action_required Ошибка → x (перезаписывается при повторной проверке)
skipped, neutral Не учитывается — ничего не говорит о работе студента
None И только он — «ещё выполняется»

Галочка требует успеха от всех учтённых джоб (логическое И). Если учитывать нечего — все проверки пропущены — оценка не выставляется.

2. Каждая джоба из ci.workflows обязательна

  • Её пропуск (skipped) — ошибка: конфиг требует от неё успеха.
  • Её отсутствие среди проверок снимает галочку и отвечает CI_JOBS_NOT_FOUND с перечислением недостающих джоб. В таблицу не идёт ни v, ни x: по данным GitHub не различить устаревшее имя в конфиге и джобу, не запускавшуюся у студента.
  • Пока другие проверки коммита ещё выполняются, недостающая джоба считается не появившейся, а не отсутствующей.

3. Шаблоны в именах джоб

Имя джобы несёт версию образа раннера, и в одной группе живут оба поколения (в ЛР3 ОС-2026 — четыре репозитория с новым именем, два со старым). Фиксированное имя отвечает CI_JOBS_NOT_FOUND одной из половин, перечисление обоих имён потребовало бы обе джобы от каждого. Поэтому имя из ci.workflows с метасимволами (*, ?, [...]) сопоставляется через fnmatch:

ci:
  workflows:
    - run-autograding-tests
    - build (MINGW64, MinGW Makefiles)
    - build (MSVC, Visual Studio *)

Строгость сохранена: шаблон обязан совпасть хотя бы с одной проверкой, и все совпавшие с ним проверки должны быть успешны.

4. Диагностика: сообщение об ожидании называет джобу, которую ждём; фолбэк «джобы не заданы, дефолтные имена не совпали — берём все проверки» пишет предупреждение в лог (в репозиторий могут попасть проверки, которых нет в .github/workflows: CodeQL default setup, pages build and deployment, приложения организации).

5. Конфигурации курсов: ЛР3 ОС-2026 переведена на шаблон MSVC-сборки; из ЛР1 ML-2026 убрана run-autograding-tests, которой нет в репозиториях курса (suai-mlb-2026 не тронут — там обе джобы реально есть).

Проверка

Прогон старой и новой логики по ~100 репозиториям всех курсов на реальных check runs из GitHub API:

Курс Было Стало
СПиВР, контрольная (6 репозиториев) PENDING (1/2) навсегда v (1/1)
ОС-2026, ЛР5 (3 репозитория, run-autograding-tests=skipped + cpplint=failure) PENDING навсегда x (0/2)
ОС-2026, ЛР3 v по 2 джобам из 3, MSVC не проверялась v/x по всем 3 в обоих поколениях имён
ML-2026, ЛР1 v/x по 1 обязательной джобе из 2 v/x по фактической джобе курса
Репозитории с единственной пропущенной джобой «CI выполняется» «Нет активных CI-проверок»

Ложных v не осталось. Тесты: 862 проходят (добавлено 35, включая skipped/cancelled/neutral, отсутствующие обязательные джобы и шаблоны имён — таких случаев в наборе не было вовсе).

🤖 Generated with Claude Code

markpolyak and others added 4 commits September 23, 2026 07:42
Проверка различала только success и failure, а остальные шесть значений
conclusion и None сваливала в "ещё выполняется". Джоба, пропущенная по своему
`if:` (skipped), это не "ещё не закончилось": шаблон контрольной пропускает
personalize, когда вариант уже сгенерирован, и has_pending перекрывал успешный
grade - оценка не выставлялась никому. То же самое ловили cancelled и
timed_out: прогон без вердикта залипал в PENDING навсегда.

Теперь исходы разложены по трём классам. success засчитывается; failure,
timed_out, cancelled, stale и action_required дают "x", который перезаписывается
при повторной проверке; skipped и neutral не учитываются вовсе - они не говорят
ничего о работе студента. Ожиданием остаётся ровно conclusion == None.
Галочка по-прежнему требует успеха от всех учтённых джоб (логическое И), а если
учитывать оказалось нечего - все проверки пропущены - оценка не выставляется.

Джоба, перечисленная в ci.workflows, исключение: её пропуск считается ошибкой,
раз конфиг требует от неё успеха. Так три репозитория ЛР5 ОС-2026
(run-autograding-tests=skipped, cpplint=failure) выходят из вечного ожидания в
"x".

Имя из ci.workflows, которому не нашлось проверки, пишется в лог и не
учитывается: конфиги перечисляют имена джоб разных поколений шаблона (в
itmo-ml-2026 указаны run-autograding-tests и "Test python scripts", а
репозитории производят только вторую). Но если ни одно имя из конфига не
совпало ни с одной проверкой коммита, это CI_JOBS_NOT_FOUND, а не "x":
устаревший конфиг не должен стоить группе оценок.

Сообщение об ожидании называет джобу, которую ждём, а молчаливый фолбэк "джобы
не заданы, дефолтные имена не совпали - берём все проверки" пишет предупреждение
в лог: в репозиторий могут попасть проверки, которых нет в .github/workflows
(CodeQL default setup, pages build and deployment, приложения организации).

Проверено на ~100 репозиториях всех курсов: 19 расхождений со старым
поведением, все ожидаемые - контрольная СПиВР получает "v", ЛР5 ОС-2026 "x",
репозитории с единственной пропущенной джобой отвечают "нет активных проверок"
вместо "выполняется".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Предыдущий коммит трактовал отсутствующее имя из конфига как устаревшее и
пропускал его, оценивая работу по оставшимся джобам. Это неверно: конфиг
перечисляет джобы, которые ОБЯЗАНЫ пройти, и джоба, не давшая результата,
успеха не дала. Так ЛР3 ОС-2026 требует три джобы, а образ windows-раннера
сменил "build (MSVC, Visual Studio 17 2022)" на "build (MSVC, Visual Studio
18 2026)" - фильтр молча выбрасывал отсутствующее имя, и репозиторий получал
"v" по двум джобам из трёх, причём сборка MSVC не проверялась вовсе.

Теперь недостающая обязательная джоба снимает галочку. В таблицу не идёт ни
"v", ни "x": по данным GitHub не различить, устарело ли имя в конфиге или
джоба не запускалась в репозитории студента, поэтому проверка отвечает
CI_JOBS_NOT_FOUND с перечислением недостающих джоб. Пока другие проверки
коммита ещё выполняются, недостающая джоба считается не появившейся, а не
отсутствующей.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Конфиг требовал run-autograding-tests и "Test python scripts", а шаблон курса
производит только вторую. Пока отсутствующее имя молча выбрасывалось фильтром,
работы оценивались по одной обязательной джобе из двух; теперь недостающая
джоба снимает галочку, и лаба отвечала бы CI_JOBS_NOT_FOUND всем студентам.

Проверено на репозиториях курса: check runs называются ровно "Test python
scripts". В suai-mlb-2026 присутствуют обе джобы, поэтому его конфиг не тронут.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Имя джобы несёт в себе версию образа раннера: одна и та же сборка называется
"build (MSVC, Visual Studio 17 2022)" на старом образе и "build (MSVC, Visual
Studio 18 2026)" на новом. В ЛР3 ОС-2026 в группе одновременно живут оба
поколения - четыре репозитория с новым именем, два со старым, - поэтому любое
фиксированное имя в конфиге отвечает CI_JOBS_NOT_FOUND одной из половин, а
перечисление обоих имён потребовало бы обе джобы от каждого репозитория.

Имя из ci.workflows с метасимволами (*, ?, [...]) сопоставляется через fnmatch,
без них - точным сравнением, как раньше. Строгость сохранена: шаблон обязан
совпасть хотя бы с одной проверкой коммита, и все совпавшие с ним проверки
должны быть успешны; пропуск совпавшей джобы, как и для литерального имени,
считается ошибкой.

ЛР3 ОС-2026 переведена на "build (MSVC, Visual Studio *)". Проверено на шести
репозиториях курса: полностью зелёные получают "v" по всем трём обязательным
джобам в обоих поколениях имён, репозитории с упавшей сборкой - "x".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@markpolyak markpolyak changed the title Не считать пропущенную джобу CI незавершённой CI: пропущенная джоба — не «выполняется», а обязательная джоба — обязательна Sep 23, 2026
@markpolyak
markpolyak merged commit e2e19cc into main Sep 24, 2026
1 check passed
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