# .gitlab-ci.yml # # ink # # pipelines can be triggered manually in the web stages: - check - workspace - examples - fuzz - publish variables: GIT_STRATEGY: fetch GIT_DEPTH: 100 CARGO_INCREMENTAL: 0 CARGO_TARGET_DIR: "/ci-cache/${CI_PROJECT_NAME}/targets/${CI_COMMIT_REF_NAME}/${CI_JOB_NAME}" CI_IMAGE: "paritytech/ink-ci-linux:production" PURELY_STD_CRATES: "lang/codegen metadata" ALSO_WASM_CRATES: "env storage storage/derive allocator prelude primitives lang lang/macro lang/ir" # this var is changed to "-:staging" when the CI image gets rebuilt # read more https://github.com/paritytech/scripts/pull/244 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: "${CI_IMAGE}" before_script: - cargo -vV - rustc -vV - rustup show - bash --version - ./scripts/pre_cache.sh - sccache -s 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 =~ /^[0-9]+$/ # PRs - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 interruptible: true retry: max: 2 when: - runner_system_failure - unknown_failure - api_failure tags: - linux-docker #### stage: check check-std: stage: check <<: *docker-env script: - for crate in ${ALL_CRATES}; do cargo check --verbose --all-features --manifest-path crates/${crate}/Cargo.toml; done check-wasm: stage: check <<: *docker-env script: - for crate in ${ALSO_WASM_CRATES}; do cargo check --verbose --no-default-features --target wasm32-unknown-unknown --manifest-path crates/${crate}/Cargo.toml; done #### stage: workspace build-std: stage: workspace <<: *docker-env needs: - job: check-std artifacts: false script: - for crate in ${ALL_CRATES}; do cargo build --verbose --all-features --release --manifest-path crates/${crate}/Cargo.toml; done build-wasm: stage: workspace <<: *docker-env needs: - job: check-wasm artifacts: false script: - for crate in ${ALSO_WASM_CRATES}; do cargo build --verbose --no-default-features --release --target wasm32-unknown-unknown --manifest-path crates/${crate}/Cargo.toml; done test: stage: workspace <<: *docker-env needs: - 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 script: - cargo test --verbose --all-features --no-fail-fast --workspace docs: stage: workspace <<: *docker-env variables: RUSTDOCFLAGS: -Dwarnings artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" when: on_success expire_in: 7 days paths: - ./crate-docs/ script: - cargo doc --no-deps --all-features -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 - mv ${CARGO_TARGET_DIR}/doc ./crate-docs spellcheck: stage: workspace <<: *docker-env rules: - if: $CI_PIPELINE_SOURCE == "pipeline" when: never script: - cargo spellcheck check --cfg=.config/cargo_spellcheck.toml --checkers hunspell --code 1 codecov: stage: workspace <<: *docker-env needs: - job: check-std artifacts: false variables: # For codecov it's sufficient to run the fuzz tests only once. QUICKCHECK_TESTS: 1 # Variables partly came from https://github.com/mozilla/grcov/blob/master/README.md CARGO_INCREMENTAL: 0 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 - unset "CARGO_TARGET_DIR" - cargo clean 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 . --source-dir . --output-type lcov --llvm --branch --ignore-not-existing --ignore "/*" --ignore "tests/*" --output-path lcov-w-branch.info - rust-covfix lcov-w-branch.info --output lcov-w-branch-fixed.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-fixed.info # lines coverage - grcov . --source-dir . --output-type lcov --llvm --ignore-not-existing --ignore "/*" --ignore "tests/*" --output-path lcov-lines.info - rust-covfix lcov-lines.info --output lcov-lines-fixed.info - bash <(curl -s https://codecov.io/bash) -f lcov-lines-fixed.info clippy-std: stage: workspace <<: *docker-env needs: - job: check-std artifacts: false script: - for crate in ${ALL_CRATES}; do cargo clippy --verbose --all-features --manifest-path crates/${crate}/Cargo.toml -- -D warnings; done clippy-wasm: stage: workspace <<: *docker-env needs: - job: check-wasm artifacts: false script: - 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; done fmt: stage: workspace <<: *docker-env script: - cargo fmt --verbose --all -- --check # For the UI tests we need to disable the license check - cargo fmt --verbose --all -- --check --config=license_template_path="" crates/lang/macro/tests/ui/{pass,fail}/*.rs #### stage: examples examples-test: stage: examples <<: *docker-env needs: - job: clippy-std artifacts: false script: - for example in examples/*/; do cargo test --verbose --manifest-path ${example}/Cargo.toml; done examples-fmt: stage: examples <<: *docker-env script: - for example in examples/*/; do cargo fmt --verbose --manifest-path ${example}/Cargo.toml -- --check; done examples-clippy-std: stage: examples <<: *docker-env needs: - job: clippy-std artifacts: false script: - 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: - cargo contract -V - for example in examples/*/; do pushd $example && cargo contract build && popd; done examples-docs: stage: examples <<: *docker-env variables: RUSTDOCFLAGS: -Dwarnings script: # `--document-private-items` needs to be in here because currently our contract macro # puts the contract functions in a private module. # Once https://github.com/paritytech/ink/issues/336 has been implemented we can get rid # of this flag. - for example in examples/*/; do cargo doc --manifest-path ${example}/Cargo.toml --document-private-items --verbose --no-deps; done #### stage: publish publish-docs: stage: publish <<: *docker-env needs: - job: docs artifacts: true variables: GIT_DEPTH: 0 GIT_STRATEGY: none rules: - if: $CI_PIPELINE_SOURCE == "web" - if: $CI_PIPELINE_SOURCE == "schedule" - if: $CI_COMMIT_REF_NAME == "master" - if: $CI_COMMIT_REF_NAME == "tags" script: - rm -rf /tmp/* - unset CARGO_TARGET_DIR # 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 # saving README and docs - cp -r ./crate-docs/ /tmp/doc/ - cp README.md /tmp/doc/ - cp -r .images/ /tmp/doc/ - git checkout gh-pages - mv _config.yml /tmp/doc/ # remove everything and restore generated docs, README and Jekyll config - rm -rf ./* - rm -rf ./.images - mv /tmp/doc/* . - mv /tmp/doc/.images . # Upload files - git add --all --force - git status - git commit -m "Updated docs for ${CI_COMMIT_REF_NAME} and pushed to gh-pages" - git push origin gh-pages --force after_script: - rm -rf .git/ ./* #### stage: fuzz fuzz-tests: stage: fuzz <<: *docker-env variables: # The QUICKCHECK_TESTS default is 100 QUICKCHECK_TESTS: 40000 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_ || exit_code=$?; all_tests_passed=$(( all_tests_passed | exit_code )); fi done - if [ $all_tests_passed -eq 0 ]; then exit 0; fi - | curl -X "POST" "https://api.github.com/repos/paritytech/ink/issues" \ -H "Cookie: logged_in=no" \ -H "Authorization: token ${GITHUB_TOKEN}" \ -H "Content-Type: application/json; charset=utf-8" \ -d $'{ "title": "[ci] Failing fuzz tests on master ('"$( date +"%d %b %Y" )"')", "body": "The CI job ['"${CI_JOB_ID}"']('"${CI_JOB_URL}"') just failed.\n\nThe offending commit is ['"${CI_COMMIT_TITLE}"'](https://github.com/paritytech/ink/commit/'"${CI_COMMIT_SHA}"').", "assignees": [], "labels": [ "P-high" ] }' - exit ${all_tests_passed}