ci: shard changed mutants before release

Issue: #480
User-Visible: no
Release: v1.73.0-beta.2
This commit is contained in:
Matysh
2026-09-06 21:44:09 +03:00
parent f2e38e4815
commit 5d281171c8
2 changed files with 18 additions and 5 deletions
+11 -4
View File
@@ -457,12 +457,18 @@ jobs:
# файл, который он патчит, либо изменился его гард. `--check` этого не # файл, который он патчит, либо изменился его гард. `--check` этого не
# видит — он проверяет существование якоря, а не достижимость ветки. # видит — он проверяет существование якоря, а не достижимость ветки.
# Полный прогон раз в неделю ловит гниль с опозданием до релиза (#466, # Полный прогон раз в неделю ловит гниль с опозданием до релиза (#466,
# #467). Здесь гоняются только затронутые мутанты — единицы, минуты — # #467). Здесь гоняются только затронутые мутанты с той же базы диапазона,
# с той же базы диапазона, что и остальные гейты ветки (#387/#388). # что и остальные гейты ветки (#387/#388). Релизный диапазон всё же может
# задеть сотню свидетелей, поэтому #480 делит тот же набор на три
# детерминированных непересекающихся шарда вместо ослабления проверки.
changed_mutants: changed_mutants:
name: "Мутанты по диффу: затронутые свидетели краснеют" name: "Мутанты по диффу (${{ matrix.shard }}/3): затронутые свидетели краснеют"
needs: changes needs: changes
if: needs.changes.outputs.frontend == 'true' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.mutants == 'true' if: needs.changes.outputs.frontend == 'true' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.mutants == 'true'
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 30 timeout-minutes: 30
steps: steps:
@@ -495,6 +501,7 @@ jobs:
PROVEN_BASE: ${{ needs.changes.outputs.range_base }} PROVEN_BASE: ${{ needs.changes.outputs.range_base }}
HEAD_SHA: ${{ github.sha }} HEAD_SHA: ${{ github.sha }}
REF: ${{ github.ref }} REF: ${{ github.ref }}
SHARD: ${{ matrix.shard }}
run: | run: |
set -euo pipefail set -euo pipefail
git fetch -q origin dev git fetch -q origin dev
@@ -513,7 +520,7 @@ jobs:
fi fi
echo "диапазон: $base..$HEAD_SHA" echo "диапазон: $base..$HEAD_SHA"
npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs
node scripts/mutation-gate.mjs --changed="$base..$HEAD_SHA" node scripts/mutation-gate.mjs --changed="$base..$HEAD_SHA" --shard="$SHARD/3"
frontend: frontend:
name: "Фронтенд: типы, юниты, мутанты, синхрон бандла" name: "Фронтенд: типы, юниты, мутанты, синхрон бандла"
+7 -1
View File
@@ -377,7 +377,13 @@ test('мутанты по диффу гоняются на каждом пуше
// База диапазона — та же, что у остальных гейтов ветки (#387/#388). // База диапазона — та же, что у остальных гейтов ветки (#387/#388).
assert.match(job, /PROVEN_BASE: \$\{\{ needs\.changes\.outputs\.range_base \}\}/); assert.match(job, /PROVEN_BASE: \$\{\{ needs\.changes\.outputs\.range_base \}\}/);
assert.match(job, /git merge-base origin\/dev "\$HEAD_SHA"/); assert.match(job, /git merge-base origin\/dev "\$HEAD_SHA"/);
assert.match(job, /node scripts\/mutation-gate\.mjs --changed="\$base\.\.\$HEAD_SHA"/); // #480: один широкий релизный диапазон отобрал 129 свидетелей и упёрся в
// 30-минутный timeout. Тот же набор теперь делится существующим
// детерминированным shardMutants без пропусков и пересечений.
assert.match(job, /fail-fast: false/);
assert.match(job, /shard: \[1, 2, 3\]/);
assert.match(job, /SHARD: \$\{\{ matrix\.shard \}\}/);
assert.match(job, /node scripts\/mutation-gate\.mjs --changed="\$base\.\.\$HEAD_SHA" --shard="\$SHARD\/3"/);
// pytest-гарды исполнимы: Python и зависимости ставятся, как в mutation-gate.yml. // pytest-гарды исполнимы: Python и зависимости ставятся, как в mutation-gate.yml.
assert.match(job, /pip install -r tests_backend\/requirements\.txt/); assert.match(job, /pip install -r tests_backend\/requirements\.txt/);
// Блокирующая job: свидетель, разучившийся краснеть, — отказ, а не предупреждение. // Блокирующая job: свидетель, разучившийся краснеть, — отказ, а не предупреждение.