Skip to content

Release CLI

Release CLI #7

Workflow file for this run

name: Release CLI
on:
push:
tags:
- "cli-v*" # CLI version tags
workflow_dispatch:
jobs:
release_build:
name: Build ${{ matrix.target }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
# macOS builds
- os: macos-latest
target: x86_64-apple-darwin
name: renamify-macos-amd64
- os: macos-latest
target: aarch64-apple-darwin
name: renamify-macos-arm64
# Linux builds
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
name: renamify-linux-amd64
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
name: renamify-linux-arm64
use-cross: true
# Windows builds
- os: windows-latest
target: x86_64-pc-windows-msvc
name: renamify-windows-amd64
- os: windows-latest
target: aarch64-pc-windows-msvc
name: renamify-windows-arm64
use-cross: true
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Wait for required checks
uses: actions/github-script@v7
with:
script: |
const script = require('./.github/wait-for-checks.js');
await script({ github, context, core });
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Add rust target
if: matrix.target == 'x86_64-apple-darwin' && matrix.os == 'macos-latest'
run: rustup target add ${{ matrix.target }}
- name: Install cross (for cross-compilation)
if: matrix.use-cross
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Build binary
shell: bash
run: |
if [ "${{ matrix.use-cross }}" = "true" ]; then
cross build --release --target ${{ matrix.target }} --bin renamify
else
cargo build --release --target ${{ matrix.target }} --bin renamify
fi
- name: Create archive
shell: bash
run: |
cd target/${{ matrix.target }}/release
if [[ "${{ matrix.os }}" == "windows-latest" ]]; then
# Windows: create a zip file
7z a ../../../${{ matrix.name }}.zip renamify.exe
cd ../../../
echo "ASSET_PATH=${{ matrix.name }}.zip" >> $GITHUB_ENV
else
# Unix: create a tar.gz file
tar czf ../../../${{ matrix.name }}.tar.gz renamify
cd ../../../
echo "ASSET_PATH=${{ matrix.name }}.tar.gz" >> $GITHUB_ENV
fi
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.name }}
path: ${{ env.ASSET_PATH }}
release_create:
name: Create Release
needs: release_build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Get version from Cargo.toml
id: version
run: |
# Extract version from Cargo.toml
VERSION=$(grep '^version = ' renamify-cli/Cargo.toml | sed 's/version = "\(.*\)"/\1/')
echo "version=$VERSION" >> $GITHUB_OUTPUT
if [ "${{ github.event_name }}" = "push" ]; then
# Verify tag matches Cargo.toml version
TAG="${GITHUB_REF#refs/tags/}"
EXPECTED_TAG="cli-v$VERSION"
if [ "$TAG" != "$EXPECTED_TAG" ]; then
echo "Error: Tag $TAG doesn't match expected $EXPECTED_TAG from Cargo.toml"
exit 1
fi
echo "tag=$TAG" >> $GITHUB_OUTPUT
else
# Workflow dispatch - create tag from Cargo.toml version
echo "tag=cli-v$VERSION" >> $GITHUB_OUTPUT
fi
- name: Generate changelog
id: changelog
run: |
TAG="${{ steps.version.outputs.tag }}"
echo "## What's Changed" > changelog.md
echo "" >> changelog.md
# Get the previous tag
PREV_TAG=$(git describe --tags --abbrev=0 $TAG^ 2>/dev/null || echo "")
if [ -n "$PREV_TAG" ]; then
echo "### Commits since $PREV_TAG" >> changelog.md
git log --pretty=format:"- %s (%h)" $PREV_TAG..$TAG >> changelog.md
else
echo "### Initial Release" >> changelog.md
echo "- First release of Renamify" >> changelog.md
fi
echo "" >> changelog.md
echo "## Installation" >> changelog.md
echo "" >> changelog.md
echo "### macOS (Intel)" >> changelog.md
echo '```bash' >> changelog.md
echo "curl -L https://github.com/\${{ github.repository }}/releases/download/$TAG/renamify-macos-amd64.tar.gz | tar xz" >> changelog.md
echo "sudo mv renamify /usr/local/bin/" >> changelog.md
echo '```' >> changelog.md
echo "" >> changelog.md
echo "### macOS (Apple Silicon)" >> changelog.md
echo '```bash' >> changelog.md
echo "curl -L https://github.com/\${{ github.repository }}/releases/download/$TAG/renamify-macos-arm64.tar.gz | tar xz" >> changelog.md
echo "sudo mv renamify /usr/local/bin/" >> changelog.md
echo '```' >> changelog.md
echo "" >> changelog.md
echo "### Linux (x86_64)" >> changelog.md
echo '```bash' >> changelog.md
echo "curl -L https://github.com/\${{ github.repository }}/releases/download/$TAG/renamify-linux-amd64.tar.gz | tar xz" >> changelog.md
echo "sudo mv renamify /usr/local/bin/" >> changelog.md
echo '```' >> changelog.md
echo "" >> changelog.md
echo "### Linux (ARM64)" >> changelog.md
echo '```bash' >> changelog.md
echo "curl -L https://github.com/\${{ github.repository }}/releases/download/$TAG/renamify-linux-arm64.tar.gz | tar xz" >> changelog.md
echo "sudo mv renamify /usr/local/bin/" >> changelog.md
echo '```' >> changelog.md
echo "" >> changelog.md
echo "### Windows (x86_64)" >> changelog.md
echo '```powershell' >> changelog.md
echo "Invoke-WebRequest -Uri https://github.com/\${{ github.repository }}/releases/download/$TAG/renamify-windows-amd64.zip -OutFile renamify.zip" >> changelog.md
echo "Expand-Archive -Path renamify.zip -DestinationPath ." >> changelog.md
echo "Move-Item -Path renamify.exe -Destination C:\\Windows\\System32\\" >> changelog.md
echo '```' >> changelog.md
echo "" >> changelog.md
echo "### Windows (ARM64)" >> changelog.md
echo '```powershell' >> changelog.md
echo "Invoke-WebRequest -Uri https://github.com/\${{ github.repository }}/releases/download/$TAG/renamify-windows-arm64.zip -OutFile renamify.zip" >> changelog.md
echo "Expand-Archive -Path renamify.zip -DestinationPath ." >> changelog.md
echo "Move-Item -Path renamify.exe -Destination C:\\Windows\\System32\\" >> changelog.md
echo '```' >> changelog.md
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.version.outputs.tag }}
name: Renamify CLI v${{ steps.version.outputs.version }}
body_path: changelog.md
draft: false
prerelease: ${{ contains(steps.tag.outputs.tag, '-') }}
files: |
artifacts/**/*.tar.gz
artifacts/**/*.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}