52 lines
3.6 KiB
JavaScript
52 lines
3.6 KiB
JavaScript
import { readFileSync } from 'node:fs';
|
||
import { resolve, join } from 'node:path';
|
||
import { REQUIRED_CHECKS, REQUIRED_WORKFLOWS } from './updater-lifecycle-3.4.mjs';
|
||
|
||
const root = resolve(import.meta.dirname, '..');
|
||
const read = path => readFileSync(join(root, path), 'utf8');
|
||
const failures = [];
|
||
const assert = (condition, message) => { if (!condition) failures.push(message); };
|
||
|
||
const ci = read('.github/workflows/ci.yml');
|
||
const sync = read('.github/workflows/sync-release-manifest.yml');
|
||
|
||
assert(ci.includes('workflow_dispatch:'), 'Vendoo CI kann nicht explizit auf dem finalen Head gestartet werden.');
|
||
assert(ci.includes('name: Updater-3.4-Paket nach Abnahme'), 'Nachgelagerter Paket-Pflichtcheck fehlt.');
|
||
assert(ci.includes('needs: [quality, windows-release-contract]'), 'Das Paket ist nicht strikt von Linux- und Windows-Abnahme abhängig.');
|
||
assert(ci.includes('git diff --exit-code -- release-manifest.json'), 'Paketjob bestätigt kein reproduzierbares Root-Manifest.');
|
||
assert(ci.includes('vendoo-release-package-v2'), 'Paketjob validiert das Provenienzschema v2 nicht.');
|
||
assert(ci.includes('actions/upload-artifact@v4'), 'Das geprüfte Paket wird nicht als CI-Artefakt bereitgestellt.');
|
||
assert(ci.includes('powershell-parser-diagnostics'), 'Windows-Parserfehler werden nicht als Diagnoseartefakt gesichert.');
|
||
assert(ci.includes('tools/build-deterministic-zip.py'), 'Paketjob verwendet keinen deterministischen ZIP-Build.');
|
||
assert(ci.includes('first_hash') && ci.includes('second_hash'), 'Paketjob weist die Byte-Reproduzierbarkeit des ZIPs nicht nach.');
|
||
assert(!ci.includes('zip -qr'), 'Paketjob verwendet weiterhin den zeitstempelabhängigen Standard-ZIP-Build.');
|
||
|
||
const deterministicZip = read('tools/build-deterministic-zip.py');
|
||
assert(deterministicZip.includes('FIXED_TIMESTAMP = (1980, 1, 1, 0, 0, 0)'), 'Deterministischer ZIP-Build besitzt keinen fixierten Zeitstempel.');
|
||
assert(deterministicZip.includes('sorted(source.rglob'), 'Deterministischer ZIP-Build sortiert die Payload nicht.');
|
||
|
||
assert(sync.includes("'release/*-production-update-v*'"), 'Manifest-Sync ist nicht versionsneutral auf Releasebranches begrenzt.');
|
||
assert(sync.includes('workflow_dispatch:'), 'Manifest-Sync kann nicht auf dem finalen Head registriert werden.');
|
||
assert(sync.includes('actions: write'), 'Manifest-Sync darf keine Final-Head-Workflows dispatchen.');
|
||
assert(sync.includes('gh workflow run ci.yml'), 'Manifest-Sync dispatcht Vendoo CI nicht auf den finalen Head.');
|
||
assert(sync.includes('gh workflow run sync-release-manifest.yml'), 'Manifest-Sync registriert keinen eigenen Lauf auf dem finalen Head.');
|
||
assert(sync.includes('git ls-remote origin'), 'Manifest-Sync bestätigt den gepushten Remote-Head nicht.');
|
||
assert(sync.includes('cancel-in-progress: false'), 'Manifest-Sync könnte seinen eigenen Final-Head-Dispatch abbrechen.');
|
||
assert(!sync.includes('release/1.43.0-production-update-v3'), 'Manifest-Sync enthält weiterhin den alten festen 3.3-Branch.');
|
||
|
||
for (const name of [
|
||
'Syntax, Sicherheit und Release-Gates',
|
||
'Windows – vollständiger Releasevertrag',
|
||
'Updater-3.4-Paket nach Abnahme',
|
||
]) assert(REQUIRED_CHECKS.includes(name), `Lifecycle-Pflichtcheck fehlt: ${name}`);
|
||
for (const name of ['Vendoo CI', 'Vendoo Release Manifest Sync']) {
|
||
assert(REQUIRED_WORKFLOWS.includes(name), `Lifecycle-Pflichtworkflow fehlt: ${name}`);
|
||
}
|
||
|
||
if (failures.length) {
|
||
console.error(`Updater-3.4-CI-Lifecycle-Gate fehlgeschlagen (${failures.length})`);
|
||
failures.forEach(failure => console.error(`- ${failure}`));
|
||
process.exit(1);
|
||
}
|
||
console.log('Updater-3.4-CI-Lifecycle-Gate erfolgreich: finaler Head, Windows-Diagnose und reproduzierbares Paket sind verbindlich abgesichert.');
|