name: release
on:
push:
tags:
- "v*"
workflow_dispatch:
permissions:
contents: read
jobs:
package:
name: package ${{ matrix.target_name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: macos-14
target_name: darwin-aarch64
- os: macos-15-intel
target_name: darwin-x86_64
- os: ubuntu-24.04
target_name: linux-x86_64
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 with:
toolchain: stable
- name: Install PCRE2
run: |
if [[ "${{ runner.os }}" == "macOS" ]]; then
brew install pcre2 pkg-config
else
sudo apt-get update
sudo apt-get install -y libpcre2-dev pkg-config
fi
- name: Test
run: cargo test
- name: Package
run: bash scripts/package-release.sh "${{ matrix.target_name }}"
- name: Upload artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a with:
name: prismtty-${{ matrix.target_name }}
path: |
dist/*.tar.gz
dist/*.tar.gz.sha256
github-release:
name: publish GitHub release
runs-on: ubuntu-24.04
needs: package
if: startsWith(github.ref, 'refs/tags/')
permissions:
contents: write
id-token: write
attestations: write
artifact-metadata: write
checks: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 with:
toolchain: stable
- name: cargo audit
uses: rustsec/audit-check@69366f33c96575abad1ee0dba8212993eecbe998 with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: cargo deny
uses: EmbarkStudios/cargo-deny-action@6c8f9facfa5047ec02d8485b6bf52b587b7777d1 with:
rust-version: "1.85"
command: check advisories licenses bans sources
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c with:
path: ${{ runner.temp }}/release-artifacts
merge-multiple: true
- name: Validate artifacts
run: |
set -euo pipefail
artifact_dir="${RUNNER_TEMP}/release-artifacts"
version="$(awk -F '"' '/^version = / { print $2; exit }' Cargo.toml)"
tag_version="${GITHUB_REF_NAME#v}"
if [[ "$version" != "$tag_version" ]]; then
echo "Cargo.toml version $version does not match release tag $GITHUB_REF_NAME."
exit 1
fi
for target in darwin-aarch64 darwin-x86_64 linux-x86_64; do
archive="${artifact_dir}/prismtty-${version}-${target}.tar.gz"
checksum="${archive}.sha256"
test -f "$archive"
test -f "$checksum"
grep -E "^[0-9a-f]{64} prismtty-${version}-${target}\\.tar\\.gz$" "$checksum"
done
- name: Generate Homebrew formula
run: bash scripts/generate-homebrew-formula.sh "${RUNNER_TEMP}/release-artifacts/prismtty.rb" "${RUNNER_TEMP}/release-artifacts"
- name: Attest release artifacts
uses: actions/attest@59d89421af93a897026c735860bf21b6eb4f7b26 with:
subject-path: |
${{ runner.temp }}/release-artifacts/prismtty.rb
${{ runner.temp }}/release-artifacts/*.tar.gz
${{ runner.temp }}/release-artifacts/*.tar.gz.sha256
- name: Authenticate with crates.io
id: crates-io-auth
uses: rust-lang/crates-io-auth-action@bbd81622f20ce9e2dd9622e3218b975523e45bbe
- name: Publish crate
env:
CARGO_REGISTRY_TOKEN: ${{ steps.crates-io-auth.outputs.token }}
run: cargo publish --locked
- name: Publish release
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda with:
files: |
${{ runner.temp }}/release-artifacts/prismtty.rb
${{ runner.temp }}/release-artifacts/*.tar.gz
${{ runner.temp }}/release-artifacts/*.tar.gz.sha256