1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
merge_group:
name: CI
env:
CARGO_TERM_COLOR: always
CARGO_INCREMENTAL: 0
jobs:
tests:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- rust: 1.82.0 # MSRV
features:
- rust: stable
features: arbitrary
- rust: stable
features: quickcheck
- rust: stable
features: rayon
- rust: stable
features: serde
- rust: stable
features: sval
- rust: stable
features: borsh
- rust: stable
features: std
- rust: beta
features:
- rust: nightly
bench: test build benchmarks
steps:
- uses: actions/checkout@v4
- name: Lock MSRV-compatible dependencies
if: matrix.rust == '1.82.0'
env:
CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS: fallback
# Note that this uses the runner's pre-installed stable cargo
run: cargo generate-lockfile
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
- name: Tests
run: |
cargo build --verbose --features "${{ matrix.features }}"
cargo doc --verbose --features "${{ matrix.features }}"
cargo test --verbose --features "${{ matrix.features }}"
cargo test --release --verbose --features "${{ matrix.features }}"
- name: Tests (serde)
if: matrix.features == 'serde'
run: |
cargo test --verbose -p test-serde
- name: Tests (sval)
if: matrix.features == 'sval'
run: |
cargo test --verbose -p test-sval
- name: Test run benchmarks
if: matrix.bench != ''
run: cargo test -v --benches
nostd_build:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- rust: 1.82.0
target: thumbv6m-none-eabi
- rust: stable
target: thumbv6m-none-eabi
steps:
- uses: actions/checkout@v4
- name: Lock MSRV-compatible dependencies
if: matrix.rust == '1.82.0'
env:
CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS: fallback
# Note that this uses the runner's pre-installed stable cargo
run: cargo generate-lockfile
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
target: ${{ matrix.target }}
- name: Tests
run: |
cargo build -vv --target=${{ matrix.target }} --no-default-features
cargo build -v -p test-nostd --target=${{ matrix.target }}
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@beta
with:
components: clippy
- run: cargo clippy --all-features
miri:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
with:
components: miri, rust-src
- uses: taiki-e/install-action@v2
with:
tool: cargo-nextest
if: github.event_name == 'merge_group'
- run: cargo miri nextest run
if: github.event_name == 'merge_group'
- run: cargo miri test --doc
minimal-versions:
name: Check MSRV and minimal-versions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: dtolnay/rust-toolchain@1.82.0 # MSRV
- uses: taiki-e/install-action@v2
with:
tool: cargo-hack
- name: Lock minimal direct dependencies
run: cargo +nightly hack generate-lockfile --remove-dev-deps -Z direct-minimal-versions
env:
CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS: fallback
- name: Build (nightly)
run: cargo +nightly build --verbose --all-features
- name: Build (MSRV)
run: cargo build --verbose --features arbitrary,quickcheck,serde,sval,rayon
# 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: [tests, nostd_build, clippy, miri, minimal-versions]
# 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) }}'
|