Newer
Older
# .gitlab-ci.yml
#
# ink
#
# pipelines can be triggered manually in the web
stages:
CARGO_INCREMENTAL: 0
CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_COMMIT_REF_NAME}/${CI_JOB_NAME}"
CARGO_TARGET_DIR: "/ci-cache/${CI_PROJECT_NAME}/targets/${CI_COMMIT_REF_NAME}/${CI_JOB_NAME}"
PURELY_STD_CRATES: "lang/codegen metadata"
ALSO_WASM_CRATES: "env storage storage/derive allocator prelude primitives lang lang/macro lang/ir"
ALL_CRATES: "${PURELY_STD_CRATES $ALSO_WASM_CRATES}"
workflow:
rules:
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH
.collect-artifacts: &collect-artifacts
artifacts:
name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}"
when: on_success
expire_in: 7 days
paths:
- artifacts/
.docker-env: &docker-env
image: paritytech/ink-ci-linux:latest
rules:
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_COMMIT_REF_NAME == "master"
- if: $CI_COMMIT_REF_NAME == "tags"
- if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1
- runner_system_failure
- unknown_failure
- api_failure
cargo check --verbose --all-features --manifest-path crates/${crate}/Cargo.toml;
- for crate in ${ALSO_WASM_CRATES}; do
cargo check --verbose --no-default-features --target wasm32-unknown-unknown --manifest-path crates/${crate}/Cargo.toml;
- job: check-std
artifacts: false
cargo build --verbose --all-features --release --manifest-path crates/${crate}/Cargo.toml;
- job: check-wasm
artifacts: false
- for crate in ${ALSO_WASM_CRATES}; do
cargo build --verbose --no-default-features --release --target wasm32-unknown-unknown --manifest-path crates/${crate}/Cargo.toml;
- job: check-std
artifacts: false
variables:
# Since we run the tests with `--all-features` this implies the feature
# `ink-fuzz-tests` as well -- i.e. the fuzz tests are run.
# There's no way to disable a single feature while enabling all features
# at the same time, hence we use this workaround.
QUICKCHECK_TESTS: 0
- cargo test --verbose --all-features --no-fail-fast --workspace
codecov:
stage: workspace
<<: *docker-env
needs:
- job: check-std
artifacts: false
# For codecov it's sufficient to run the fuzz tests only once.
# Variables partly came from https://github.com/mozilla/grcov/blob/master/README.md
RUSTFLAGS: "-Zprofile -Zmir-opt-level=0 -Ccodegen-units=1
-Copt-level=0 -Clink-dead-code -Coverflow-checks=off"
# The `cargo-taurpalin` coverage reporting tool seems to have better code instrumentation and thus
# produces better results for Rust codebases in general. However, unlike `grcov` it requires
# running docker with `--security-opt seccomp=unconfined` which is why we use `grcov` instead.
before_script:
- cargo -vV
- rustc -vV
- rustup show
- bash --version
script:
# RUSTFLAGS are the cause target cache can't be used here
- cargo build --verbose --all-features --workspace
- cargo test --verbose --all-features --no-fail-fast --workspace
# coverage with branches
- grcov ./target -s . -t lcov --llvm --branch --ignore-not-existing --ignore "/*" --ignore "tests/*" -o lcov-w-branch.info
- rust-covfix -o lcov-w-branch.info lcov-w-branch.info
# We'd like to not use a remote bash script for uploading the coverage reports,
# however this job seems to be more tricky than we hoped.
- bash <(curl -s https://codecov.io/bash) -t "$CODECOV_P_TOKEN" -f lcov-w-branch.info
# lines coverage
- grcov ./target -s . -t lcov --llvm --ignore-not-existing --ignore "/*" --ignore "tests/*" -o lcov-lines.info
- rust-covfix -o lcov-lines.info lcov-lines.info
- bash <(curl -s https://codecov.io/bash) -f lcov-lines.info
- job: check-std
artifacts: false
cargo clippy --verbose --all-features --manifest-path crates/${crate}/Cargo.toml -- -D warnings;
- job: check-wasm
artifacts: false
- for crate in ${ALSO_WASM_CRATES}; do
cargo clippy --verbose --no-default-features --manifest-path crates/${crate}/Cargo.toml --target wasm32-unknown-unknown -- -D warnings;
.update-cargo-contract: &update-cargo-contract
# `cargo install` returns an error if there is nothing to update, so have to suppress it here temporarily
# restore this once ink! 3.0 is published and the new version of cargo-contract has been released to crates.io
# - cargo install cargo-contract || echo $?
- cargo install --git https://github.com/paritytech/cargo-contract --tag ink-ci || echo $?
- job: clippy-std
artifacts: false
- for example in examples/*/; do
cargo test --verbose --manifest-path ${example}/Cargo.toml;
- for example in examples/*/; do
cargo fmt --verbose --manifest-path ${example}/Cargo.toml -- --check;
- job: clippy-std
artifacts: false
- for example in examples/*/; do
cargo clippy --verbose --manifest-path ${example}/Cargo.toml -- -D warnings;
done
examples-clippy-wasm:
stage: examples
<<: *docker-env
script:
- for example in examples/*/; do
cargo clippy --verbose --manifest-path ${example}/Cargo.toml --no-default-features --target wasm32-unknown-unknown -- -D warnings;
done
examples-contract-build:
stage: examples
<<: *docker-env
script:
- for example in examples/*/; do
pushd $example &&
cargo contract build &&
popd;
done
- job: build-wasm
artifacts: false
- for example in examples/*/; do
#### stage: publish
publish-docs:
stage: publish
<<: *docker-env
rules:
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_COMMIT_REF_NAME == "master"
- if: $CI_COMMIT_REF_NAME == "tags"
# Set git config
- rm .git/config
- git config user.email "devops-team@parity.io"
- git config user.name "${GITHUB_USER}"
- git config remote.origin.url "https://${GITHUB_TOKEN}@github.com/paritytech/ink.git"
- git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
- git fetch origin gh-pages
-p scale-info -p ink_metadata
-p ink_env -p ink_storage -p ink_storage_derive
-p ink_primitives -p ink_prelude
-p ink_lang -p ink_lang_macro -p ink_lang_ir -p ink_lang_codegen
# saving README and docs
- mv target/doc/ /tmp/
- cp README.md /tmp/doc/
- mv _config.yml /tmp/doc/
# remove everything and restore generated docs, README and Jekyll config
- git commit -m "Updated docs for ${CI_COMMIT_REF_NAME} and pushed to gh-pages"
#### stage: fuzz
fuzz-tests:
stage: fuzz
<<: *docker-env
variables:
# The QUICKCHECK_TESTS default is 100
QUICKCHECK_TESTS: 50000
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_COMMIT_REF_NAME == "master"
script:
# We fuzz-test only crates which possess the `ink-fuzz-tests` feature
- all_tests_passed=0
- for crate in ${ALL_CRATES}; do
if grep "ink-fuzz-tests =" crates/${crate}/Cargo.toml;
then
cargo test --verbose --features ink-fuzz-tests --manifest-path crates/${crate}/Cargo.toml --no-fail-fast -- fuzz_;
let "all_tests_passed |= $?";
fi
done
- if [ $all_tests_passed -eq 0 ]; then exit 0; fi
- |
curl -X "POST" "https://api.github.com/repos/paritytech/ink/issues?state=all" \
-H "Cookie: logged_in=no" \
-H "Authorization: token ${GITHUB_TOKEN}" \
-H "Content-Type: text/plain; charset=utf-8" \
-d $'{
"title": "[ci] Failing fuzz tests on master ('"$( date +"%d %b %Y" )"'),
"body": "This CI job '"${CI_JOB_ID}"' just failed: '"${CI_JOB_URL}"'.\n\nThe offending commit is `['"${CI_COMMIT_TITLE}"'](https://github.com/paritytech/ink/commit/'"${CI_COMMIT_SHA}"')`.",
"assignees": [],
"labels": [
"P-high"
]
}'