on:
push:
branches:
- main
pull_request:
name: CI
jobs:
fmt:
name: Rustfmt
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- uses: IronCoreLabs/rust-toolchain@v1
with:
toolchain: nightly
components: rustfmt
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
- name: Cancel workflow
if: failure()
uses: andymckay/cancel-action@0.5
build:
name: Builds
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-24.04
target: aarch64-linux-android - os: ubuntu-24.04
target: x86_64-unknown-linux-musl - os: ubuntu-24.04
target: wasm32-unknown-unknown
features: --features wasm --no-default-features
- os: macos-15-intel
target: aarch64-apple-ios
- os: macos-15-intel
target: x86_64-apple-darwin - os: macos-14
target: aarch64-apple-darwin - os: windows-2025
target: x86_64-pc-windows-msvc
steps:
- uses: actions/checkout@v6
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- uses: IronCoreLabs/rust-toolchain@v1
with:
toolchain: stable
target: ${{ matrix.target }}
- uses: actions-rs/cargo@v1
with:
use-cross: true
command: build
args: --release --target=${{ matrix.target }} ${{ matrix.features }}
test:
name: Test Suite
runs-on: ubuntu-24.04
strategy:
matrix:
rust:
- stable
- beta
- 1.88.0 fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- uses: IronCoreLabs/rust-toolchain@v1
with:
toolchain: ${{ matrix.rust }}
- uses: actions-rs/cargo@v1
with:
command: test
bench:
name: Bench
runs-on: ubuntu-24.04
if: github.base_ref != ''
strategy:
matrix:
include:
- name: current
ref: ${{ github.ref }}
- name: base
ref: ${{ github.base_ref }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ matrix.ref }}
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- uses: IronCoreLabs/rust-toolchain@v1
with:
toolchain: stable
- uses: actions-rs/cargo@v1
with:
command: install
args: critcmp
- uses: actions-rs/cargo@v1
with:
command: bench
args: -- --save-baseline ${{ matrix.name }}
- run: critcmp --export ${{ matrix.name }} > results.json
- name: Store benchmark results
uses: actions/upload-artifact@v6
with:
name: bench-${{ matrix.name }}
path: results.json
bench_results:
needs:
- bench
name: Upload benchmark results
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Retrieve benchmark results
uses: actions/download-artifact@v7
with:
name: bench-current
- name: Delete artifact
uses: geekyeggo/delete-artifact@v5
with:
name: bench-current
failOnError: false
- name: Retrieve benchmark results
uses: actions/download-artifact@v7
with:
name: bench-base
- name: Delete artifact
uses: geekyeggo/delete-artifact@v5
with:
name: bench-base
failOnError: false
- uses: IronCoreLabs/rust-toolchain@v1
with:
toolchain: stable
- uses: actions-rs/cargo@v1
with:
command: install
args: critcmp
- name: Compare benchmarks
run: |
if ! critcmp bench-base/results.json bench-current/results.json -t 10 ; then
echo "# Benchmark blew big budget! Bad!" > comment.md
fi
echo "Benchmark results comparing with base:" >> comment.md
echo '```' >> comment.md
critcmp bench-base/results.json bench-current/results.json -t 2 >> comment.md || true
echo '```' >> comment.md
cat comment.md
mv comment.md .github/workflows/comment.md