Skip to content

Continuous Integration #309

Continuous Integration

Continuous Integration #309

Workflow file for this run

# 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