mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-01 12:18:51 +00:00
infra(process): bundle and review index change only on the way to dev (#657)
Решения владельца: 1б — индекс ревью не пересобирается в ветке задачи, только коммитами, идущими в dev; 2б — бандл меняет только кандидат беты/релиза, стенд dev берёт его из артефакта Validate. - scripts/bundle-policy.mjs: коммит, трогающий dist/** или custom_components/houseplan/frontend/**, обязан нести Release: (хук commit-msg и история в CI через validate-commit-provenance; коммиты с датой автора до 2026-09-27 не судятся); --verify судит целостность свежей сборки всегда, побайтовую сверку с закоммиченной копией — только на коммите, меняющем бандл, или кандидате; --clean. - release-prerelease: публикация отказывает, если отпечаток исходников в закоммиченном манифесте не равен отпечатку дерева (хотфикс поверх кандидата без пересборки). - bundle-sync: по умолчанию только demo/srv/assets; --release (npm run bundle:release) — ещё и custom_components. - rebase-on-dev: конфликт в бандле берёт копию dev, без пересборки и amend. - validate.yml: job dev_build публикует card-bundle головы dev в сиротскую ветку dev-build (scripts/dev-build.mjs); стенд накладывает её demo/stand/update-dev-bundle.sh. - _process.yml: индекс ревью больше не пересобирается при приведении к dev и при публикации документа в ветку задачи. - golden-wsl-artifact/golden-container: сборка перед съёмкой не считается правкой источника, после — bundle:clean. - test/bundle-tree-committed: судит закоммиченный снимок, не диск. - 11 мутантов в реестре; PROCESS/AGENTS/DEVELOPMENT/AUTHOR/REVIEWER. Issue: #657 User-Visible: no
This commit is contained in:
@@ -55,8 +55,8 @@ test('бандл собирается один раз и приезжает бр
|
||||
// ~10 джобо-минут на каждом непереиспользованном прогоне.
|
||||
const builds = [...workflow.matchAll(/^ +run: npm run (build|bundle:sync)$/gm)];
|
||||
assert.equal(builds.length, 1, 'бандл должен собираться ровно в одной job');
|
||||
assert.equal(workflow.match(/name: card-bundle/g)?.length, 4,
|
||||
'один upload и три download артефакта бандла');
|
||||
assert.equal(workflow.match(/name: card-bundle/g)?.length, 5,
|
||||
'один upload и четыре download артефакта бандла (три браузерные job и стенд dev, #657)');
|
||||
assert.equal(workflow.match(/name: card-test-build/g)?.length, 2,
|
||||
'один upload и один download тестового дерева для smoke job');
|
||||
assert.match(workflow, /name: card-test-build\n\s+path: test-build\//,
|
||||
@@ -68,6 +68,25 @@ test('бандл собирается один раз и приезжает бр
|
||||
assert.equal(workflow.match(/node scripts\/bundle-sync\.mjs/g)?.length, 3);
|
||||
});
|
||||
|
||||
test('#657 копии бандла сверяются только на релизном коммите, стенд dev — из артефакта', () => {
|
||||
const workflow = read('validate.yml');
|
||||
const frontend = workflow.slice(workflow.indexOf('\n frontend:\n'), workflow.indexOf('\n dev_build:\n'));
|
||||
assert.match(frontend, /name: Card bundle trees in sync\n\s+run: \|\n\s+node scripts\/bundle-policy\.mjs --verify HEAD/,
|
||||
'решение «сверять ли закоммиченную копию» принимает bundle-policy, а не безусловный bundle-tree');
|
||||
assert.doesNotMatch(frontend, /bundle-tree\.mjs dist custom_components/,
|
||||
'безусловная сверка красила бы каждую задачу, не коммитящую бандл');
|
||||
const devBuild = workflow.slice(workflow.indexOf('\n dev_build:\n'), workflow.indexOf('\n smoke:\n'));
|
||||
assert.match(devBuild, /if: github\.event_name == 'push' && github\.ref == 'refs\/heads\/dev'/);
|
||||
assert.match(devBuild, /needs: frontend/);
|
||||
assert.match(devBuild, /contents: write/);
|
||||
assert.match(devBuild, /name: card-bundle\n\s+path: dist/);
|
||||
assert.match(devBuild, /node scripts\/dev-build\.mjs --sha "\$GITHUB_SHA" --dist dist/);
|
||||
assert.match(devBuild, /continue-on-error: true/, 'сбой публикации для стенда не красит проверку кода');
|
||||
const proof = workflow.slice(workflow.indexOf('\n proof:\n'));
|
||||
assert.doesNotMatch(proof.split('\n').find((line) => /needs:/.test(line)) || '', /dev_build/,
|
||||
'стенд — не вход доказательства');
|
||||
});
|
||||
|
||||
test('предполётные проверки не прячут друг друга (#336)', () => {
|
||||
const workflow = read('validate.yml');
|
||||
const preflight = workflow.slice(
|
||||
|
||||
Reference in New Issue
Block a user