# Gitea Actions : pipeline de release (issue #42). # # Sur chaque tag v* : construit les binaires de toutes les plateformes. # Le job principal 'release' cross-compile Linux + Windows depuis un seul # runner ubuntu-latest, donc il n'a pas besoin de runners Windows/macOS. # Le job 'macos' est optionnel : s'il y a un runner macos-latest, il ajoute # les archives macOS a la release existante ; sinon l'installateur retombe # sur cargo install --git sur macOS. # # Les installateurs one-liner (install.sh / install.ps1) et 'am self-update' # consomment les artefacts attaches a la release. # # Cross-compilation utilisee : # - Linux x86_64 + aarch64 : cargo-zigbuild + musl (binaires statiques) # - Windows x86_64 : mingw-w64 + x86_64-pc-windows-gnu # # Prerequis du runner : pouvoir tirer l'image docker.io (rust:1.94-bookworm, # ~1,2 Go) et le secret GITEA_TOKEN (jeton avec droit 'write:release') # positionne sur le depot. # # Note disque (runner avec espace limite) : # - il faut ~2 Go libres sur / pour tirer l'image (rust:1.94-bookworm) ; # en cas de 'no space left on device' : docker system prune -af --volumes # sur l'HOTE du runner (pas une autre machine !) ; # - les builds compilent dans CARGO_TARGET_DIR=/tmp (hors du volume # workspace) avec l'incremental desactive, donc rien ne persiste ; # - zig (~50 Mo) fournit le linker croise pour Linux. name: release on: push: tags: - "v*" concurrency: group: release-${{ github.ref }} cancel-in-progress: true jobs: release: runs-on: ubuntu-latest container: rust:1.94-bookworm env: CARGO_TARGET_DIR: /tmp/am-target CARGO_INCREMENTAL: "0" steps: # actions/checkout (et son post-step) s'execute via node, absent de # l'image rust:bookworm par defaut : sans nodejs le job echoue des le checkout. - name: Prepare container (node for checkout action) run: apt-get update && apt-get install -y nodejs - uses: actions/checkout@v4 - name: Install build tools (zig + cargo-zigbuild + mingw) run: | apt-get update apt-get install -y build-essential mingw-w64 zip curl rustup target add \ x86_64-unknown-linux-musl \ aarch64-unknown-linux-musl \ x86_64-pc-windows-gnu curl -fsSL https://ziglang.org/download/0.14.1/zig-x86_64-linux-0.14.1.tar.xz -o /tmp/zig.tar.xz tar -xf /tmp/zig.tar.xz -C /opt echo "/opt/zig-x86_64-linux-0.14.1" >> "$GITHUB_PATH" cargo install cargo-zigbuild --locked # Contourne un bug de casse dans certaines crates Windows # (ex. windows-sys peut emettre -lKernel32 au lieu de -lkernel32). # Le linker MinGW sous Linux est sensible a la casse. ln -sf /usr/x86_64-w64-mingw32/lib/libkernel32.a \ /usr/x86_64-w64-mingw32/lib/libKernel32.a - name: Build linux x86_64 + aarch64 (static musl, zig) run: cargo zigbuild --release --locked --target x86_64-unknown-linux-musl --target aarch64-unknown-linux-musl - name: Build windows x86_64 (mingw) run: cargo build --release --locked --target x86_64-pc-windows-gnu - name: Stage archives run: | mkdir -p dist cp "$CARGO_TARGET_DIR/x86_64-unknown-linux-musl/release/am" dist/am-linux-x86_64 cp "$CARGO_TARGET_DIR/aarch64-unknown-linux-musl/release/am" dist/am-linux-aarch64 cp "$CARGO_TARGET_DIR/x86_64-pc-windows-gnu/release/am.exe" dist/am-windows-x86_64.exe cd dist tar -czf am-linux-x86_64.tar.gz am-linux-x86_64 tar -czf am-linux-aarch64.tar.gz am-linux-aarch64 zip -q am-windows-x86_64.zip am-windows-x86_64.exe rm am-windows-x86_64.exe sha256sum am-linux-*.tar.gz am-windows-*.zip > checksums.txt - name: Publish release uses: https://gitea.com/actions/gitea-release-action@v1 with: # L'action splitte 'files' sur les retours a la ligne (pas les # espaces) : un bloc YAML plie en une seule ligne et ne trouve # alors aucun fichier -> 'not include valid file', rien n'upload. files: | dist/am-linux-x86_64.tar.gz dist/am-linux-aarch64.tar.gz dist/am-windows-x86_64.zip dist/checksums.txt GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} release_overwrite: true macos: # Optionnel : ajoute les archives macOS si un runner macos-latest est # disponible. Sinon ce job reste en attente, mais le job release a deja # publie Linux + Windows. needs: release runs-on: macos-latest env: CARGO_TARGET_DIR: /tmp/am-target CARGO_INCREMENTAL: "0" steps: - uses: actions/checkout@v4 - name: Build macos x86_64 + aarch64 run: | rustup target add x86_64-apple-darwin aarch64-apple-darwin cargo build --release --locked --target x86_64-apple-darwin cargo build --release --locked --target aarch64-apple-darwin - name: Stage archives run: | mkdir -p dist cp "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/am" dist/am-macos-x86_64 cp "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/am" dist/am-macos-aarch64 cd dist tar -czf am-macos-x86_64.tar.gz am-macos-x86_64 tar -czf am-macos-aarch64.tar.gz am-macos-aarch64 shasum -a 256 am-macos-*.tar.gz > checksums-macos.txt - name: Publish release uses: https://gitea.com/actions/gitea-release-action@v1 with: files: | dist/am-macos-x86_64.tar.gz dist/am-macos-aarch64.tar.gz dist/checksums-macos.txt GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} # false = ajoute les assets macOS a la release creee par le job # principal, sans ecraser Linux + Windows. release_overwrite: false