Files
vendoo/tools/verify-updater-ci-lifecycle-3.4.mjs
T

52 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.');