name: Release
on:
push:
tags:
- "v*"
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
jobs:
verify:
name: Verify release
runs-on: ubuntu-latest
steps:
- name: Check out tagged source
uses: actions/checkout@v5
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- name: Cache Rust build
uses: Swatinem/rust-cache@v2
- name: Verify tag matches crate version
shell: bash
run: |
tag_version="${GITHUB_REF_NAME#v}"
crate_version="$(cargo metadata --locked --no-deps --format-version 1 | jq -r '.packages[] | select(.name == "network-device") | .version')"
if [[ "$tag_version" != "$crate_version" ]]; then
echo "Tag version '$tag_version' does not match crate version '$crate_version'."
exit 1
fi
- name: Check formatting
run: cargo fmt --check
- name: Run Clippy
run: cargo clippy --locked --all-features --all-targets -- -D warnings
- name: Run tests
run: cargo test --locked --all-features
- name: Verify package
run: cargo package --locked
publish:
name: Publish crate
needs: verify
runs-on: ubuntu-latest
environment: release
steps:
- name: Check out tagged source
uses: actions/checkout@v5
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Publish to crates.io
run: cargo publish --locked --registry crates-io
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
github-release:
name: Create GitHub release
needs: publish
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create release
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
args=("$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --verify-tag --generate-notes)
if [[ "$GITHUB_REF_NAME" == *-* ]]; then
args+=(--prerelease)
fi
gh release create "${args[@]}"