Support providing profile as an argument #573
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is a big workflow and it contains two main processes: | |
# | |
# 1. Running lints and tests. | |
# - Rustfmt and Clippy checks are run against the Rust code. | |
# - The README is must be up to date. | |
# - The completions must be up to date. | |
# - Tests are run on multiple platforms and targets. | |
# | |
# 2. Publishing and releasing Sheldon when a tag is pushed. | |
# - Firstly we assert that the tag version matches the package version. | |
# In parallel | |
# - Publish Sheldon to Crates.io | |
# - For each platform build a release artifact and upload to the GitHub release. | |
name: build | |
on: [push, pull_request] | |
env: | |
CRATE: sheldon | |
jobs: | |
# --------------------------------------------------------------------------- | |
# Lint | |
# --------------------------------------------------------------------------- | |
lint: | |
strategy: | |
matrix: | |
toolchain: [stable, beta, nightly] | |
runs-on: ubuntu-latest | |
env: | |
RUSTFLAGS: --deny warnings | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ matrix.toolchain }} | |
components: clippy, rustfmt | |
- name: Rustfmt | |
run: cargo fmt -- --check | |
- name: Clippy | |
continue-on-error: ${{ matrix.toolchain == 'nightly' }} | |
run: cargo clippy --workspace | |
# --------------------------------------------------------------------------- | |
# Test | |
# --------------------------------------------------------------------------- | |
test: | |
strategy: | |
matrix: | |
include: | |
- { os: macos-latest, target: x86_64-apple-darwin } | |
- { os: ubuntu-latest, target: x86_64-unknown-linux-musl } | |
- { os: ubuntu-latest, target: aarch64-unknown-linux-musl } | |
- { os: ubuntu-latest, target: armv7-unknown-linux-musleabihf } | |
name: test (${{ matrix.target }}) | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: dtolnay/rust-toolchain@stable | |
with: | |
target: ${{ matrix.target }} | |
- name: Test | |
run: | | |
cargo install cross | |
cross test --locked --target ${{ matrix.target }} | |
# --------------------------------------------------------------------------- | |
# Check README | |
# --------------------------------------------------------------------------- | |
readme: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@stable | |
- name: Install cargo-onedoc | |
run: cargo install cargo-onedoc --locked | |
- name: Check README | |
run: cargo onedoc --check | |
# --------------------------------------------------------------------------- | |
# Check completions | |
# --------------------------------------------------------------------------- | |
completions: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@stable | |
- name: Generate completions (bash) | |
run: cargo run -- completions --shell bash > completions/$CRATE.bash | |
- name: Generate completions (zsh) | |
run: cargo run -- completions --shell zsh > completions/$CRATE.zsh | |
- name: Check up to date | |
run: git diff --no-ext-diff --exit-code -- completions/ | |
# --------------------------------------------------------------------------- | |
# Check version against tag | |
# --------------------------------------------------------------------------- | |
prepare: | |
needs: [lint, test, readme, completions] | |
if: startsWith(github.ref, 'refs/tags/') | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Calculate version from tag | |
id: version | |
run: echo "value=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT | |
- name: Check tag against package version | |
run: grep '^version = "${{ steps.version.outputs.value }}"$' Cargo.toml | |
# --------------------------------------------------------------------------- | |
# Publish to Crates.io | |
# --------------------------------------------------------------------------- | |
publish: | |
needs: prepare | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@stable | |
- name: Publish | |
env: | |
CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} | |
run: cargo publish | |
# --------------------------------------------------------------------------- | |
# Release to GitHub | |
# --------------------------------------------------------------------------- | |
release: | |
needs: prepare | |
strategy: | |
matrix: | |
include: | |
- { os: macos-latest, target: x86_64-apple-darwin } | |
- { os: ubuntu-latest, target: x86_64-unknown-linux-musl, prefix: x86_64-linux-musl } | |
- { os: ubuntu-latest, target: aarch64-unknown-linux-musl, prefix: aarch64-linux-musl } | |
- { os: ubuntu-latest, target: armv7-unknown-linux-musleabihf, prefix: arm-linux-musleabihf } | |
name: release (${{ matrix.target }}) | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: dtolnay/rust-toolchain@stable | |
with: | |
target: ${{ matrix.target }} | |
- name: Build | |
run: | | |
cargo install cross | |
cross build --locked --release --target ${{ matrix.target }} | |
- name: Calculate version from tag | |
id: version | |
run: echo "value=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT | |
- name: Archive | |
id: archive | |
run: | | |
mkdir release | |
archive=$CRATE-${{ steps.version.outputs.value }}-${{ matrix.target }}.tar.gz | |
cp target/${{ matrix.target }}/release/$CRATE release/$CRATE | |
cp LICENSE* release | |
cp README.md release | |
cp -R completions release | |
cd release | |
tar cfz "../$archive" -- * | |
cd .. | |
rm -r release | |
echo "path=$archive" >> $GITHUB_OUTPUT | |
- uses: softprops/action-gh-release@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
files: ${{ steps.archive.outputs.path }} |