name: 'Run main workflow'
on:
pull_request:
push:
branches:
- "main"
tags:
- "*"
permissions:
contents: write
pull-requests: read
concurrency:
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
cancel-in-progress: true
jobs:
check-formatting:
runs-on: "ubuntu-latest"
timeout-minutes: 30
if: github.ref_type != 'tags'
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup rust
uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Run formatting check
run: cargo fmt --all -- --check
lint:
runs-on: "ubuntu-latest"
timeout-minutes: 30
if: github.ref_type != 'tags'
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup rust
uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Run lint
run: cargo clippy --all-features --all-targets
test-build:
strategy:
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup rust
uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Run release build
if: github.ref_type == 'tags'
run: cargo build --release
- name: Run build
if: github.ref_type != 'tags'
run: cargo build
- name: Install tarpaulin
if: github.ref_type != 'tags'
run: cargo install cargo-tarpaulin
- name: Run tests with coverage
if: github.ref_type != 'tags'
run: cargo tarpaulin --fail-under 91
release-dry-run:
runs-on: "ubuntu-latest"
timeout-minutes: 30
needs:
- test-build
if: ${{ github.ref_type != 'tag' }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup rust
uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Publish to crates.io
uses: katyo/publish-crates@v2
with:
dry-run: true
registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }}
release:
runs-on: "ubuntu-latest"
timeout-minutes: 30
needs:
- test-build
if: ${{ github.ref_type == 'tag' }}
steps:
- uses: actions/create-github-app-token@v3
id: app-token
with:
client-id: ${{ vars.APP_CLIENT_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
permission-contents: write
- name: Checkout
uses: actions/checkout@v6
with:
token: ${{ steps.app-token.outputs.token }}
- run: |
git config --global user.name '${{ steps.app-token.outputs.app-slug }}[bot]'
git config --global user.email '${{ steps.get-user-id.outputs.user-id }}+${{ steps.app-token.outputs.app-slug }}[bot]@users.noreply.github.com'
gh auth setup-git
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Setup rust
uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Set version for release
run: |
cargo install cargo-edit --no-default-features --features "set-version"
cargo set-version ${{ github.ref_name }}
- name: Commit release version
run: |
git add Cargo.toml Cargo.lock
git commit -m "chore: set version to ${{ github.ref_name }}"
- name: Publish to crates.io
uses: katyo/publish-crates@v2
with:
registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Set version for next release
id: next-release-version
run: |
NEXT_VERSION=$(echo ${{ github.ref_name }} | awk -F. -v OFS=. '{$NF += 1 ; print}')-alpha
cargo set-version "$NEXT_VERSION"
echo "next-version=${NEXT_VERSION}" >> $GITHUB_OUTPUT
- name: Commit next release version
run: |
git add Cargo.toml Cargo.lock
git commit -m "chore: set version to ${{ steps.next-release-version.outputs.next-version }}"
git push origin HEAD:main
- name: Create Release
uses: ncipollo/release-action@v1.21.0
with:
generateReleaseNotes: true
makeLatest: true