name: Release
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
tag:
description: "Release Tag"
required: false
type: string
default: ""
permissions:
contents: write
id-token: write
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
jobs:
setup:
name: Setup Version
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.ver.outputs.tag }}
version: ${{ steps.ver.outputs.version }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Resolve Version
id: ver
run: |
if [ -n "${{ inputs.tag }}" ]; then
TAG="${{ inputs.tag }}"
elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then
TAG="${{ github.ref_name }}"
else
CARGO_VER=$(grep '^version = ' Cargo.toml | head -n 1 | cut -d '"' -f 2)
TAG="v${CARGO_VER}"
fi
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"
build-linux:
name: Build Linux
needs: [setup]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-musl
- name: Install Musl
run: sudo apt-get update && sudo apt-get install -y musl-tools
- name: Restore Cache
uses: Swatinem/rust-cache@v2
- name: Build Binary
run: cargo build --release --locked --target x86_64-unknown-linux-musl
- name: Compress Package
run: |
tar -czf target/release/preprinttui-linux-musl-x86_64.tar.gz \
-C target/x86_64-unknown-linux-musl/release preprinttui
- name: Upload Asset
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/release/preprinttui-linux-musl-x86_64.tar.gz
tag: ${{ needs.setup.outputs.tag }}
overwrite: true
build-macos:
name: Build macOS
needs: [setup]
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin
- name: Restore Cache
uses: Swatinem/rust-cache@v2
- name: Build Binary
run: cargo build --release --locked --target aarch64-apple-darwin
- name: Compress Package
run: |
tar -czf target/release/preprinttui-macos-arm64.tar.gz \
-C target/aarch64-apple-darwin/release preprinttui
- name: Upload Asset
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/release/preprinttui-macos-arm64.tar.gz
tag: ${{ needs.setup.outputs.tag }}
overwrite: true
build-windows:
name: Build Windows
needs: [setup]
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Toolchain
uses: dtolnay/rust-toolchain@stable
- name: Restore Cache
uses: Swatinem/rust-cache@v2
- name: Build Binary
run: cargo build --release --locked
- name: Compress Package
shell: powershell
run: |
Compress-Archive -Path target/release/preprinttui.exe -DestinationPath target/release/preprinttui-win-x86_64.zip
- name: Upload Asset
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/release/preprinttui-win-x86_64.zip
tag: ${{ needs.setup.outputs.tag }}
overwrite: true
publish:
name: Publish Release
needs: [setup, build-linux, build-macos, build-windows]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Toolchain
uses: dtolnay/rust-toolchain@stable
- name: Restore Cache
uses: Swatinem/rust-cache@v2
- name: Generate Notes
run: |
VERSION="${{ needs.setup.outputs.version }}"
COMMIT_SHA="${{ github.sha }}"
COMMIT_URL="https://github.com/sabbirba/preprinttui/commit/${COMMIT_SHA}"
{
echo "# preprinttui Release Notes"
echo
echo "## Version"
echo "- Version: ${VERSION}"
echo "- Commit: [${COMMIT_SHA:0:7}](${COMMIT_URL})"
echo
echo "## Changes"
awk '/^### / { if (found) exit; found=1; next } found { print }' CHANGELOG.md
} > release-notes.md
- name: Create Release
uses: softprops/action-gh-release@v2
with:
name: "${{ needs.setup.outputs.version }}"
tag_name: "${{ needs.setup.outputs.tag }}"
target_commitish: ${{ github.sha }}
body_path: release-notes.md
- name: Publish Crate
if: ${{ env.CARGO_REGISTRY_TOKEN != '' }}
continue-on-error: true
run: cargo publish --allow-dirty
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
homebrew:
name: Update Homebrew Tap
needs: [setup, publish]
runs-on: ubuntu-latest
steps:
- name: Checkout Tap
uses: actions/checkout@v4
with:
repository: sabbirba/homebrew-tap
ssh-key: ${{ secrets.TAP_DEPLOY_KEY }}
- name: Update Formula
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ needs.setup.outputs.tag }}
VERSION: ${{ needs.setup.outputs.version }}
run: |
gh release download "$TAG" -R "${{ github.repository }}" -p "*.tar.gz" -D assets
for asset in macos-arm64 linux-musl-x86_64; do
sha=$(sha256sum "assets/preprinttui-$asset.tar.gz" | cut -d' ' -f1)
perl -0pi -e "s{(preprinttui-$asset\.tar\.gz\"\n\s*sha256 \")[0-9a-f]+}{\${1}$sha}" Formula/preprinttui.rb
done
perl -pi -e "s/^ version \".*\"/ version \"$VERSION\"/" Formula/preprinttui.rb
rm -rf assets
- name: Push Formula
env:
VERSION: ${{ needs.setup.outputs.version }}
run: |
git config user.name "Sabbir Bin Abbas"
git config user.email "mail@sabbirba.com"
git commit -am "Update preprinttui to $VERSION" || exit 0
git push