ReviewOS

also looking at this

craft-native/craft

fix(ci): gate release publishing on SBOM scan

#314
Merged glennmichael123 wants to merge codex/release-sbom-prerequisite into main
5 files +44 -9
scripts/release-workflow.test.tsmodified+9-1
Changes to scripts/release-workflow.test.ts
@@ -7,7 +7,8 @@ type Job = {
77 needs?: string | string[]
88 if?: string
99 uses?: string
10 steps?: { name?: string, run?: string, uses?: string }[]
10 with?: { enforce_high?: boolean }
11 steps?: { name?: string, run?: string, uses?: string, env?: Record<string, string> }[]
1112 strategy?: { matrix: { platform: { name: string, os: string }[] } }
1213}
1314const release = Bun.YAML.parse(readFileSync(join(import.meta.dir, '../.github/workflows/release.yml'), 'utf8')) as { jobs: Record<string, Job> }
@@ -41,6 +42,10 @@ test('npm publication follows artifact validation, and macOS downloads run on bo
4142 ])
4243 expect(steps(release.jobs['verify-macos-downloads'])).toContain('scripts/verify-macos-release.ts')
4344 expect(release.jobs['release-sbom'].uses).toBe('./.github/workflows/sbom.yml')
45 expect(release.jobs['release-sbom'].with?.enforce_high).toBe(true)
46 expect(needs(release.jobs.pantry)).toContain('release-sbom')
47 expect(steps(release.jobs.pantry)).toContain('bun install --frozen-lockfile')
48 expect(steps(release.jobs.npm)).toContain('bun install --frozen-lockfile')
4449 expect(needs(release.jobs['attach-release-sbom'])).toContain('release-sbom')
4550 expect(steps(release.jobs['attach-release-sbom'])).toContain('cmp "sbom/$document" "$VERIFY_DIR/$document"')
4651})
@@ -66,6 +71,7 @@ test('a registry network failure remains a visible best-effort warning', () => {
6671test('SBOM generation validates required documents before uploading artifacts', () => {
6772 const workflow = Bun.YAML.parse(readFileSync(join(import.meta.dir, '../.github/workflows/sbom.yml'), 'utf8')) as { jobs: Record<string, Job> }
6873 const generate = workflow.jobs.generate.steps!
74 expect(generate.find(step => step.name === 'Install dependencies')?.run).toBe('bun install --frozen-lockfile')
6975 const validation = generate.findIndex(step => step.name === 'Validate SBOMs')
7076 const upload = generate.findIndex(step => step.uses?.startsWith('actions/upload-artifact@'))
7177 expect(validation).toBeGreaterThan(-1)
@@ -74,4 +80,6 @@ test('SBOM generation validates required documents before uploading artifacts',
7480 expect(command).toContain('bun scripts/verify-sbom.ts sbom "v$VERSION"')
7581 expect(command).toContain("require('./package.json').version")
7682 expect(command).not.toContain('||')
83 const scan = workflow.jobs['vulnerability-scan'].steps!.find(step => step.name === 'Scan and validate vulnerability report')
84 expect(scan?.env?.CRAFT_FAIL_HIGH).toBe('$')
7785})