name: Release
on:
push:
tags:
- 'v*'
env:
CARGO_TERM_COLOR: always
permissions:
contents: write
packages: write
jobs:
create-release:
name: Create Release
runs-on: ubuntu-latest
outputs:
upload_url: ${{ steps.set_upload_url.outputs.upload_url }}
steps:
- uses: actions/checkout@v4
- name: Check if release exists
id: check_release
run: |
TAG=${GITHUB_REF#refs/tags/}
if gh release view $TAG > /dev/null 2>&1; then
echo "Release already exists, skipping creation"
echo "exists=true" >> $GITHUB_OUTPUT
UPLOAD_URL=$(gh release view $TAG --json uploadUrl --jq '.uploadUrl')
echo "upload_url=$UPLOAD_URL" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create Release
id: create_release
if: steps.check_release.outputs.exists == 'false'
run: |
TAG=${GITHUB_REF#refs/tags/}
gh release create $TAG --title "Release $TAG" --generate-notes
UPLOAD_URL=$(gh release view $TAG --json uploadUrl --jq '.uploadUrl')
echo "upload_url=$UPLOAD_URL" >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set upload URL
id: set_upload_url
run: |
if [ "${{ steps.check_release.outputs.exists }}" == "true" ]; then
echo "upload_url=${{ steps.check_release.outputs.upload_url }}" >> $GITHUB_OUTPUT
else
echo "upload_url=${{ steps.create_release.outputs.upload_url }}" >> $GITHUB_OUTPUT
fi
build-and-upload:
name: Build and upload
needs: create-release
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact_name: code-digest
asset_name: code-digest-linux-amd64
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact_name: code-digest.exe
asset_name: code-digest-windows-amd64.exe
- os: macos-latest
target: x86_64-apple-darwin
artifact_name: code-digest
asset_name: code-digest-macos-x86_64
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: code-digest
asset_name: code-digest-macos-aarch64
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Build release binary
run: cargo build --release --target ${{ matrix.target }} --all-features
- name: Upload Release Asset
run: |
TAG=${GITHUB_REF#refs/tags/}
gh release upload $TAG ./target/${{ matrix.target }}/release/${{ matrix.artifact_name }}#${{ matrix.asset_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}