From 49bc68d73e82374224284baf0ba51ed3a29c0d81 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Mon, 5 Aug 2024 11:29:48 -0700 Subject: [PATCH] Add GitHub check and test workflows (#28) --- .github/workflows/check.yml | 88 +++++++++++++++++++++++++++++++++++ .github/workflows/test.yml | 93 +++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 .github/workflows/check.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..cd79978 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,88 @@ +name: Check + +on: + push: + branches: + - master + pull_request: + +env: + CARGO_TERM_COLOR: always + MSRV: "1.56.0" + +# ensure that the workflow is only triggered once per PR, subsequent pushes to the PR will cancel +# and restart the workflow. See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + fmt: + name: fmt (stable) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + targets: x86_64-pc-windows-msvc,x86_64-pc-windows-gnu + - name: Run cargo fmt + run: cargo fmt -- --check + - name: Cache Cargo dependencies + uses: Swatinem/rust-cache@v2 + clippy: + name: clippy (${{ matrix.toolchain }}) + runs-on: windows-latest + permissions: + checks: write + strategy: + fail-fast: false + matrix: + # Get early warnings about new lints introduced in the beta channel + toolchain: [stable, beta] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Rust stable + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + components: clippy + targets: x86_64-pc-windows-msvc,x86_64-pc-windows-gnu + - name: Run clippy action + uses: clechasseur/rs-clippy-check@v3 + - name: Cache Cargo dependencies + uses: Swatinem/rust-cache@v2 + doc: + # run docs generation on nightly rather than stable. This enables features like + # https://doc.rust-lang.org/beta/unstable-book/language-features/doc-cfg.html which allows an + # API be documented as only available in some specific platforms. + name: doc (nightly) + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Rust nightly + uses: dtolnay/rust-toolchain@nightly + with: + targets: x86_64-pc-windows-msvc,x86_64-pc-windows-gnu + - name: Run cargo doc + run: cargo doc --no-deps --all-features + env: + RUSTDOCFLAGS: --cfg docsrs + msrv: + # check that we can build using the minimal rust version that is specified by this crate + name: check (1.56.0) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Rust ${{ env.MSRV }} + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.MSRV }} + targets: x86_64-pc-windows-msvc,x86_64-pc-windows-gnu + - name: cargo +${{ env.MSRV }} check + run: cargo check diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..f8b9a7f --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,93 @@ +name: Test +# This is the main CI workflow that runs the test suite on all pushes to main and all pull requests. +# It runs the following jobs: +# - test: runs the test suite on ubuntu with stable and beta rust toolchains +# - minimal: runs the test suite with the minimal versions of the dependencies that satisfy the +# requirements of this crate, and its dependencies +# See check.yml for information about how the concurrency cancellation and workflow triggering works +# and for the fmt, clippy, doc, and msrv jobs. +on: + push: + branches: + - master + pull_request: + +# ensure that the workflow is only triggered once per PR, subsequent pushes to the PR will cancel +# and restart the workflow. See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + test: + runs-on: windows-latest + name: Test (${{ matrix.toolchain }}) + strategy: + matrix: + # run on stable and beta to ensure that tests won't break on the next version of the rust + # toolchain + toolchain: [stable, beta, 1.56.0] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Rust ${{ matrix.toolchain }} + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + targets: x86_64-pc-windows-msvc,x86_64-pc-windows-gnu + # Generate a lockfile to use if one is not checked in. This makes the next step able to + # run regardless of whether a lockfile is checked in or not. + - name: cargo generate-lockfile + if: hashFiles('Cargo.lock') == '' + run: cargo generate-lockfile + - name: cargo test --locked + run: cargo test --locked --all-features --all-targets + - name: cargo test --doc + run: cargo test --locked --all-features --doc + - name: Cache Cargo dependencies + uses: Swatinem/rust-cache@v2 + + # This action chooses the oldest version of the dependencies permitted by Cargo.toml to ensure + # that this crate is compatible with the minimal version that this crate and its dependencies + # require. This will pickup issues where this create relies on functionality that was introduced + # later than the actual version specified (e.g., when we choose just a major version, but a + # method was added after this version). + # + # This particular check can be difficult to get to succeed as often transitive dependencies may + # be incorrectly specified (e.g., a dependency specifies 1.0 but really requires 1.1.5). There + # is an alternative flag available -Zdirect-minimal-versions that uses the minimal versions for + # direct dependencies of this crate, while selecting the maximal versions for the transitive + # dependencies. Alternatively, you can add a line in your Cargo.toml to artificially increase + # the minimal dependency, which you do with e.g.: + # ```toml + # # for minimal-versions + # [target.'cfg(any())'.dependencies] + # openssl = { version = "0.10.55", optional = true } # needed to allow foo to build with -Zminimal-versions + # ``` + # The optional = true is necessary in case that dependency isn't otherwise transitively required + # by your library, and the target bit is so that this dependency edge never actually affects + # Cargo build order. See also + # https://github.com/jonhoo/fantoccini/blob/fde336472b712bc7ebf5b4e772023a7ba71b2262/Cargo.toml#L47-L49. + # This action is run on ubuntu with the stable toolchain, as it is not expected to fail + minimal-versions: + runs-on: windows-latest + name: Check minimal-versions + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-pc-windows-msvc,x86_64-pc-windows-gnu + - name: Install Rust nightly (for -Zdirect-minimal-versions) + uses: dtolnay/rust-toolchain@nightly + with: + targets: x86_64-pc-windows-msvc,x86_64-pc-windows-gnu + - name: rustup default stable + run: rustup default stable + - name: cargo update -Zdirect-minimal-versions + run: cargo +nightly update -Zdirect-minimal-versions + - name: cargo test + run: cargo test --locked --all-features --all-targets + - name: Cache Cargo dependencies + uses: Swatinem/rust-cache@v2