name: release
on:
push:
tags: ["v*"]
workflow_dispatch:
inputs:
tag:
description: Existing version tag to rebuild and release
required: true
type: string
permissions:
contents: read
id-token: write
env:
RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
ref: ${{ env.RELEASE_TAG }}
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- name: The tag must name the version in Cargo.toml
run: |
version=$(grep -m1 '^version' Cargo.toml | sed -E 's/.*"([^"]+)".*/\1/')
[ "$RELEASE_TAG" = "v$version" ] || { echo "tag $RELEASE_TAG does not match Cargo.toml version $version"; exit 1; }
- run: cargo test --locked
publish:
needs: [test, build]
if: github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
ref: ${{ env.RELEASE_TAG }}
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- uses: rust-lang/crates-io-auth-action@v1
id: auth
- run: cargo publish --locked
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
build:
needs: test
name: Build ${{ matrix.target }}
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
- os: macos-14
target: x86_64-apple-darwin
- os: macos-14
target: aarch64-apple-darwin
steps:
- uses: actions/checkout@v7
with:
ref: ${{ env.RELEASE_TAG }}
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
targets: ${{ matrix.target }}
- uses: taiki-e/install-action@v2
if: contains(matrix.target, '-unknown-linux-musl')
with:
tool: cross
- name: Install the aarch64 strip tool
if: matrix.target == 'aarch64-unknown-linux-musl'
run: sudo apt-get update && sudo apt-get install -y binutils-aarch64-linux-gnu
- name: Build the release binary with cross
if: contains(matrix.target, '-unknown-linux-musl')
run: cross build --locked --release --target "${{ matrix.target }}"
- name: Build the release binary
if: contains(matrix.target, '-apple-darwin')
run: cargo build --locked --release --target "${{ matrix.target }}"
- name: Strip and package the binary
shell: bash
run: |
target="${{ matrix.target }}"
binary="target/$target/release/agentswap"
if [ "$target" = "aarch64-unknown-linux-musl" ]; then
aarch64-linux-gnu-strip "$binary"
else
strip "$binary"
fi
asset="agentswap-v${RELEASE_TAG#v}-$target.tar.gz"
staging=$(mktemp -d)
cp "$binary" "$staging/agentswap"
tar -C "$staging" -czf "$asset" agentswap
if command -v sha256sum >/dev/null 2>&1; then
sha256sum "$asset" > "$asset.sha256"
else
shasum -a 256 "$asset" > "$asset.sha256"
fi
- uses: actions/upload-artifact@v7
with:
name: release-${{ matrix.target }}
path: |
agentswap-*.tar.gz
agentswap-*.tar.gz.sha256
if-no-files-found: error
release:
needs: build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v8
with:
path: dist
pattern: release-*
merge-multiple: true
- name: Create or update the GitHub Release
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: |
cd dist
cat agentswap-*.tar.gz.sha256 | sort > SHA256SUMS
if gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
gh release upload "$RELEASE_TAG" agentswap-*.tar.gz SHA256SUMS --clobber
else
gh release create "$RELEASE_TAG" agentswap-*.tar.gz SHA256SUMS --title "$RELEASE_TAG" --generate-notes
fi