version: 2.1
parameters:
nightly-version:
type: string
default: "nightly-2020-11-20"
executors:
default:
machine:
image: ubuntu-1604-cuda-10.1:201909-23
working_directory: ~/gpuci
resource_class: gpu.nvidia.medium
restore-workspace: &restore-workspace
attach_workspace:
at: ~/
restore-cache: &restore-cache
restore_cache:
keys:
- cargo-v1-{{ checksum "rust-toolchain" }}-{{ checksum "Cargo.toml" }}-{{ checksum "Cargo.lock" }}-{{ arch }}
- repo-source-{{ .Branch }}-{{ .Revision }}
commands:
set-env-path:
steps:
- run:
name: Set the PATH env variable
command: |
# Also put the Rust LLVM tools into the PATH.
echo 'export PATH="$HOME:~/.cargo/bin:~/.rustup/toolchains/<< pipeline.parameters.nightly-version >>-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:$PATH"' | tee --append $BASH_ENV
source $BASH_ENV
install-gpu-deps:
steps:
- run:
name: Install libraries for GPU tests
command: |
sudo apt-get update -y
sudo apt install -y ocl-icd-opencl-dev
test_target_pairing:
parameters:
target:
type: string
steps:
- *restore-workspace
- *restore-cache
- run:
name: Test pairing (<< parameters.target >>)
command: TARGET=<< parameters.target >> cargo test --no-default-features --features pairing
no_output_timeout: 15m
test_target_pairing_gpu:
parameters:
target:
type: string
steps:
- *restore-workspace
- *restore-cache
- run:
name: Test pairing (GPU) (<< parameters.target >>)
command: TARGET=<< parameters.target >> cargo test --release --no-default-features --features gpu,pairing
no_output_timeout: 30m
test_target_blst:
parameters:
target:
type: string
steps:
- *restore-workspace
- *restore-cache
- run:
name: Test blst (<< parameters.target >>)
command: TARGET=<< parameters.target >> cargo test --no-default-features --features blst
no_output_timeout: 15m
test_target_blst_gpu:
parameters:
target:
type: string
steps:
- *restore-workspace
- *restore-cache
- run:
name: Test blst (GPU) (<< parameters.target >>)
command: TARGET=<< parameters.target >> cargo test --release --no-default-features --features gpu,blst
no_output_timeout: 30m
jobs:
cargo_fetch:
executor: default
steps:
- checkout
- run: curl https://sh.rustup.rs -sSf | sh -s -- -y
- set-env-path
- run: echo $HOME
- run: cargo --version
- run: rustc --version
- run:
name: Update submodules
command: git submodule update --init --recursive
- run:
name: Calculate dependencies
command: cargo generate-lockfile
- restore_cache:
keys:
- cargo-v1-{{ checksum "rust-toolchain" }}-{{ checksum "Cargo.toml" }}-{{ checksum "Cargo.lock" }}-{{ arch }}
- run: cargo update
- run: cargo fetch
- run: rustup install $(cat rust-toolchain)
- run: rustup default $(cat rust-toolchain)
- run: rustup toolchain install --profile minimal << pipeline.parameters.nightly-version >>
- run: rustup component add rustfmt-preview
- run: rustup component add clippy-preview
- run: rustup component add --toolchain << pipeline.parameters.nightly-version >> llvm-tools-preview
- run: rustc --version
- run: rm -rf .git
- persist_to_workspace:
root: ~/
paths:
- gpuci
- save_cache:
key: cargo-v1-{{ checksum "rust-toolchain" }}-{{ checksum "Cargo.toml" }}-{{ checksum "Cargo.lock" }}-{{ arch }}
paths:
- "~/.cargo"
- "~/.rustup"
test_pairing_x86_64-unknown-linux-gnu:
executor: default
steps:
- set-env-path
- install-gpu-deps
- test_target_pairing:
target: "x86_64-unknown-linux-gnu"
test_pairing_gpu_x86_64-unknown-linux-gnu:
executor: default
steps:
- set-env-path
- install-gpu-deps
- test_target_pairing_gpu:
target: "x86_64-unknown-linux-gnu"
test_blst_x86_64-unknown-linux-gnu:
executor: default
steps:
- set-env-path
- install-gpu-deps
- test_target_blst:
target: "x86_64-unknown-linux-gnu"
test_blst_gpu_x86_64-unknown-linux-gnu:
executor: default
steps:
- set-env-path
- install-gpu-deps
- test_target_blst_gpu:
target: "x86_64-unknown-linux-gnu"
rustfmt:
executor: default
steps:
- *restore-workspace
- *restore-cache
- set-env-path
- run:
name: Run cargo fmt
command: cargo fmt --all -- --check
clippy:
executor: default
steps:
- *restore-workspace
- *restore-cache
- set-env-path
- run:
name: Run cargo clippy (blst)
command: cargo clippy --no-default-features --features blst
- run:
name: Run cargo clippy (pairing)
command: cargo clippy --no-default-features --features pairing
- run:
name: Run cargo clippy (gpu)
command: cargo clippy --features gpu
build_blst:
executor: default
steps:
- *restore-workspace
- *restore-cache
- set-env-path
- run:
name: Run cargo release build
command: cargo build --release --no-default-features --features blst
build_pairing:
executor: default
steps:
- *restore-workspace
- *restore-cache
- set-env-path
- run:
name: Run cargo release build
command: cargo build --release --no-default-features --features pairing
coverage_run:
executor: default
parameters:
cargo-args:
description: Addtional arguments for the cargo command
type: string
default: ""
test-args:
description: Additional arguments for the test executable (after the `--`)
type: string
default: ""
environment:
CARGO_INCREMENTAL: 0
RUSTFLAGS: -Zinstrument-coverage -Ccodegen-units=1 -Copt-level=0 -Clink-dead-code -Coverflow-checks=off -Cinline-threshold=0
LLVM_PROFILE_FILE: "%m.profraw"
steps:
- *restore-workspace
- *restore-cache
- set-env-path
- install-gpu-deps
- run:
name: Generate coverage report
command: |
RUST_LOG=info cargo +<< pipeline.parameters.nightly-version >> test --features _coverage << parameters.cargo-args >> -- --nocapture << parameters.test-args >>
# Do *not* use sparse output. It leads to more lines that are not
# taken into account at all
llvm-profdata merge --output=default.profdata ./*.profraw
# The compiled files contain the coverage information. From running the tests we don't
# know what those files are called, hence use all files from the `./target/debug/deps`
# directory which don't have an extension.
OBJECT_FILES=$(find ./target/debug/deps/* -name '*' -not -name '*\.*' -printf '%p,'|head --bytes -1)
# Only export the coverage of this project, we don't care about coverage of
# dependencies
llvm-cov export --ignore-filename-regex=".cargo|.rustup" --format=lcov -instr-profile=default.profdata --object=${OBJECT_FILES} > lcov.info
workflows:
version: 2.1
test:
jobs:
- cargo_fetch
- rustfmt:
requires:
- cargo_fetch
- clippy:
requires:
- cargo_fetch
- test_pairing_x86_64-unknown-linux-gnu:
requires:
- cargo_fetch
- test_pairing_gpu_x86_64-unknown-linux-gnu:
requires:
- cargo_fetch
- test_blst_x86_64-unknown-linux-gnu:
requires:
- cargo_fetch
- test_blst_gpu_x86_64-unknown-linux-gnu:
requires:
- cargo_fetch
- build_blst:
requires:
- cargo_fetch
- build_pairing:
requires:
- cargo_fetch