on: push: branches: [ main ] pull_request: merge_group: name: CI jobs: ci: runs-on: ubuntu-latest strategy: fail-fast: false matrix: rust: - 1.63.0 # MSRV - stable - beta - nightly features: - "" - "serde" steps: - name: Checkout uses: actions/checkout@v4 - name: Cache the registry uses: actions/cache@v4 if: startsWith(matrix.rust, '1') with: path: ~/.cargo/registry/index key: cargo-${{ matrix.rust }}-git-index - name: Set up Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} - name: Build (no_std) run: cargo build --no-default-features --features "${{ matrix.features }}" - name: Build run: cargo build --features "${{ matrix.features }}" - name: Test run: cargo test --features "${{ matrix.features }}" - name: Doc run: cargo doc --features "${{ matrix.features }}" clippy: name: Rustfmt and Clippy runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Set up nightly Rust uses: dtolnay/rust-toolchain@nightly with: components: rustfmt, clippy - name: Rustfmt run: cargo fmt --all -- --check - name: Clippy run: cargo clippy # -- -D warnings # One job that "summarizes" the success state of this pipeline. This can then be added to branch # protection, rather than having to add each job separately. success: name: Success runs-on: ubuntu-latest needs: [ci, clippy] # Github branch protection is exceedingly silly and treats "jobs skipped because a dependency # failed" as success. So we have to do some contortions to ensure the job fails if any of its # dependencies fails. if: always() # make sure this is never "skipped" steps: # Manually check the status of all dependencies. `if: failure()` does not work. - name: check if any dependency failed run: jq --exit-status 'all(.result == "success")' <<< '${{ toJson(needs) }}'