-
Notifications
You must be signed in to change notification settings - Fork 2
145 lines (129 loc) · 4.44 KB
/
Copy pathsbom.yml
File metadata and controls
145 lines (129 loc) · 4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
name: SBOM Generation
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
release:
types: [ published ]
schedule:
# Generate SBOM weekly on Sunday at 3 AM UTC
- cron: '0 3 * * 0'
workflow_dispatch:
permissions:
contents: write
packages: read
security-events: write
jobs:
generate-sbom:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
- name: Generate SBOM with Syft (CycloneDX)
uses: anchore/sbom-action@v0
with:
path: .
format: cyclonedx-json
output-file: sbom-cyclonedx.json
artifact-name: sbom-cyclonedx
- name: Generate SBOM with Syft (SPDX)
uses: anchore/sbom-action@v0
with:
path: .
format: spdx-json
output-file: sbom-spdx.json
artifact-name: sbom-spdx
- name: Setup Node.js for web frontend SBOM
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Generate npm SBOM (CycloneDX)
working-directory: web
run: |
npm ci --ignore-scripts
npx @cyclonedx/cyclonedx-npm --output-file ../sbom-npm-cyclonedx.json --output-format JSON || true
- name: Run npm audit
working-directory: web
continue-on-error: true
run: |
npm audit --json > ../npm-audit-report.json 2>&1 || true
echo "## npm Audit Summary" > ../npm-audit-summary.md
npm audit --omit=dev 2>&1 | tail -20 >> ../npm-audit-summary.md || true
- name: Build dependency provenance summary
run: |
python3 << 'EOF' > dependency-provenance.md
import json
with open('dependency-manifest.json', 'r', encoding='utf-8') as f:
manifest = json.load(f)
print("# Dependency Provenance")
print()
print(f"Generated: workflow run")
print()
print("## Internal ecosystem")
for dep in manifest.get("internal_ecosystem", []):
print(f"- {dep['name']}: {dep['version']} ({dep['license']})")
print()
print("## Native and system dependencies")
for dep in manifest.get("native_and_system", []):
print(f"- {dep['name']}: {dep['resolution']} [{dep['license']}]")
print()
print("## FetchContent / vendored inputs")
for dep in manifest.get("fetched_content", []):
print(f"- {dep['name']}: {dep['version']} ({dep['license']})")
print()
print("## Frontend inputs")
print(f"- package manifest: {manifest['web_frontend']['manifest']}")
print(f"- lockfile: {manifest['web_frontend']['lockfile']}")
EOF
- name: Create combined SBOM report
run: |
echo "# Software Bill of Materials (SBOM)" > SBOM_REPORT.md
echo "" >> SBOM_REPORT.md
echo "**Repository**: ${{ github.repository }}" >> SBOM_REPORT.md
echo "**Branch**: ${{ github.ref_name }}" >> SBOM_REPORT.md
echo "**Commit**: ${{ github.sha }}" >> SBOM_REPORT.md
echo "**Generated**: $(date -u)" >> SBOM_REPORT.md
echo "" >> SBOM_REPORT.md
echo "## Available Formats" >> SBOM_REPORT.md
echo "" >> SBOM_REPORT.md
echo "- **CycloneDX**: sbom-cyclonedx.json" >> SBOM_REPORT.md
echo "- **SPDX**: sbom-spdx.json" >> SBOM_REPORT.md
echo "" >> SBOM_REPORT.md
cat dependency-provenance.md >> SBOM_REPORT.md
- name: Upload SBOM artifacts
uses: actions/upload-artifact@v7
with:
name: sbom-${{ github.sha }}
path: |
sbom-cyclonedx.json
sbom-spdx.json
sbom-npm-cyclonedx.json
npm-audit-report.json
npm-audit-summary.md
dependency-provenance.md
dependency-manifest.json
LICENSE-THIRD-PARTY
SBOM_REPORT.md
retention-days: 90
- name: Upload SBOM to release
if: github.event_name == 'release'
uses: softprops/action-gh-release@v2
with:
files: |
sbom-cyclonedx.json
sbom-spdx.json
sbom-npm-cyclonedx.json
dependency-manifest.json
LICENSE-THIRD-PARTY
SBOM_REPORT.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Submit SBOM to Dependency Graph
uses: advanced-security/spdx-dependency-submission-action@v0.1.1
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
continue-on-error: true
with:
filePath: sbom-spdx.json