reduce bench code duplication by using a macro define_benchmark #67
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
push: | |
branches: [ "main" ] | |
pull_request: | |
branches: [ "main" ] | |
env: | |
CARGO_TERM_COLOR: always | |
RUSTFLAGS: -Dwarnings | |
RUST_BACKTRACE: 1 | |
# Change to specific Rust release to pin | |
rust_stable: stable | |
rust_nightly: nightly-2024-05-05 | |
# Pin a specific miri version | |
rust_miri_nightly: nightly-2024-10-21 | |
rust_clippy: '1.77' | |
rust_min: '1.70' | |
jobs: | |
bench: | |
name: benchmarks | |
needs: tests-pass | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
# Nightly Rust is used for cargo llvm-cov --doc below. | |
- name: Install Rust ${{ env.rust_nightly }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.rust_nightly }} | |
components: llvm-tools-preview | |
- uses: Swatinem/rust-cache@v2 | |
- name: Install Dependencies | |
run: | | |
sudo apt update && sudo apt install -y gnuplot pkg-config libssl-dev | |
- name: Build and Run Benchmarks | |
# each sub crate adjust its settings by Cargo.toml | |
run: cargo bench # -v will be too noisy | |
- name: Install cargo-llvm-cov | |
uses: taiki-e/install-action@v2 | |
with: | |
tool: cargo-llvm-cov | |
- name: Send Benchmark Data to InfluxDB, adjust Grafana dashboard's time range, along with collecting coverage data | |
run: | | |
cargo llvm-cov run --release -p bench_util --lcov --output-path lcov_bench_util.info | |
env: | |
INFLUXDB_URL: ${{ secrets.INFLUXDB_URL }} | |
INFLUXDB_TOKEN: ${{ secrets.INFLUXDB_TOKEN }} | |
INFLUXDB_ORG: ${{ secrets.INFLUXDB_ORG }} | |
INFLUXDB_BUCKET: ${{ secrets.INFLUXDB_BUCKET }} | |
GIT_COMMIT_SHA: ${{ github.sha }} | |
GIT_BRANCH: ${{ github.ref_name }} | |
GRAFANA_URL: ${{ secrets.GRAFANA_URL }} | |
GRAFANA_SERVICE_ACCOUNT_TOKEN: ${{ secrets.GRAFANA_SERVICE_ACCOUNT_TOKEN }} | |
GRAFANA_DASHBOARD_UID: ${{ secrets.GRAFANA_DASHBOARD_UID }} | |
- name: Upload coverage data to codecov | |
uses: codecov/codecov-action@v5 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
with: | |
files: lcov_bench_util.info | |
miri: | |
name: miri | |
needs: tests-pass | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Rust ${{ env.rust_miri_nightly }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.rust_miri_nightly }} | |
components: miri | |
- name: Install cargo-nextest | |
uses: taiki-e/install-action@v2 | |
with: | |
tool: cargo-nextest | |
- uses: Swatinem/rust-cache@v2 | |
- name: miri | |
run: | | |
cargo miri nextest run --lib --tests --no-fail-fast | |
env: | |
MIRIFLAGS: -Zmiri-disable-isolation -Zmiri-strict-provenance -Zmiri-retag-fields | |
tests-pass: | |
name: tests-pass | |
runs-on: ubuntu-latest | |
needs: | |
- tests | |
- nextest_with_coverage | |
- asan | |
steps: | |
- run: exit 0 | |
asan: | |
name: asan | |
needs: basics | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install llvm | |
# Required to resolve symbols in sanitizer output | |
run: sudo apt-get install -y llvm | |
- name: Install Rust ${{ env.rust_nightly }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.rust_nightly }} | |
- uses: Swatinem/rust-cache@v2 | |
- name: asan | |
run: cargo test --workspace --all-features --target x86_64-unknown-linux-gnu --tests -- --test-threads 1 --nocapture | |
env: | |
RUSTFLAGS: -Z sanitizer=address | |
# Ignore `trybuild` errors as they are irrelevant and flaky on nightly | |
TRYBUILD: overwrite | |
nextest_with_coverage: | |
name: nextest_with_coverage | |
needs: | |
- basics | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
# Nightly Rust is used for cargo llvm-cov --doc below. | |
- name: Install Rust ${{ env.rust_nightly }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.rust_nightly }} | |
components: llvm-tools-preview | |
- uses: Swatinem/rust-cache@v2 | |
- name: Install cargo-nextest | |
uses: taiki-e/install-action@v2 | |
with: | |
tool: cargo-nextest | |
- name: Install cargo-llvm-cov | |
uses: taiki-e/install-action@v2 | |
with: | |
tool: cargo-llvm-cov | |
- name: Collect coverage data | |
# Generate separate reports for nextest and doctests, and combine them. | |
run: | | |
cargo llvm-cov --no-report nextest | |
cargo llvm-cov --no-report --doc | |
cargo llvm-cov report --doctests --lcov --output-path lcov.info | |
- name: Upload coverage data to codecov | |
uses: codecov/codecov-action@v5 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
with: | |
files: lcov.info | |
tests: | |
name: tests | |
runs-on: ubuntu-latest | |
needs: | |
- basics | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Rust ${{ env.rust_stable }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.rust_stable }} | |
- uses: Swatinem/rust-cache@v2 | |
# Test **all** crates in the workspace with all features. | |
- name: test all --all-features | |
run: | | |
cargo test --workspace --all-features | |
# Basic actions that must pass before we kick off more expensive tests. | |
basics: | |
name: basic checks | |
runs-on: ubuntu-latest | |
needs: | |
- clippy | |
- rustfmt | |
- markdownlint | |
steps: | |
- run: exit 0 | |
rustfmt: | |
name: rustfmt | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Rust ${{ env.rust_stable }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.rust_stable }} | |
components: rustfmt | |
- uses: Swatinem/rust-cache@v2 | |
# Check rustfmt | |
- name: "rustfmt --check" | |
# Workaround for rust-lang/cargo#7732 | |
run: | | |
if ! rustfmt --check --edition 2021 $(git ls-files '*.rs'); then | |
printf "Please run \`rustfmt --edition 2021 \$(git ls-files '*.rs')\` to fix rustfmt errors.\n" >&2 | |
exit 1 | |
fi | |
clippy: | |
name: clippy | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Rust ${{ env.rust_clippy }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.rust_clippy }} | |
components: clippy | |
- uses: Swatinem/rust-cache@v2 | |
# Run clippy | |
- name: "clippy --all" | |
run: cargo clippy --all --tests --all-features --no-deps | |
markdownlint: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set up Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: latest | |
- name: Install markdownlint-cli | |
run: npm install -g markdownlint-cli | |
- name: Run markdownlint | |
run: markdownlint '**/*.md' --ignore node_modules |