diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a694ac7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,84 @@ +name: CI +on: + push: + branches: [main] + pull_request: + branches: [main] +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings +jobs: + # Run tests. + test: + name: Tests + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + - name: Install dependencies + run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev + - name: Populate target directory from cache + uses: Leafwing-Studios/cargo-cache@v2 + with: + sweep-cache: true + - name: Run tests + run: | + cargo test --locked --workspace --all-features --all-targets + # Workaround for https://github.com/rust-lang/cargo/issues/6669 + cargo test --locked --workspace --all-features --doc + # Run clippy lints. + clippy: + name: Clippy + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: clippy + - name: Install dependencies + run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev + - name: Populate target directory from cache + uses: Leafwing-Studios/cargo-cache@v2 + with: + sweep-cache: true + - name: Run clippy lints + run: cargo clippy --locked --workspace --all-features -- --deny warnings + # Check formatting. + format: + name: Format + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + - name: Run cargo fmt + run: cargo fmt --all -- --check + # Check documentation. + doc: + name: Docs + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + - name: Install dependencies + run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev + - name: Populate target directory from cache + uses: Leafwing-Studios/cargo-cache@v2 + with: + sweep-cache: true + - name: Check documentation + run: cargo doc --locked --workspace --all-features --document-private-items --no-deps diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..79425d5 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,68 @@ +name: Publish +on: + # Trigger this workflow when a tag is pushed in the format `v1.2.3`. + push: + tags: + # Pattern syntax: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet + - "v[0-9]+.[0-9]+.[0-9]+*" + # Trigger this workflow manually via workflow dispatch. + workflow_dispatch: + inputs: + version: + description: 'Version number in the format `v1.2.3`' + required: true + type: string +jobs: + audit: + name: Audit + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/audit@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + crates_io_publish: + name: Publish (crates.io) + needs: + - audit + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - name: cargo-release Cache + id: cargo_release_cache + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/cargo-release + key: ${{ runner.os }}-cargo-release + - run: cargo install cargo-release + if: steps.cargo_release_cache.outputs.cache-hit != 'true' + - name: cargo login + run: cargo login ${{ secrets.CRATES_IO_API_TOKEN }} + # Publishing is currently messy, because: + # + # * `peace_rt_model_core` exports `NativeError` or `WebError` depending on the target. + # * `peace_rt_model_web` fails to build when publishing the workspace for a native target. + # * `peace_rt_model_web` still needs its dependencies to be published before it can be + # published. + # * `peace_rt_model_hack` needs `peace_rt_model_web` to be published before it can be + # published. + # + # We *could* pass through `--no-verify` so `cargo` doesn't build the crate before publishing, + # which is reasonable, since this job only runs after the Linux, Windows, and WASM builds + # have passed. + - name: "cargo release publish" + # allow-branch HEAD is because GitHub actions switches + # to the tag while building, which is a detached head + + run: |- + cargo release \ + publish \ + --workspace \ + --all-features \ + --allow-branch HEAD \ + --no-confirm \ + --no-verify \ + --execute