name: Release
on:
push:
tags:
- 'v[0-9]*'
jobs:
build-linux:
name: Linux ${{ matrix.deb_arch }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-unknown-linux-gnu
deb_arch: amd64
- target: aarch64-unknown-linux-gnu
deb_arch: arm64
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.target }}
- name: Install cross
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Install cargo-deb
if: matrix.target == 'x86_64-unknown-linux-gnu'
run: cargo install cargo-deb
- name: Build binary
run: cross build --release --target ${{ matrix.target }}
- name: Stage binary and deb
env:
TARGET: ${{ matrix.target }}
DEB_ARCH: ${{ matrix.deb_arch }}
VERSION: ${{ github.ref_name }}
run: |
VER="${VERSION#v}"
mkdir -p dist
cp "target/${TARGET}/release/st" "dist/st-${VER}-linux-${DEB_ARCH}"
if [ "${TARGET}" = "x86_64-unknown-linux-gnu" ]; then
cargo deb --no-build --target "${TARGET}" \
--output "dist/syntext_${VER}_${DEB_ARCH}.deb"
fi
- uses: actions/upload-artifact@v7
with:
name: linux-${{ matrix.deb_arch }}
path: dist/
build-macos:
name: macOS ${{ matrix.suffix }}
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-apple-darwin
runner: macos-14
suffix: macos-arm64
- target: x86_64-apple-darwin
runner: macos-15-intel
suffix: macos-x86_64
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.target }}
- name: Build binary
run: cargo build --release --target ${{ matrix.target }}
- name: Stage binary
env:
TARGET: ${{ matrix.target }}
SUFFIX: ${{ matrix.suffix }}
VERSION: ${{ github.ref_name }}
run: |
VER="${VERSION#v}"
mkdir -p dist
cp "target/${TARGET}/release/st" "dist/st-${VER}-${SUFFIX}"
# zip for Homebrew cask; archive must contain a file named "st" so brew links it correctly
cp "target/${TARGET}/release/st" dist/st
cd dist && zip "st-${VER}-${SUFFIX}.zip" st && rm st
- uses: actions/upload-artifact@v7
with:
name: ${{ matrix.suffix }}
path: dist/
build-windows:
name: Windows amd64
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-pc-windows-msvc
- uses: Swatinem/rust-cache@v2
with:
key: x86_64-pc-windows-msvc
- name: Build binary
run: cargo build --release --target x86_64-pc-windows-msvc
- name: Stage binary
env:
VERSION: ${{ github.ref_name }}
shell: bash
run: |
VER="${VERSION#v}"
mkdir -p dist
cp "target/x86_64-pc-windows-msvc/release/st.exe" "dist/st-${VER}-windows-amd64.exe"
- uses: actions/upload-artifact@v7
with:
name: windows-amd64
path: dist/
build-wasm:
name: WASM (bundler)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
key: wasm32-unknown-unknown
- name: Install wasm-pack
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
- name: Build WASM package
run: wasm-pack build --target bundler -- --features wasm --no-default-features
- name: Package artifact
env:
VERSION: ${{ github.ref_name }}
run: |
VER="${VERSION#v}"
mkdir -p dist
tar -czf "dist/syntext-wasm-${VER}.tar.gz" -C pkg .
- uses: actions/upload-artifact@v7
with:
name: wasm-bundler
path: dist/
release:
name: Publish GitHub Release
needs: [build-linux, build-macos, build-windows, build-wasm]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v8
with:
path: artifacts/
merge-multiple: true
- name: Generate SHA256 checksums
run: |
cd artifacts
sha256sum * > SHA256SUMS
cat SHA256SUMS
- uses: softprops/action-gh-release@v3
with:
files: artifacts/*
generate_release_notes: true
publish-crate:
name: Publish to crates.io
needs: [build-linux, build-macos]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- name: Detect existing crates.io release
id: crate
env:
VERSION: ${{ github.ref_name }}
run: |
VER="${VERSION#v}"
if curl -fsSL "https://crates.io/api/v1/crates/syntext/${VER}" >/dev/null; then
echo "published=true" >> "$GITHUB_OUTPUT"
else
echo "published=false" >> "$GITHUB_OUTPUT"
fi
- name: cargo publish
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: |
set +e
cargo publish 2>&1 | tee /tmp/cargo-publish.log
status=${PIPESTATUS[0]}
set -e
if [ "${status}" -eq 0 ]; then
exit 0
fi
if grep -F "already exists on crates.io index" /tmp/cargo-publish.log >/dev/null; then
exit 0
fi
exit "${status}"
update-homebrew-cask:
name: Update Homebrew Cask
needs: [release]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Detect tap token
id: tap
env:
TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
run: |
if [ -n "${TAP_TOKEN}" ]; then
echo "available=true" >> "$GITHUB_OUTPUT"
else
echo "available=false" >> "$GITHUB_OUTPUT"
fi
- name: Set version
id: ver
run: echo "VER=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
- name: Compute SHA256 from published release assets
id: sha
env:
VER: ${{ steps.ver.outputs.VER }}
run: |
BASE="https://github.com/whit3rabbit/syntext/releases/download/v${VER}"
curl -fsSL "${BASE}/st-${VER}-macos-arm64.zip" -o arm64.zip
curl -fsSL "${BASE}/st-${VER}-macos-x86_64.zip" -o x86_64.zip
ARM_SHA=$(sha256sum arm64.zip | awk '{print $1}')
X86_SHA=$(sha256sum x86_64.zip | awk '{print $1}')
echo "arm=${ARM_SHA}" >> "$GITHUB_OUTPUT"
echo "x86=${X86_SHA}" >> "$GITHUB_OUTPUT"
- uses: actions/checkout@v5
if: steps.tap.outputs.available == 'true'
with:
repository: whit3rabbit/homebrew-tap
token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
path: homebrew-tap
- name: Generate cask
if: steps.tap.outputs.available == 'true'
env:
VER: ${{ steps.ver.outputs.VER }}
ARM: ${{ steps.sha.outputs.arm }}
X86: ${{ steps.sha.outputs.x86 }}
run: |
chmod +x scripts/render_homebrew_cask.sh
scripts/render_homebrew_cask.sh \
packaging/homebrew/Casks/syntext.rb \
homebrew-tap/Casks/syntext.rb \
"${VER}" \
"${ARM}" \
"${X86}"
ruby -c homebrew-tap/Casks/syntext.rb
- name: Commit and push cask
if: steps.tap.outputs.available == 'true'
working-directory: homebrew-tap
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add Casks/syntext.rb
git diff --cached --quiet && echo "No changes" && exit 0
git commit -m "Update syntext cask to ${{ steps.ver.outputs.VER }}"
git push origin main