123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- on:
- pull_request:
- workflow_dispatch:
- push:
- branches: ["main"]
- env:
- # disable incremental compilation.
- #
- # incremental compilation is useful as part of an edit-build-test-edit cycle,
- # as it lets the compiler avoid recompiling code that hasn't changed. however,
- # on CI, we're not making small edits; we're almost always building the entire
- # project from scratch. thus, incremental compilation on CI actually
- # introduces *additional* overhead to support making future builds
- # faster...but no future builds will ever occur in any given CI environment.
- #
- # see https://matklad.github.io/2021/09/04/fast-rust-builds.html#ci-workflow
- # for details.
- CARGO_INCREMENTAL: 0
- # allow more retries for network requests in cargo (downloading crates) and
- # rustup (installing toolchains). this should help to reduce flaky CI failures
- # from transient network timeouts or other issues.
- CARGO_NET_RETRY: 10
- RUSTUP_MAX_RETRIES: 10
- # don't emit giant backtraces in the CI logs.
- RUST_BACKTRACE: short
- RUSTFLAGS: -Dwarnings
- msrv: 1.57.0
- LOOM_LOG: 'thingbuf=trace,debug'
- name: CI
- jobs:
- changed_paths:
- continue-on-error: true
- runs-on: ubuntu-latest
- outputs:
- should_skip: ${{ steps.skip_check.outputs.should_skip }}
- steps:
- - id: skip_check
- uses: fkirc/skip-duplicate-actions@master
- with:
- do_not_skip: '["workflow_dispatch", "push"]'
- paths: '["**/*.rs", "**/Cargo.toml", ".github/workflows/ci.yml"]'
- build_no_std:
- name: Check no_std
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- strategy:
- matrix:
- feature: [alloc, static]
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Install toolchain
- uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: stable
- override: true
- components: rustfmt
- - uses: actions-rs/cargo@v1
- with:
- command: check
- args: --no-default-features --features ${{ matrix.feature }}
- tests:
- name: Tests
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- strategy:
- matrix:
- # test all Rust versions on Ubuntu
- rust: [stable, 1.57.0]
- os: [ubuntu-latest]
- # test stable Rust on Windows and MacOS as well
- include:
- - rust: stable
- os: windows-latest
- - rust: stable
- os: macos-latest
- runs-on: ${{ matrix.os }}
- steps:
- - uses: actions/checkout@v2
- - name: Install toolchain
- uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: ${{ matrix.rust }}
- override: true
- components: rustfmt
- - name: Run cargo test (with static APIs)
- if: ${{ matrix.rust != env.msrv }}
- uses: actions-rs/cargo@v1
- with:
- command: test
- args: --all-features
- - name: Run cargo test (no static APIs)
- if: ${{ matrix.rust == env.msrv }}
- uses: actions-rs/cargo@v1
- with:
- command: test
- # skip doctests, which require all features to be enabled
- args: --lib --tests
- benches:
- name: Compile benchmarks
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Install stable toolchain
- uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: stable
- override: true
- components: rustfmt
- - name: Run cargo check
- uses: actions-rs/cargo@v1
- with:
- command: check
- args: -p bench --benches
- rustfmt:
- runs-on: ubuntu-latest
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- steps:
- - uses: actions/checkout@v2
- - name: Install stable toolchain
- uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: stable
- override: true
- components: rustfmt
- - name: Run cargo fmt
- uses: actions-rs/cargo@v1
- with:
- command: fmt
- args: --all -- --check
- clippy_check:
- name: Clippy check
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Install stable toolchain
- uses: actions-rs/toolchain@v1
- with:
- toolchain: stable
- components: clippy
- override: true
- - uses: actions-rs/clippy-check@v1
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
- # Run particularly slow loom models individually
- slow_models:
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- strategy:
- matrix:
- model:
- - mpsc_send_recv_wrap
- - mpsc_try_send_recv
- - mpsc_try_recv_ref
- - mpsc_async::rx_close_unconsumed
- - mpsc_blocking::rx_close_unconsumed
- name: model '${{ matrix.model }}''
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Install stable toolchain
- uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: stable
- override: true
- - name: Run model
- run: cargo test --profile loom --lib -- ${{ matrix.model }}
- env:
- # it would be nice to run these with more preemptions, but
- # that makes these models super slow...and LOOM_MAX_PREEMPTIONS=1 is
- # good enough for Tokio's CI, so...
- LOOM_MAX_PREEMPTIONS: 1
- RUSTFLAGS: "--cfg loom"
- # Run other loom models by scope
- models:
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- strategy:
- matrix:
- scope:
- # NOTE: if adding loom models in a new module, that module needs to be
- # added to this list!
- - mpsc_blocking
- - mpsc_async
- - thingbuf
- - util
- name: models in '${{ matrix.scope }}'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Install stable toolchain
- uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: stable
- override: true
- - name: Run models
- run: cargo test --profile loom --lib -- ${{ matrix.scope }}
- env:
- LOOM_MAX_PREEMPTIONS: 2
- # `--cfg ci_skip_slow_models` will exclude the loom models that are
- # tested in `slow-models`.
- RUSTFLAGS: "--cfg loom --cfg ci_skip_slow_models"
- # Dummy job that requires all loom models to pass
- all_models:
- name: all loom models
- runs-on: ubuntu-latest
- needs:
- - slow_models
- - models
- steps:
- - run: exit 0
- miri:
- name: Miri tests
- needs: changed_paths
- if: needs.changed_paths.outputs.should_skip != 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Install nightly toolchain
- uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: nightly
- override: true
- components: miri
- - name: Run Miri tests
- run: cargo miri test --lib --no-fail-fast
- env:
- MIRIFLAGS: -Zmiri-disable-isolation -Zmiri-tag-raw-pointers
|