name: Release
on:
push:
tags: ['v*']
workflow_dispatch:
jobs:
build:
permissions:
contents: read
strategy:
matrix:
include:
- os: macos-15
target: aarch64-apple-darwin
- os: macos-15-intel
target: x86_64-apple-darwin
- os: ubuntu-24.04
target: x86_64-unknown-linux-musl
- os: ubuntu-24.04-arm
target: aarch64-unknown-linux-musl
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install musl tools
if: contains(matrix.target, 'linux-musl')
run: sudo apt-get update && sudo apt-get install -y musl-tools
- run: cargo build --release --locked --target ${{ matrix.target }}
- name: Package
shell: bash
run: |
name="agent-sync-${GITHUB_REF_NAME}-${{ matrix.target }}"
mkdir "$name"
cp "target/${{ matrix.target }}/release/agent-sync" README.md LICENSE "$name/"
tar -czf "$name.tar.gz" "$name"
shasum -a 256 "$name.tar.gz" > "$name.tar.gz.sha256"
- uses: actions/upload-artifact@v7
with:
name: agent-sync-${{ matrix.target }}
path: agent-sync-*.tar.gz*
publish:
if: startsWith(github.ref, 'refs/tags/v')
needs: build
runs-on: ubuntu-24.04
permissions:
contents: write
steps:
- uses: actions/download-artifact@v8
with:
pattern: agent-sync-*
merge-multiple: true
- name: Publish GitHub release
env:
GH_TOKEN: ${{ github.token }}
run: >-
gh release create "$GITHUB_REF_NAME" agent-sync-*.tar.gz*
--repo "$GITHUB_REPOSITORY"
--title "$GITHUB_REF_NAME"
--generate-notes
publish-crate:
if: startsWith(github.ref, 'refs/tags/v')
needs: publish
runs-on: ubuntu-24.04
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
- name: Verify tag matches Cargo version
shell: bash
run: |
version="$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')"
test "$GITHUB_REF_NAME" = "v$version"
- name: Authenticate with crates.io
id: crates-io-auth
uses: rust-lang/crates-io-auth-action@v1
- name: Publish crate
run: cargo publish --locked
env:
CARGO_REGISTRY_TOKEN: ${{ steps.crates-io-auth.outputs.token }}