name: Release
on:
push:
tags:
- 'v*'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: write
actions: write
jobs:
verify-version:
name: Verify Tag & Cargo.toml Version Match
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
- name: Verify Git Tag matches Cargo.toml
if: startsWith(github.ref, 'refs/tags/v')
run: |
CARGO_VER=$(cargo metadata --no-deps --format-version 1 | grep -o '"version":"[^"]*"' | head -1 | cut -d'"' -f4)
TAG_VER="${GITHUB_REF_NAME#v}"
if [ "$CARGO_VER" != "$TAG_VER" ]; then
echo "::error::Tag version ($TAG_VER) does not match Cargo.toml version ($CARGO_VER)!"
exit 1
fi
echo "Verified: Git tag ($TAG_VER) matches Cargo.toml version ($CARGO_VER)"
build-release:
name: Build release (${{ matrix.target }})
needs: verify-version
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-apple-darwin
os: macos-latest
archive: tar.gz
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
archive: tar.gz
- target: x86_64-pc-windows-msvc
os: windows-latest
archive: zip
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Set up sccache
uses: mozilla/sccache-action@v0.0.8
- name: Configure sccache
shell: bash
run: |
echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV
- name: Rust Cache
uses: Swatinem/rust-cache@v2
with:
targets: ${{ matrix.target }}
- name: Install Linux build dependencies
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y pkg-config libssl-dev build-essential cmake
- name: Build release binary
run: cargo build --release --target ${{ matrix.target }}
- name: Show sccache stats
if: always()
run: sccache --show-stats
- name: Package asset (Unix)
if: matrix.archive == 'tar.gz'
run: |
CARGO_VER=$(cargo metadata --no-deps --format-version 1 | grep -o '"version":"[^"]*"' | head -1 | cut -d'"' -f4)
VERSION="${GITHUB_REF_NAME:-v${CARGO_VER}}"
ARCHIVE_VERSION="srz-${VERSION}-${{ matrix.target }}.tar.gz"
ARCHIVE_LATEST="srz-${{ matrix.target }}.tar.gz"
cd target/${{ matrix.target }}/release
tar -czf "../../../${ARCHIVE_VERSION}" srz
cp "../../../${ARCHIVE_VERSION}" "../../../${ARCHIVE_LATEST}"
cd ../../..
shasum -a 256 "${ARCHIVE_VERSION}" > "${ARCHIVE_VERSION}.sha256" 2>/dev/null || sha256sum "${ARCHIVE_VERSION}" > "${ARCHIVE_VERSION}.sha256"
shasum -a 256 "${ARCHIVE_LATEST}" > "${ARCHIVE_LATEST}.sha256" 2>/dev/null || sha256sum "${ARCHIVE_LATEST}" > "${ARCHIVE_LATEST}.sha256"
- name: Package asset (Windows)
if: matrix.archive == 'zip'
shell: bash
run: |
CARGO_VER=$(cargo metadata --no-deps --format-version 1 | grep -o '"version":"[^"]*"' | head -1 | cut -d'"' -f4)
VERSION="${GITHUB_REF_NAME:-v${CARGO_VER}}"
ARCHIVE_VERSION="srz-${VERSION}-${{ matrix.target }}.zip"
ARCHIVE_LATEST="srz-${{ matrix.target }}.zip"
cd target/${{ matrix.target }}/release
7z a "../../../${ARCHIVE_VERSION}" srz.exe
cp "../../../${ARCHIVE_VERSION}" "../../../${ARCHIVE_LATEST}"
cd ../../..
shasum -a 256 "${ARCHIVE_VERSION}" > "${ARCHIVE_VERSION}.sha256" 2>/dev/null || sha256sum "${ARCHIVE_VERSION}" > "${ARCHIVE_VERSION}.sha256"
shasum -a 256 "${ARCHIVE_LATEST}" > "${ARCHIVE_LATEST}.sha256" 2>/dev/null || sha256sum "${ARCHIVE_LATEST}" > "${ARCHIVE_LATEST}.sha256"
- name: Upload Release Assets
uses: softprops/action-gh-release@v2
with:
files: |
srz-*.tar.gz
srz-*.zip
srz-*.sha256
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-crates-io:
name: Publish to Crates.io
needs: verify-version
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
- name: Set up sccache
uses: mozilla/sccache-action@v0.0.8
- name: Configure sccache
shell: bash
run: |
echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV
- name: Rust Cache
uses: Swatinem/rust-cache@v2
- name: Install Linux build dependencies
run: |
sudo apt-get update
sudo apt-get install -y pkg-config libssl-dev build-essential cmake
- name: Publish to Crates.io
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
env:
CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
- name: Show sccache stats
if: always()
run: sccache --show-stats
bump-homebrew:
name: Bump Homebrew Formula
needs: build-release
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- name: Check if HOMEBREW_TAP_TOKEN is configured
id: check-token
run: |
if [ -z "${{ secrets.HOMEBREW_TAP_TOKEN }}" ]; then
echo "skip=true" >> $GITHUB_OUTPUT
echo "::warning::HOMEBREW_TAP_TOKEN secret is not set. Skipping Homebrew formula bump."
else
echo "skip=false" >> $GITHUB_OUTPUT
fi
- name: Update Homebrew formula in tap
if: steps.check-token.outputs.skip != 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
run: |
VERSION="${GITHUB_REF_NAME#v}"
echo "Updating Homebrew tap for srz v${VERSION} (${GITHUB_REF_NAME})..."
# Wait / retry downloading release assets in case GitHub API has a replication delay
DOWNLOAD_OK=false
for i in {1..6}; do
if gh release download "${GITHUB_REF_NAME}" \
--repo "${GITHUB_REPOSITORY}" \
--pattern "srz-${GITHUB_REF_NAME}-aarch64-apple-darwin.tar.gz" \
--pattern "srz-${GITHUB_REF_NAME}-x86_64-unknown-linux-gnu.tar.gz"; then
DOWNLOAD_OK=true
break
fi
echo "Release assets not yet ready, waiting 5 seconds (attempt $i/6)..."
sleep 5
done
if [ "$DOWNLOAD_OK" != "true" ]; then
echo "::error::Could not download release archives for sha256 calculation."
exit 1
fi
SHA_ARM64=$(sha256sum "srz-${GITHUB_REF_NAME}-aarch64-apple-darwin.tar.gz" | awk '{print $1}')
SHA_LINUX=$(sha256sum "srz-${GITHUB_REF_NAME}-x86_64-unknown-linux-gnu.tar.gz" | awk '{print $1}')
echo "macOS aarch64 SHA256: ${SHA_ARM64}"
echo "Linux x86_64 SHA256: ${SHA_LINUX}"
# Clone tap repository (automatically checks out default branch: main or master)
git clone "https://x-access-token:${TAP_TOKEN}@github.com/NewGuy012/homebrew-tap.git" tap
cd tap
mkdir -p Formula
printf 'class Srz < Formula\n desc "Fast, modular CLI to summarize webpages, documents, books, and live news using local LLMs"\n homepage "https://github.com/NewGuy012/srz"\n version "%s"\n\n on_macos do\n on_arm do\n url "https://github.com/NewGuy012/srz/releases/download/v#{version}/srz-v#{version}-aarch64-apple-darwin.tar.gz"\n sha256 "%s"\n end\n end\n\n on_linux do\n url "https://github.com/NewGuy012/srz/releases/download/v#{version}/srz-v#{version}-x86_64-unknown-linux-gnu.tar.gz"\n sha256 "%s"\n end\n\n def install\n bin.install "srz"\n end\n\n test do\n assert_match "srz", shell_output("#{bin}/srz --version")\n end\nend\n' "$VERSION" "$SHA_ARM64" "$SHA_LINUX" > Formula/srz.rb
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
TARGET_BRANCH=$(git branch --show-current)
if [ -z "$TARGET_BRANCH" ]; then
TARGET_BRANCH="main"
git checkout -b main
fi
git add Formula/srz.rb
if git diff --staged --quiet; then
echo "Formula already up-to-date. No changes to commit."
else
git commit -m "Update srz formula to v${VERSION}"
git push origin "$TARGET_BRANCH"
echo "Successfully updated Formula/srz.rb to v${VERSION} on branch ${TARGET_BRANCH}!"
fi