From 55155b0d4f4989f7da368c7dda0d93e37bdb4e20 Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 28 Aug 2026 01:34:07 +0300 Subject: [PATCH] ci: mutation-gate workflow runs four shards with a warm test-build (#332) Mirror of the dev-side change: the scheduled run executes this file from main while checking out the registry from dev, so the shard matrix must live here too. Issue: #332 User-Visible: no --- .github/workflows/mutation-gate.yml | 31 ++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/.github/workflows/mutation-gate.yml b/.github/workflows/mutation-gate.yml index d9af24e8..34af413c 100644 --- a/.github/workflows/mutation-gate.yml +++ b/.github/workflows/mutation-gate.yml @@ -5,11 +5,17 @@ name: Мутационный гейт # оставшийся зелёным на сломанном коде, ничего не защищает — он лишь выглядит # защитой, и это хуже его отсутствия. # -# Прогон дорогой: пересборка бандла на каждого мутанта. Поэтому он не входит в -# Validate и не идёт на каждый push. Его место — перед стабильным релизом -# (PROCESS.md §8) и раз в неделю по расписанию, чтобы дрейф тестов не копился -# до релиза. Дешёвая половина — «якоря патчей живы, guard-файлы существуют» — -# идёт с обычными юнитами: test/mutation-gate.test.mjs. +# Прогон дорогой, поэтому он не входит в Validate и не идёт на каждый push. +# Его место — перед стабильным релизом (PROCESS.md §8) и раз в неделю по +# расписанию, чтобы дрейф тестов не копился до релиза. Дешёвая половина — +# «якоря патчей живы, guard-файлы существуют» — идёт с обычными юнитами: +# test/mutation-gate.test.mjs. +# +# #332: бандл собирается только мутантам с браузерным гвардом (guardNeedsBundle), +# компиляция тестов в worktree стартует с тёплого test-build (инкрементальный +# tsc), а реестр режется на четыре чересполосных шарда — полный прогон +# укладывается в десятки минут вместо часов. Локальный дифф-режим: +# node scripts/mutation-gate.mjs --changed origin/dev..HEAD on: workflow_dispatch: @@ -31,10 +37,14 @@ concurrency: jobs: mutants: - name: "Мутанты: каждый обязан красить тесты" + name: "Мутанты: каждый обязан красить тесты (шард ${{ matrix.shard }} из 4)" runs-on: ubuntu-latest - # Все мутанты × (сборка + свой guard) — это десятки минут, и это нормально: - # гейт предрелизный. Час — потолок против зависшего Chromium. + strategy: + fail-fast: false + matrix: + shard: [1, 2, 3, 4] + # Шард ~64 мутантов × свой guard; бандл собирают только браузерные гварды. + # Час — потолок против зависшего Chromium. timeout-minutes: 60 steps: - uses: actions/checkout@v7 @@ -70,5 +80,8 @@ jobs: - name: Реестр применим к текущему коду run: node scripts/mutation-gate.mjs --check + - name: Тёплый test-build для инкрементальной компиляции мутантов + run: npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs + - name: Каждый тест ловит свою поломку - run: node scripts/mutation-gate.mjs + run: node scripts/mutation-gate.mjs --shard=${{ matrix.shard }}/4