-
Notifications
You must be signed in to change notification settings - Fork 0
177 lines (154 loc) · 6.98 KB
/
Copy pathrelease-binaries.yml
File metadata and controls
177 lines (154 loc) · 6.98 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
name: Release Binaries
# Compila gli eseguibili standalone di `sg-attest` (P40) per tutti i target
# Bun supportati e li allega alla GitHub Release del tag, insieme ai checksum
# SHA-256. Nessun segreto nuovo: usa solo il GITHUB_TOKEN automatico.
#
# Perche' due runner: `bun build --compile --windows-icon` (icona ufficiale
# nell'.exe) funziona SOLO compilando su Windows — in cross-compile da Linux
# Bun rifiuta con "Using --windows-icon is only available when compiling on
# Windows". Ma il target windows-arm64 NON si estrae su un host Windows-x64
# ("Failed to extract executable ... aarch64"), mentre si compila bene da Linux.
# Percio':
# - build-linux (ubuntu): i 4 target Unix + windows-arm64 (quest'ultimo senza
# icona: Bun non la applica in cross-compile — la guardia per-piattaforma
# e' in build-binaries.mjs);
# - build-windows (windows-latest): il solo windows-x64, CON icona.
# Un job finale unisce gli artefatti, genera i checksum su tutti e sei e pubblica.
# Nota: windows-arm64 resta senza icona (piattaforma marginale, esegue comunque
# l'.exe x64 in emulazione); windows-x64 — la stragrande maggioranza — ce l'ha.
#
# Trigger:
# - push di un tag v* -> build + pubblica sulla Release del tag
# - workflow_dispatch -> self-test: build + carica come artefatti CI,
# NESSUNA Release pubblicata (per collaudare il workflow prima del tag reale,
# vedi P40-DESIGN-cli-binari-standalone.md § F3)
#
# Coesiste con publish-registry.yml (scatta anch'esso su v*): workflow
# indipendenti sullo stesso tag, nessun conflitto.
on:
push:
tags: ["v*"]
workflow_dispatch:
jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
# I 4 target Unix + windows-arm64: quest'ultimo si compila bene da Linux
# (a differenza dell'host Windows-x64, dove Bun non estrae l'aarch64),
# ma senza icona — la guardia per-piattaforma in build-binaries.mjs non
# aggiunge --windows-icon in cross-compile.
- name: Compila i target compilabili su Linux (4 Unix + windows-arm64)
run: node scripts/build-binaries.mjs --only=bun-linux-x64,bun-linux-arm64,bun-darwin-x64,bun-darwin-arm64,bun-windows-arm64
# La prova che conta davvero (lezione packaged-bins, P39): un binario
# che esiste sul disco non e' la stessa cosa di un binario che funziona.
# Eseguito qui, sul target nativo del runner (linux-x64), perche' e'
# l'unico dei sei compilabile-e-lanciabile sulla stessa macchina CI.
- name: Esegue davvero il binario Linux appena compilato
working-directory: dist
run: |
set -euo pipefail
chmod +x sg-attest-linux-x64
expected="$(node -p "require('${{ github.workspace }}/package.json').version")"
actual="$(./sg-attest-linux-x64 --version)"
echo "expected=${expected} actual=${actual}"
test "${actual}" = "${expected}"
./sg-attest-linux-x64 --help | grep -q "Uso: sg-attest"
./sg-attest-linux-x64 status --json | node -e "
let d = '';
process.stdin.on('data', (c) => (d += c));
process.stdin.on('end', () => {
const s = JSON.parse(d);
if (!s.worker) throw new Error('no worker field in status output');
console.log('status ok:', s.worker);
});
"
- name: Carica i binari Linux/macOS come artefatto intermedio
uses: actions/upload-artifact@v4
with:
name: bins-linux
path: dist/
retention-days: 1
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
# Su Windows --windows-icon si applica: l'.exe x64 esce con l'icona
# ufficiale del servizio (assets/sg-attest.ico), scelta in build-binaries.mjs.
# Solo x64: windows-arm64 non si estrae su questo host (vedi build-linux).
- name: Compila il target Windows x64 (con icona)
run: node scripts/build-binaries.mjs --only=bun-windows-x64
# Self-test a runtime del binario nativo del runner (windows-x64): come
# per il Linux sopra, provare che esegue davvero, non solo che esiste.
- name: Esegue davvero il binario Windows appena compilato
working-directory: dist
shell: bash
run: |
set -euo pipefail
expected="$(node -p "require('../package.json').version")"
actual="$(./sg-attest-windows-x64.exe --version)"
echo "expected=${expected} actual=${actual}"
test "${actual}" = "${expected}"
./sg-attest-windows-x64.exe --help | grep -q "Uso: sg-attest"
./sg-attest-windows-x64.exe status --json | node -e "
let d = '';
process.stdin.on('data', (c) => (d += c));
process.stdin.on('end', () => {
const s = JSON.parse(d);
if (!s.worker) throw new Error('no worker field in status output');
console.log('status ok:', s.worker);
});
"
- name: Carica i binari Windows come artefatto intermedio
uses: actions/upload-artifact@v4
with:
name: bins-windows
path: dist/
retention-days: 1
release:
needs: [build-linux, build-windows]
runs-on: ubuntu-latest
permissions:
contents: write # richiesto per creare/aggiornare la Release del tag
id-token: write # OIDC per la firma dell'attestazione di provenienza (A1)
attestations: write # scrittura dell'attestazione di build provenance (A1)
steps:
- name: Scarica i binari Linux/macOS
uses: actions/download-artifact@v4
with:
name: bins-linux
path: dist
- name: Scarica i binari Windows
uses: actions/download-artifact@v4
with:
name: bins-windows
path: dist
# Attesta i sei binari esatti che verranno pubblicati, PRIMA di generare
# SHA256SUMS.txt: cosi' il glob dist/* non include mai il checksum file
# (e' un derivato, attestarlo non aggiungerebbe nulla — vedi A1-DESIGN).
- name: Attesta la provenienza dei binari
uses: actions/attest-build-provenance@v4
with:
subject-path: 'dist/*'
- name: Genera i checksum SHA-256 (su tutti e sei)
working-directory: dist
run: sha256sum * > SHA256SUMS.txt
- name: Carica come artefatti CI (self-test via workflow_dispatch)
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@v4
with:
name: sg-attest-binaries
path: dist/
retention-days: 7
- name: Pubblica sulla GitHub Release del tag
if: startsWith(github.ref, 'refs/tags/v')
uses: softprops/action-gh-release@v2
with:
files: dist/*
draft: false # senza, softprops/action-gh-release crea una bozza non pubblica (scoperto al primo tag reale, v0.4.0)