52
52
echo "describe=$(git describe --tags --match 'v*.*.*' --always)" >> $GITHUB_OUTPUT
53
53
echo "timestamp=$(git log -1 --format=%ct)" >> $GITHUB_OUTPUT
54
54
55
+ build-assets :
56
+ name : Build assets
57
+ runs-on : ubuntu-22.04
58
+
59
+ permissions :
60
+ contents : read
61
+
62
+ steps :
63
+ - name : Checkout the code
64
+
65
+
66
+ - name : Setup OPA
67
+ uses :
open-policy-agent/[email protected]
68
+ with :
69
+ version : 0.64.1
70
+
71
+ - name : Install frontend Node
72
+
73
+ with :
74
+ node-version : 20
75
+
76
+ - name : Install frontend Node dependencies
77
+ working-directory : ./frontend
78
+ run : npm ci
79
+
80
+ - name : Build frontend
81
+ working-directory : ./frontend
82
+ run : npm run build
83
+
84
+ - name : Build policies
85
+ working-directory : ./policies
86
+ run : make
87
+
88
+ - name : Prepare assets artifact
89
+ run : |
90
+ mkdir -p assets-dist/share
91
+ cp policies/policy.wasm assets-dist/share/policy.wasm
92
+ cp frontend/dist/manifest.json assets-dist/share/manifest.json
93
+ cp -r frontend/dist/ assets-dist/share/assets
94
+ cp -r templates/ assets-dist/share/templates
95
+ cp -r translations/ assets-dist/share/translations
96
+ cp LICENSE assets-dist/LICENSE
97
+ chmod -R u=rwX,go=rX assets-dist/
98
+
99
+ - name : Upload assets
100
+
101
+ with :
102
+ name : assets
103
+ path : assets-dist
55
104
56
105
build-binaries :
57
106
name : Build binaries
@@ -60,6 +109,12 @@ jobs:
60
109
needs :
61
110
- compute-version
62
111
112
+ strategy :
113
+ matrix :
114
+ include :
115
+ - target : x86_64-unknown-linux-gnu
116
+ - target : aarch64-unknown-linux-gnu
117
+
63
118
env :
64
119
VERGEN_GIT_DESCRIBE : ${{ needs.compute-version.outputs.describe }}
65
120
SOURCE_DATE_EPOCH : ${{ needs.compute-version.outputs.timestamp }}
@@ -71,17 +126,11 @@ jobs:
71
126
- name : Checkout the code
72
127
73
128
74
- - name : Setup OPA
75
- uses :
open-policy-agent/[email protected]
76
- with :
77
- version : 0.64.1
78
-
79
129
- name : Install Rust toolchain
80
130
uses : dtolnay/rust-toolchain@stable
81
131
with :
82
132
targets : |
83
- x86_64-unknown-linux-gnu
84
- aarch64-unknown-linux-gnu
133
+ ${{ matrix.target }}
85
134
86
135
- name : Setup sccache
87
136
uses :
mozilla-actions/[email protected]
@@ -96,52 +145,60 @@ jobs:
96
145
with :
97
146
tool : cargo-zigbuild
98
147
99
- - name : Install frontend Node
100
-
101
- with :
102
- node-version : 20
103
-
104
- - name : Install frontend Node dependencies
105
- working-directory : ./frontend
106
- run : npm ci
107
-
108
- - name : Build frontend
109
- working-directory : ./frontend
110
- run : npm run build
111
-
112
- - name : Build policies
113
- working-directory : ./policies
114
- run : make
115
-
116
148
- name : Build the binary
117
149
run : |
118
150
cargo zigbuild \
119
151
--release \
120
- --target x86_64-unknown-linux-gnu.2.17 \
121
- --target aarch64-unknown-linux-gnu.2.17 \
152
+ --target ${{ matrix.target }}.2.17 \
122
153
--no-default-features \
123
154
--features dist \
124
155
-p mas-cli
125
156
126
- - name : Create one archive per architecture
157
+ - name : Upload binary artifact
158
+
159
+ with :
160
+ name : binary-${{ matrix.target }}
161
+ path : target/${{ matrix.target }}/release/mas-cli
162
+
163
+ assemble-archives :
164
+ name : Assemble release archives
165
+ runs-on : ubuntu-22.04
166
+
167
+ needs :
168
+ - build-assets
169
+ - build-binaries
170
+
171
+ permissions :
172
+ contents : read
173
+
174
+ steps :
175
+ - name : Download assets
176
+
177
+ with :
178
+ name : assets
179
+ path : assets-dist
180
+
181
+ - name : Download binary x86_64
182
+
183
+ with :
184
+ name : binary-x86_64-unknown-linux-gnu
185
+ path : binary-x86_64
186
+
187
+ - name : Download binary aarch64
188
+
189
+ with :
190
+ name : binary-aarch64-unknown-linux-gnu
191
+ path : binary-aarch64
192
+
193
+ - name : Create final archives
127
194
run : |
128
195
for arch in x86_64 aarch64; do
129
- # Create one directory per architecture
130
- mkdir -p dist/${arch}/share/
131
- # Copy the artifacts to the right place
132
- cp policies/policy.wasm dist/${arch}/share/policy.wasm
133
- cp frontend/dist/manifest.json dist/${arch}/share/manifest.json
134
- cp -r frontend/dist/ dist/${arch}/share/assets
135
- cp -r templates/ dist/${arch}/share/templates
136
- cp -r translations/ dist/${arch}/share/translations
137
- cp LICENSE dist/${arch}/LICENSE
196
+ mkdir -p dist/${arch}/share
197
+ cp -r assets-dist/share/* dist/${arch}/share/
198
+ cp assets-dist/LICENSE dist/${arch}/LICENSE
199
+ cp binary-$arch/mas-cli dist/${arch}/mas-cli
138
200
chmod -R u=rwX,go=rX dist/${arch}/
139
-
140
- # Copy the binary to the right place
141
- cp target/${arch}-unknown-linux-gnu/release/mas-cli dist/${arch}/
142
201
chmod u=rwx,go=rx dist/${arch}/mas-cli
143
-
144
- # Create the archive
145
202
tar -czvf mas-cli-${arch}-linux.tar.gz --owner=0 --group=0 -C dist/${arch}/ .
146
203
done
147
204
@@ -257,209 +314,3 @@ jobs:
257
314
if : github.event_name != 'pull_request'
258
315
with :
259
316
files : |
260
- ./docker-bake.hcl
261
- cwd://${{ steps.meta.outputs.bake-file }}
262
- cwd://${{ steps.meta-debug.outputs.bake-file }}
263
- cwd://${{ steps.meta-syn2mas.outputs.bake-file }}
264
- set : |
265
- base.output=type=image,push=true
266
- base.cache-from=type=registry,ref=${{ env.BUILDCACHE }}:buildcache
267
- base.cache-to=type=registry,ref=${{ env.BUILDCACHE }}:buildcache,mode=max
268
-
269
- - name : Transform bake output
270
- # This transforms the ouput to an object which looks like this:
271
- # { reguar: { digest: "…", tags: ["…", "…"] }, debug: { digest: "…", tags: ["…"] }, … }
272
- id : output
273
- if : github.event_name != 'pull_request'
274
- run : |
275
- echo 'metadata<<EOF' >> $GITHUB_OUTPUT
276
- echo '${{ steps.bake.outputs.metadata }}' | jq -c 'with_entries(select(.value | (type == "object" and has("containerimage.digest")))) | map_values({ digest: .["containerimage.digest"], tags: (.["image.name"] | split(",")) })' >> $GITHUB_OUTPUT
277
- echo 'EOF' >> $GITHUB_OUTPUT
278
-
279
- - name : Sign the images with GitHub Actions provided token
280
- # Only sign on tags and on commits on main branch
281
- if : |
282
- github.event_name != 'pull_request'
283
- && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
284
-
285
- env :
286
- REGULAR_DIGEST : ${{ steps.output.outputs.metadata && fromJSON(steps.output.outputs.metadata).regular.digest }}
287
- DEBUG_DIGEST : ${{ steps.output.outputs.metadata && fromJSON(steps.output.outputs.metadata).debug.digest }}
288
- SYN2MAS_DIGEST : ${{ steps.output.outputs.metadata && fromJSON(steps.output.outputs.metadata).syn2mas.digest }}
289
-
290
- run : |-
291
- cosign sign --yes \
292
- "$IMAGE@$REGULAR_DIGEST" \
293
- "$IMAGE@$DEBUG_DIGEST" \
294
- "$IMAGE_SYN2MAS@$SYN2MAS_DIGEST"
295
-
296
- syn2mas :
297
- name : Release syn2mas on NPM
298
- runs-on : ubuntu-latest
299
-
300
- permissions :
301
- contents : read
302
- id-token : write
303
-
304
- steps :
305
- - name : Checkout the code
306
-
307
-
308
- - name : Install Node
309
-
310
- with :
311
- node-version-file : ./tools/syn2mas/.nvmrc
312
-
313
- - name : Install Node dependencies
314
- working-directory : ./tools/syn2mas
315
- run : npm ci
316
-
317
- - name : Publish
318
- uses : JS-DevTools/npm-publish@v3
319
- with :
320
- package : ./tools/syn2mas
321
- token : ${{ secrets.NPM_TOKEN }}
322
- provenance : true
323
- dry-run : ${{ !startsWith(github.ref, 'refs/tags/') }}
324
-
325
- release :
326
- name : Release
327
- if : startsWith(github.ref, 'refs/tags/')
328
- runs-on : ubuntu-latest
329
- needs :
330
- - build-binaries
331
- - build-image
332
- - syn2mas
333
- steps :
334
- - name : Download the artifacts from the previous job
335
- uses : actions/download-artifact@v4
336
- with :
337
- name : binaries
338
- path : artifacts
339
-
340
- - name : Prepare a release
341
- uses : softprops/action-gh-release@v2
342
- with :
343
- generate_release_notes : true
344
- body : |
345
- ### Docker image
346
-
347
- Regular image:
348
-
349
- - Digest:
350
- ```
351
- ${{ env.IMAGE }}@${{ fromJSON(needs.build-image.outputs.metadata).regular.digest }}
352
- ```
353
- - Tags:
354
- ```
355
- ${{ join(fromJSON(needs.build-image.outputs.metadata).regular.tags, '
356
- ') }}
357
- ```
358
-
359
- Debug variant:
360
-
361
- - Digest:
362
- ```
363
- ${{ env.IMAGE }}@${{ fromJSON(needs.build-image.outputs.metadata).debug.digest }}
364
- ```
365
- - Tags:
366
- ```
367
- ${{ join(fromJSON(needs.build-image.outputs.metadata).debug.tags, '
368
- ') }}
369
- ```
370
-
371
- `syn2mas` migration tool:
372
-
373
- - Digest:
374
- ```
375
- ${{ env.IMAGE_SYN2MAS }}@${{ fromJSON(needs.build-image.outputs.metadata).syn2mas.digest }}
376
- ```
377
- - Tags:
378
- ```
379
- ${{ join(fromJSON(needs.build-image.outputs.metadata).syn2mas.tags, '
380
- ') }}
381
- ```
382
-
383
- files : |
384
- artifacts/mas-cli-aarch64-linux.tar.gz
385
- artifacts/mas-cli-x86_64-linux.tar.gz
386
- draft : true
387
-
388
- unstable :
389
- name : Update the unstable release
390
- runs-on : ubuntu-24.04
391
- needs :
392
- - build-binaries
393
- - build-image
394
- if : github.ref == 'refs/heads/main'
395
-
396
- permissions :
397
- contents : write
398
-
399
- steps :
400
- - name : Download the artifacts from the previous job
401
- uses : actions/download-artifact@v4
402
- with :
403
- name : binaries
404
- path : artifacts
405
-
406
- - name : Update unstable git tag
407
-
408
- with :
409
- script : |
410
- const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
411
- const sha = process.env.GITHUB_SHA;
412
-
413
- const tag = await github.rest.git.updateRef({
414
- owner,
415
- repo,
416
- force: true,
417
- ref: 'tags/unstable',
418
- sha,
419
- });
420
- console.log("Updated tag ref:", tag.data.url);
421
-
422
- - name : Update unstable release
423
- uses : softprops/action-gh-release@v2
424
- with :
425
- name : ' Unstable build'
426
- tag_name : unstable
427
- body : |
428
- This is an automatically updated unstable release containing the latest builds from the main branch.
429
-
430
- **⚠️ Warning: These are development builds and may be unstable.**
431
-
432
- Last updated: ${{ github.event.head_commit.timestamp }}
433
- Commit: ${{ github.sha }}
434
-
435
- ### Docker image
436
-
437
- Regular image:
438
-
439
- - Digest:
440
- ```
441
- ${{ env.IMAGE }}@${{ fromJSON(needs.build-image.outputs.metadata).regular.digest }}
442
- ```
443
- - Tags:
444
- ```
445
- ${{ join(fromJSON(needs.build-image.outputs.metadata).regular.tags, '
446
- ') }}
447
- ```
448
-
449
- Debug variant:
450
-
451
- - Digest:
452
- ```
453
- ${{ env.IMAGE }}@${{ fromJSON(needs.build-image.outputs.metadata).debug.digest }}
454
- ```
455
- - Tags:
456
- ```
457
- ${{ join(fromJSON(needs.build-image.outputs.metadata).debug.tags, '
458
- ') }}
459
- ```
460
-
461
- files : |
462
- artifacts/mas-cli-aarch64-linux.tar.gz
463
- artifacts/mas-cli-x86_64-linux.tar.gz
464
- prerelease : true
465
- make_latest : false
0 commit comments