name: Release
on:
push:
tags:
- 'v*.*.*'
permissions:
contents: write
jobs:
build:
name: Build ${{ matrix.binary_name }}
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-latest
target: x86_64-unknown-linux-musl
binary_name: serbero-linux-x86_64
apt_packages: ''
build_cmd: cargo zigbuild
strip_cmd: strip
- runner: ubuntu-latest
target: aarch64-unknown-linux-musl
binary_name: serbero-linux-arm64
apt_packages: binutils-aarch64-linux-gnu
build_cmd: cargo zigbuild
strip_cmd: aarch64-linux-gnu-strip
- runner: macos-latest
target: x86_64-apple-darwin
binary_name: serbero-macos-x86_64
apt_packages: ''
build_cmd: cargo build
strip_cmd: strip
- runner: macos-latest
target: aarch64-apple-darwin
binary_name: serbero-macos-arm64
apt_packages: ''
build_cmd: cargo build
strip_cmd: strip
- runner: windows-latest
target: x86_64-pc-windows-msvc
binary_name: serbero-windows-x86_64.exe
apt_packages: ''
build_cmd: cargo build
strip_cmd: ''
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust (stable)
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install Linux strip toolchain
if: runner.os == 'Linux' && matrix.apt_packages != ''
run: |
sudo apt-get update
sudo apt-get install -y ${{ matrix.apt_packages }}
- name: Setup Zig (for cargo-zigbuild)
if: runner.os == 'Linux'
uses: mlugg/setup-zig@v1
with:
version: 0.13.0
- name: Install cargo-zigbuild
if: runner.os == 'Linux'
uses: taiki-e/install-action@v2
with:
tool: cargo-zigbuild
- name: Cache cargo registry and target/
uses: Swatinem/rust-cache@v2
with:
key: release-${{ matrix.target }}
- name: Build release binary
shell: bash
run: ${{ matrix.build_cmd }} --release --target ${{ matrix.target }}
- name: Stage binary (Linux/macOS)
if: runner.os != 'Windows'
shell: bash
run: |
bin="target/${{ matrix.target }}/release/serbero"
"${{ matrix.strip_cmd }}" "$bin"
mkdir -p dist
cp "$bin" "dist/${{ matrix.binary_name }}"
- name: Stage binary (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
$bin = "target/${{ matrix.target }}/release/serbero.exe"
New-Item -ItemType Directory -Force -Path dist | Out-Null
Copy-Item $bin "dist/${{ matrix.binary_name }}"
- name: Upload binary artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.binary_name }}
path: dist/${{ matrix.binary_name }}
if-no-files-found: error
release:
name: Publish GitHub Release
needs: build
runs-on: ubuntu-latest
steps:
- name: Download all binary artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true
- name: List downloaded artifacts
run: ls -la artifacts
- name: Generate checksums.sha256
working-directory: artifacts
run: |
# Only hash the staged binaries. Restricting the glob to
# `serbero-*` avoids self-inclusion of the output file and
# survives any future non-binary artifact that happens to
# land in this directory.
sha256sum serbero-* > checksums.sha256
echo "--- checksums.sha256 ---"
cat checksums.sha256
- name: Determine prerelease flag from tag
id: prerelease
shell: bash
run: |
tag="${GITHUB_REF#refs/tags/}"
if [[ "$tag" == *-rc* || "$tag" == *-beta* ]]; then
echo "flag=true" >> "$GITHUB_OUTPUT"
else
echo "flag=false" >> "$GITHUB_OUTPUT"
fi
- name: Publish release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: Serbero ${{ github.ref_name }}
body: |
Pre-built binaries for all platforms. See [README](https://github.com/MostroP2P/serbero#quickstart) for setup instructions.
draft: false
prerelease: ${{ steps.prerelease.outputs.flag }}
files: |
artifacts/serbero-*
artifacts/checksums.sha256
fail_on_unmatched_files: true