Continuous Integration #309
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
# There are two kinds of continuous integration jobs in this project: | |
# | |
# - Every code submission or master push passes continuous integration on the | |
# minimal supported Rust version and the current stable Rust version. | |
# - Two times a month, a scheduled job makes sure that the code remains | |
# compatible and lint-free on upcoming Rust toolchains (beta and nightly). | |
name: Continuous Integration | |
on: | |
push: | |
pull_request: | |
schedule: | |
- cron: '0 0 13/15 * *' | |
# Cancel existing jobs on new pushes to the same branch | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
env: | |
CARGO_INCREMENTAL: 0 | |
RUSTFLAGS: -D warnings | |
RUSTDOCFLAGS: -D warnings | |
MINIMAL_RUST: 1.75.0 # Minimal Supported Rust Version | |
jobs: | |
# Workaround for github CI dropping env var expansion in matrix strategy | |
matrix_vars: | |
runs-on: ubuntu-latest | |
outputs: | |
MINIMAL_RUST: ${{ env.MINIMAL_RUST }} | |
steps: | |
- name: Forward env var to output | |
run: echo "MINIMAL_RUST=${{ env.MINIMAL_RUST }}" >> $GITHUB_OUTPUT | |
# Formatting and dependency checking doesn't depend on configuration, and we | |
# only care about the formatting rules of the latest supported Rust version | |
format-machete: | |
# Don't run CI twice when a PR is created from a branch internal to the repo | |
if: github.event_name == 'push' || github.event_name == 'schedule' || github.event.pull_request.head.repo.full_name != github.repository | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Set up stable toolchain | |
if: github.event_name != 'schedule' | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
components: rustfmt | |
- name: Set up nightly toolchain | |
if: github.event_name == 'schedule' | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
toolchain: nightly | |
components: rustfmt | |
- name: Check code formatting | |
run: cargo fmt --all --check | |
- name: Set up cargo-binstall | |
run: curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash | |
- name: Look for unused dependencies with cargo-machete | |
run: | | |
# FIXME: --force used as a workaround for https://github.com/Swatinem/rust-cache/issues/204 | |
cargo binstall -y --force cargo-machete | |
cargo machete | |
# Lints should cover all cfg code paths | |
# | |
# We don't care about warnings on the minimum supported Rust version, only | |
# about building and running correctly. | |
lints: | |
if: github.event_name == 'push' || github.event_name == 'schedule' || github.event.pull_request.head.repo.full_name != github.repository | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
features: | |
- 'compute_naive' | |
- 'compute_naive,weights-runtime' | |
- 'compute_regular' | |
- 'compute_manualvec' | |
- 'compute_autovec' | |
- 'compute_block' | |
- 'compute_parallel' | |
- 'compute_gpu_naive' | |
- 'compute_gpu_specialized' | |
- 'compute_gpu_specialized,gpu-debug-utils' | |
env: | |
JOB_FLAGS: '--workspace --features=${{ matrix.features }}' | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Install native dependencies | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
version: 1.0 | |
packages: libhdf5-dev libhwloc-dev libudev-dev ninja-build vulkan-validationlayers-dev libvulkan-dev vulkan-tools | |
- name: Set up stable toolchain | |
if: github.event_name != 'schedule' | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
components: clippy | |
- name: Set up nightly toolchain | |
if: github.event_name == 'schedule' | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
toolchain: nightly | |
components: clippy | |
- name: Check clippy lints | |
run: cargo clippy ${{ env.JOB_FLAGS }} --all-targets -- -D warnings | |
- name: Build docs | |
run: cargo doc ${{ env.JOB_FLAGS }} | |
# Run the tests on all supported Rust versions (main CI) | |
test-contrib: | |
# Don't run CI twice when a PR is created from a branch internal to the repo | |
# Don't run in scheduled jobs, that's what test-scheduled is for | |
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository | |
runs-on: ubuntu-latest | |
needs: matrix_vars | |
strategy: | |
matrix: | |
toolchain: | |
- ${{ needs.matrix_vars.outputs.MINIMAL_RUST }} | |
- stable | |
features: | |
- 'compute_naive' | |
- 'compute_naive,weights-runtime' | |
- 'compute_gpu_specialized,gpu-debug-utils' | |
env: | |
FEATURES_FLAG: '--features=${{ matrix.features }}' | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Install native dependencies | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
version: 1.0 | |
packages: libhdf5-dev libhwloc-dev libudev-dev ninja-build vulkan-validationlayers-dev libvulkan-dev vulkan-tools | |
- name: Set up toolchain | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
toolchain: ${{ matrix.toolchain }} | |
- name: Run unit tests | |
run: cargo test --workspace ${{ env.FEATURES_FLAG }} | |
# Run a small simulation on all supported Rust versions (main CI) | |
# | |
# FIXME: There should be a way to use conditional build matrices without | |
# duplicating the whole job recipe... | |
# | |
test-simulate: | |
# Don't run CI twice when a PR is created from a branch internal to the repo | |
# Don't run in scheduled jobs, that's what test-scheduled is for | |
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository | |
runs-on: ubuntu-latest | |
needs: matrix_vars | |
strategy: | |
matrix: | |
toolchain: | |
- ${{ needs.matrix_vars.outputs.MINIMAL_RUST }} | |
- stable | |
features: | |
- 'compute_naive' | |
- 'compute_naive,weights-runtime' | |
- 'compute_regular' | |
- 'compute_manualvec' | |
- 'compute_autovec' | |
- 'compute_block' | |
- 'compute_parallel' | |
# FIXME: Must get a working Vulkan impl in CI for this, and for some | |
# unknown reason llvmpipe doesn't cut it there even though it | |
# does in a local ubuntu:22.04 image... :( | |
# - 'compute_gpu_naive' | |
# - 'compute_gpu_specialized' | |
# - 'compute_gpu_specialized,gpu-debug-utils' | |
env: | |
FEATURES_FLAG: '--features=${{ matrix.features }}' | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Install native dependencies | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
version: 1.0 | |
packages: libhdf5-dev libhwloc-dev libudev-dev ninja-build vulkan-validationlayers-dev libvulkan-dev vulkan-tools | |
- name: Set up toolchain | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
toolchain: ${{ matrix.toolchain }} | |
- name: Run a tiny simulation job | |
run: cargo run ${{ env.FEATURES_FLAG }} --bin simulate -- -n 10 | |
- name: Translate simulation output to images | |
run: mkdir out && cargo run ${{ env.FEATURES_FLAG }} --bin data-to-pics -- -o out | |
# Check benchmarks build on all supported Rust versions (main CI) | |
# | |
# FIXME: There should be a way to use conditional build matrices without | |
# duplicating the whole job recipe... | |
# | |
test-bench-build: | |
# Don't run CI twice when a PR is created from a branch internal to the repo | |
# Don't run in scheduled jobs, that's what test-scheduled is for | |
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository | |
runs-on: ubuntu-latest | |
needs: matrix_vars | |
strategy: | |
matrix: | |
toolchain: | |
- ${{ needs.matrix_vars.outputs.MINIMAL_RUST }} | |
- stable | |
features: | |
- 'compute_naive' | |
- 'compute_naive,weights-runtime' | |
- 'compute_gpu_specialized,gpu-debug-utils' | |
env: | |
FEATURES_FLAG: '--features=${{ matrix.features }}' | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Install native dependencies | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
version: 1.0 | |
packages: libhdf5-dev libhwloc-dev libudev-dev ninja-build vulkan-validationlayers-dev libvulkan-dev vulkan-tools | |
- name: Set up toolchain | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
toolchain: ${{ matrix.toolchain }} | |
- name: Install cargo-criterion | |
uses: baptiste0928/cargo-install@v3 | |
with: | |
crate: cargo-criterion | |
- name: Check that benchmarks build | |
run: cargo criterion --no-run ${{ env.FEATURES_FLAG }} | |
# Check compatibility with newer Rust/deps versions (scheduled CI) | |
# | |
# We aren't concerned about trashing the cargo cache here since these jobs | |
# only run occasionally, so the extra convenience and maintainability of | |
# grouping debug and release tests trumps other considerations. | |
# | |
# FIXME: There should be a way to use conditional build matrices without | |
# duplicating the whole job recipe... | |
# | |
test-scheduled: | |
if: github.event_name == 'schedule' | |
runs-on: ubuntu-latest | |
needs: matrix_vars | |
strategy: | |
matrix: | |
toolchain: | |
- beta | |
- nightly | |
- ${{ needs.matrix_vars.outputs.MINIMAL_RUST }} | |
features: | |
- 'compute_naive' | |
- 'compute_naive,weights-runtime' | |
- 'compute_regular' | |
- 'compute_manualvec' | |
- 'compute_autovec' | |
- 'compute_block' | |
- 'compute_parallel' | |
# FIXME: Must get a working Vulkan impl in CI for this, and for some | |
# unknown reason llvmpipe doesn't cut it there even though it | |
# does in a local ubuntu:22.04 image... :( | |
# - 'compute_gpu_naive' | |
# - 'compute_gpu_specialized' | |
# - 'compute_gpu_specialized,gpu-debug-utils' | |
env: | |
FEATURES_FLAG: '--features=${{ matrix.features }}' | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Install native dependencies | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
version: 1.0 | |
packages: libhdf5-dev libhwloc-dev libudev-dev ninja-build vulkan-validationlayers-dev libvulkan-dev vulkan-tools | |
- name: Set up toolchain | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
toolchain: ${{ matrix.toolchain }} | |
- name: Run unit tests | |
run: cargo test --workspace ${{ env.FEATURES_FLAG }} | |
- name: Run a tiny simulation job | |
run: cargo run --bin simulate ${{ env.FEATURES_FLAG }} -- -n 10 | |
- name: Translate simulation output to images | |
run: mkdir out && cargo run --bin data-to-pics -- -o out | |
- name: Install cargo-criterion | |
uses: baptiste0928/cargo-install@v3 | |
with: | |
crate: cargo-criterion | |
- name: Check that benchmarks build | |
run: cargo criterion --no-run |