-
-
Notifications
You must be signed in to change notification settings - Fork 0
274 lines (241 loc) · 8.7 KB
/
Copy pathslsa-release.yml
File metadata and controls
274 lines (241 loc) · 8.7 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
name: SLSA Release Pipeline
on:
push:
tags:
- 'v*'
workflow_dispatch:
permissions:
contents: read
id-token: write
attestations: write
actions: read
concurrency:
group: slsa-release-${{ github.ref }}
cancel-in-progress: false
jobs:
primary-build:
name: Primary Hermetic Build
runs-on: ubuntu-22.04
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: "-C link-arg=-fuse-ld=mold"
outputs:
subjects: ${{ steps.manifest.outputs.subjects }}
artifact_name: ${{ steps.manifest.outputs.artifact_name }}
checksum_name: ${{ steps.manifest.outputs.checksum_name }}
sbom_name: ${{ steps.manifest.outputs.sbom_name }}
steps:
- name: Checkout repository
uses: actions/checkout@b4ffde65f46336ab0bcb5c3c07cc53d5af34d2f6
with:
fetch-depth: 0
submodules: true
- name: Verify tag signature
run: |
git verify-tag "${GITHUB_REF_NAME}" || echo "warning: unsigned tag"
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1f953844bd68bc033fb4a6a4c9bb6c3eb2edaa0b
with:
toolchain: stable
targets: x86_64-unknown-linux-gnu
components: clippy
- name: Cache cargo registry
uses: Swatinem/rust-cache@dd52aa9d3c7dcb9108118975d56edb4cedc0977f
with:
cache-on-failure: true
- name: Fetch dependencies (locked)
run: cargo fetch --locked
- name: Disable outbound network for hermetic build
run: |
sudo iptables -P OUTPUT DROP
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d ::1 -j ACCEPT
- name: Build release artifacts
run: cargo build --locked --release
- name: Re-enable network for artifact publication
if: always()
run: |
sudo iptables -F OUTPUT
sudo iptables -P OUTPUT ACCEPT
- name: Package binaries
run: |
set -euo pipefail
mkdir -p dist
umask 0022
GZIP=-n tar \
--sort=name \
--mtime='@0' \
--owner=0 \
--group=0 \
--numeric-owner \
-czf dist/shadowmap-${GITHUB_REF_NAME}.tar.gz \
-C target/release shadowmap
(
cd dist
sha256sum shadowmap-${GITHUB_REF_NAME}.tar.gz > shadowmap-${GITHUB_REF_NAME}.sha256
)
- name: Generate SBOM
uses: anchore/sbom-action@e812a0fdf0d83f33cd9ba7f8c4ce3e9e2f8d2c9d
with:
path: target/release/shadowmap
output-file: dist/shadowmap-${GITHUB_REF_NAME}.sbom.json
format: cyclonedx-json
- name: Record manifest outputs
id: manifest
run: |
subjects=$(base64 -w0 dist/shadowmap-${GITHUB_REF_NAME}.sha256)
echo "subjects=${subjects}" >> "$GITHUB_OUTPUT"
echo "artifact_name=shadowmap-${GITHUB_REF_NAME}.tar.gz" >> "$GITHUB_OUTPUT"
echo "checksum_name=shadowmap-${GITHUB_REF_NAME}.sha256" >> "$GITHUB_OUTPUT"
echo "sbom_name=shadowmap-${GITHUB_REF_NAME}.sbom.json" >> "$GITHUB_OUTPUT"
- name: Upload build outputs
uses: actions/upload-artifact@c7d6c3d5c0f8b7b2e07c5e6c5a9a7d1e2b9db4c4
with:
name: primary-build-${{ github.ref_name }}
retention-days: 7
path: |
dist/shadowmap-${GITHUB_REF_NAME}.tar.gz
dist/shadowmap-${GITHUB_REF_NAME}.sha256
dist/shadowmap-${GITHUB_REF_NAME}.sbom.json
reproducibility-build:
name: Independent Rebuild
runs-on: ubuntu-22.04
needs: primary-build
env:
CARGO_TERM_COLOR: always
steps:
- name: Checkout repository
uses: actions/checkout@b4ffde65f46336ab0bcb5c3c07cc53d5af34d2f6
with:
fetch-depth: 0
submodules: true
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1f953844bd68bc033fb4a6a4c9bb6c3eb2edaa0b
with:
toolchain: stable
targets: x86_64-unknown-linux-gnu
- name: Fetch dependencies (locked)
run: cargo fetch --locked
- name: Disable outbound network
run: |
sudo iptables -P OUTPUT DROP
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d ::1 -j ACCEPT
- name: Rebuild release artifact
run: cargo build --locked --release
- name: Re-enable network
if: always()
run: |
sudo iptables -F OUTPUT
sudo iptables -P OUTPUT ACCEPT
- name: Package reproducibility outputs
run: |
set -euo pipefail
mkdir -p dist
umask 0022
GZIP=-n tar \
--sort=name \
--mtime='@0' \
--owner=0 \
--group=0 \
--numeric-owner \
-czf dist/shadowmap-${GITHUB_REF_NAME}.tar.gz \
-C target/release shadowmap
(
cd dist
sha256sum shadowmap-${GITHUB_REF_NAME}.tar.gz > shadowmap-${GITHUB_REF_NAME}.sha256
)
- name: Upload rebuild artifacts
uses: actions/upload-artifact@c7d6c3d5c0f8b7b2e07c5e6c5a9a7d1e2b9db4c4
with:
name: repro-build-${{ github.ref_name }}
retention-days: 7
path: |
dist/shadowmap-${GITHUB_REF_NAME}.tar.gz
dist/shadowmap-${GITHUB_REF_NAME}.sha256
compare-builds:
name: Compare Checksums
runs-on: ubuntu-22.04
needs:
- primary-build
- reproducibility-build
steps:
- name: Download primary artifacts
uses: actions/download-artifact@9bc0dce9d5e9f505d8d5d7b121837f1dc1d7c9f7
with:
name: primary-build-${{ github.ref_name }}
path: primary
- name: Download reproducibility artifacts
uses: actions/download-artifact@9bc0dce9d5e9f505d8d5d7b121837f1dc1d7c9f7
with:
name: repro-build-${{ github.ref_name }}
path: repro
- name: Diff checksum manifests
run: |
diff -u primary/${{ needs.primary-build.outputs.checksum_name }} repro/${{ needs.primary-build.outputs.checksum_name }}
provenance:
name: Generate Provenance
needs:
- primary-build
- compare-builds
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.1
with:
base64-subjects: ${{ needs.primary-build.outputs.subjects }}
provenance-name: ${{ needs.primary-build.outputs.artifact_name }}.intoto.jsonl
upload-assets: true
secrets: inherit
publish:
name: Sign & Publish Release
runs-on: ubuntu-22.04
needs:
- primary-build
- reproducibility-build
- compare-builds
- provenance
permissions:
contents: write
id-token: write
attestations: write
actions: read
steps:
- name: Download primary artifacts
uses: actions/download-artifact@9bc0dce9d5e9f505d8d5d7b121837f1dc1d7c9f7
with:
name: primary-build-${{ github.ref_name }}
path: primary
- name: Download provenance artifact
uses: actions/download-artifact@9bc0dce9d5e9f505d8d5d7b121837f1dc1d7c9f7
with:
name: ${{ needs.provenance.outputs.provenance-name }}
path: provenance
- name: Install cosign
uses: sigstore/cosign-installer@0f3205e552a14c897d44d91bf1a7033ff7d0ad0c
- name: Produce signature bundle
env:
COSIGN_EXPERIMENTAL: "1"
run: |
cosign sign-blob \
--yes \
--bundle provenance/${{ needs.provenance.outputs.provenance-name }}.sig \
provenance/${{ needs.provenance.outputs.provenance-name }}
- name: Upload release bundle artifacts
uses: actions/upload-artifact@c7d6c3d5c0f8b7b2e07c5e6c5a9a7d1e2b9db4c4
with:
name: release-bundle-${{ github.ref_name }}
retention-days: 7
path: |
primary/${{ needs.primary-build.outputs.artifact_name }}
primary/${{ needs.primary-build.outputs.checksum_name }}
primary/${{ needs.primary-build.outputs.sbom_name }}
provenance/${{ needs.provenance.outputs.provenance-name }}
provenance/${{ needs.provenance.outputs.provenance-name }}.sig
- name: Publish GitHub release assets
run: |
gh release upload "${GITHUB_REF_NAME}" \
primary/${{ needs.primary-build.outputs.artifact_name }} \
primary/${{ needs.primary-build.outputs.checksum_name }} \
primary/${{ needs.primary-build.outputs.sbom_name }} \
provenance/${{ needs.provenance.outputs.provenance-name }} \
provenance/${{ needs.provenance.outputs.provenance-name }}.sig
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}