name: Release
on:
push:
tags:
- 'v*'
jobs:
create_man_page:
name: Create man page
runs-on: ubuntu-22.04
steps:
- name: Checkout doc directory
uses: actions/checkout@v4
with:
sparse-checkout: |
doc
sparse-checkout-cone-mode: false
- name: Compile with pandoc
uses: docker://pandoc/core:2.9
with:
args: >-
--standalone
--output=doc/quartz.1
doc/quartz.1.md
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: quartz.1
path: doc/quartz.1
if-no-files-found: error
publish_dry_run:
name: Publish (dry-run)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: cargo publish --dry-run --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
create_draft:
name: Create a draft
needs: [publish_dry_run, create_man_page]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Create Release
run: gh release create ${{ github.ref_name }} --title "${{ github.ref_name }}" --draft --notes "$(./extract_changes.sh ${{ github.ref_name }} CHANGELOG.md)"
env:
GH_TOKEN: ${{ github.token }}
deb:
name: Upload deb package
needs: create_draft
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
target: x86_64-unknown-linux-musl
- name: Download man page
uses: actions/download-artifact@v4
with:
name: quartz.1
path: doc
- name: Install cargo-deb
run: cargo install cargo-deb
- name: Build deb package
id: build_deb
run: |
pkg=$(cargo deb)
echo "deb_pkg=$pkg" >> $GITHUB_OUTPUT
- name: Upload release deb
env:
GH_TOKEN: ${{ github.token }}
run: gh release upload ${{ github.ref_name }} ${{ steps.build_deb.outputs.deb_pkg }}
build_archive:
name: Build archive
needs: create_draft
runs-on: ${{ matrix.os }}
permissions:
contents: write
env:
CARGO: cargo
TARGET_FLAGS: ""
TARGET_DIR: ./target
strategy:
fail-fast: false
matrix:
build: [linux-gnu, linux-gnu-aarch, linux-musl, linux-musl-aarch, macos, macos-arm]
include:
- build: linux-gnu
os: ubuntu-latest
target: x86_64-unknown-linux-gnu
- build: linux-gnu-aarch
os: ubuntu-latest
target: aarch64-unknown-linux-gnu
- build: linux-musl
os: ubuntu-latest
target: x86_64-unknown-linux-musl
- build: linux-musl-aarch
os: ubuntu-latest
target: aarch64-unknown-linux-musl
- build: macos
os: macos-latest
target: x86_64-apple-darwin
- build: macos-arm
os: macos-latest
target: aarch64-apple-darwin
steps:
- uses: actions/checkout@v4
- name: Download man page
uses: actions/download-artifact@v4
with:
name: quartz.1
path: doc
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
target: ${{ matrix.target }}
- name: Use Cross
shell: bash
run: |
cargo install cross
- name: Build binary
run: cross build --verbose --release --target ${{ matrix.target }}
- name: Build archive
shell: bash
run: |
staging="quartz-${{ github.ref_name }}-${{ matrix.target }}"
mkdir -p "$staging"/doc
cp {README.md,LICENSE} "$staging/"
cp CHANGELOG.md "$staging/doc/"
cp doc/quartz.1 "$staging/doc/quartz.1"
cp "target/${{ matrix.target }}/release/quartz" "$staging/"
tar czf "$staging.tar.gz" "$staging"
echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV
- name: Upload release archive
env:
GH_TOKEN: ${{ github.token }}
run: gh release upload ${{ github.ref_name }} ${{ env.ASSET }}
mark_as_latest:
name: Mark release as latest
needs: [build_archive, deb]
runs-on: ubuntu-latest
permissions:
contents: write
env:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v4
- run: gh release edit --draft=false ${{ github.ref_name }}
publish_crate:
name: Publish on crates.io
needs: mark_as_latest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
homebrew:
name: Update Homebrew formula
needs: mark_as_latest
runs-on: ubuntu-latest
steps:
- uses: dawidd6/action-homebrew-bump-formula@v3
with:
token: ${{ secrets.HOMEBREW_TOKEN }}
tap: eduardorodriguesf/homebrew-quartz
formula: quartz