name: Release
on:
push:
branches: [ master ]
tags: [ 'v*' ]
env:
CARGO_TERM_COLOR: always
permissions:
contents: write
issues: write
pull-requests: write
jobs:
check-version:
name: Check Version
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
version-changed: ${{ steps.version.outputs.changed }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get version from Cargo.toml
id: version
run: |
VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "version=${VERSION}" >> $GITHUB_OUTPUT
# Check if version changed since last release
if git tag -l "v${VERSION}" | grep -q "v${VERSION}"; then
echo "changed=false" >> $GITHUB_OUTPUT
else
echo "changed=true" >> $GITHUB_OUTPUT
fi
pre-release-checks:
name: Pre-Release Checks
runs-on: ubuntu-latest
needs: check-version
if: needs.check-version.outputs.version-changed == 'true'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libdbus-1-dev pkg-config libudev-dev
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Check formatting
run: cargo fmt -- --check
- name: Run Clippy
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Run tests
run: cargo test --verbose
- name: Run doctests
run: cargo test --doc --verbose
- name: Check documentation
run: cargo doc --no-deps --document-private-items --all-features
env:
RUSTDOCFLAGS: -D warnings
- name: Dry run publish
run: cargo publish --dry-run --token ${{ secrets.CRATES_IO_TOKEN }}
create-release:
name: Create Release
runs-on: ubuntu-latest
needs: [check-version, pre-release-checks]
if: needs.check-version.outputs.version-changed == 'true'
outputs:
version: ${{ needs.check-version.outputs.version }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate changelog
id: changelog
run: |
# Generate changelog from git commits since last tag
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
CHANGELOG=$(git log --pretty=format:"- %s" --no-merges)
else
CHANGELOG=$(git log ${LAST_TAG}..HEAD --pretty=format:"- %s" --no-merges)
fi
# Save changelog to file for GitHub release
echo "## Changes" > CHANGELOG.md
echo "" >> CHANGELOG.md
echo "$CHANGELOG" >> CHANGELOG.md
# Set output for later use
echo "changelog<<EOF" >> $GITHUB_OUTPUT
echo "$CHANGELOG" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Create GitHub Release
id: create_release
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ needs.check-version.outputs.version }}
name: Release v${{ needs.check-version.outputs.version }}
body_path: CHANGELOG.md
draft: false
prerelease: false
publish-crates:
name: Publish to Crates.io
runs-on: ubuntu-latest
needs: [check-version, create-release]
if: needs.check-version.outputs.version-changed == 'true'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libdbus-1-dev pkg-config libudev-dev
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Publish to crates.io
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}