const required = [ 'ENVIRONMENT', 'STACK_NAME', 'RELEASE_ID', 'COMMIT_SHA', 'WEB_IMAGE', 'INGESTION_IMAGE', 'POSTGRES_PASSWORD', 'INGESTION_ADMIN_PASSWORD', 'PUBLIC_HOST', 'TRAEFIK_NETWORK', 'SWARM_MANAGER_HOST', 'SWARM_SSH_USER', ]; const missing = required.filter((name) => !process.env[name]); if (missing.length > 0) { console.error(`Missing required deploy variables: ${missing.join(', ')}`); process.exit(1); } for (const imageName of ['WEB_IMAGE', 'INGESTION_IMAGE']) { if (!/@sha256:[a-f0-9]{64}$/i.test(process.env[imageName] ?? '')) { console.error(`${imageName} must be pinned by immutable digest, got: ${process.env[imageName]}`); process.exit(1); } } console.log( JSON.stringify({ event: 'predeploy_check_passed', environment: process.env.ENVIRONMENT, stack: process.env.STACK_NAME, releaseId: process.env.RELEASE_ID, commitSha: process.env.COMMIT_SHA, }), );