name: release
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
release_version:
description: "Release version (e.g. v1.2.3)"
required: true
create_release:
description: "Create GitHub Release"
required: true
default: "true"
upload_artifacts:
description: "Upload build artifacts"
required: true
default: "true"
env:
BIN_NAME: sendmer
IROH_FORCE_STAGING_RELAYS: "1"
jobs:
quality-gate:
name: Release Quality Gate
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cargo fmt
run: cargo fmt --all -- --check
- name: Cargo clippy
run: cargo clippy --locked --workspace --all-targets --all-features -- -D warnings
- name: Cargo test
run: cargo test --locked --workspace --all-features --bins --tests --examples
create-release:
name: Create GitHub Release
needs: quality-gate
runs-on: ubuntu-latest
outputs:
release_version: ${{ steps.version.outputs.version }}
steps:
- name: Determine release version
id: version
shell: bash
run: |
if [ "${GITHUB_EVENT_NAME}" = "push" ]; then
VERSION="${GITHUB_REF#refs/tags/}"
else
VERSION="${{ github.event.inputs.release_version }}"
fi
if [ -z "$VERSION" ]; then
echo "Release version is empty"
exit 1
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Release version: $VERSION"
- name: Checkout repository
uses: actions/checkout@v4
- name: Create GitHub release
if: github.event_name == 'push' || github.event.inputs.create_release == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release create "${{ steps.version.outputs.version }}" \
--title "${{ steps.version.outputs.version }}" \
--generate-notes
build-release:
name: Build Release Binaries
needs: create-release
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
use_cross: true
- os: macos-latest
target: x86_64-apple-darwin
- os: macos-latest
target: aarch64-apple-darwin
- os: windows-latest
target: x86_64-pc-windows-msvc
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install cross (Linux ARM64)
if: matrix.use_cross == true
run: cargo install cross
- name: Install musl tools
if: runner.os == 'Linux' && contains(matrix.target, 'musl') && matrix.use_cross != true
run: sudo apt-get update && sudo apt-get install -y musl-tools
- name: Build binary
shell: bash
run: |
if [ "${{ matrix.use_cross }}" = "true" ]; then
cross build --release --target ${{ matrix.target }}
else
cargo build --release --target ${{ matrix.target }}
fi
- name: Package artifact
id: package
shell: bash
run: |
VERSION="${{ needs.create-release.outputs.release_version }}"
NAME="${{ env.BIN_NAME }}-${VERSION}-${{ matrix.target }}"
mkdir "$NAME"
if [ "${{ runner.os }}" = "Windows" ]; then
cp "target/${{ matrix.target }}/release/${{ env.BIN_NAME }}.exe" "$NAME/"
powershell Compress-Archive "$NAME/*" "$NAME.zip"
echo "asset=$NAME.zip" >> "$GITHUB_OUTPUT"
else
cp "target/${{ matrix.target }}/release/${{ env.BIN_NAME }}" "$NAME/"
tar czf "$NAME.tar.gz" -C "$NAME" .
echo "asset=$NAME.tar.gz" >> "$GITHUB_OUTPUT"
fi
- name: Upload release asset
if: github.event_name == 'push' || github.event.inputs.upload_artifacts == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: |
gh release upload "${{ needs.create-release.outputs.release_version }}" "${{ steps.package.outputs.asset }}" --clobber