From 99370f132cd032487bdbf0e650ccb25ef71a37ca Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Fri, 17 Nov 2023 12:20:28 +0100 Subject: [PATCH] Remove gitlab-ci and migrate fuzz job to GHA (#1996) --- .github/workflows/ci.yml | 47 ++++ .gitlab-ci.yml | 571 --------------------------------------- 2 files changed, 47 insertions(+), 571 deletions(-) delete mode 100644 .gitlab-ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 32ac9b5b2ec..1c68b0aa2a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -600,3 +600,50 @@ jobs: needs: [examples-docs, examples-contract-build, examples-test] uses: ./.github/workflows/measurements.yml +# fuzz + + fuzz: + # Temporarily disabled until https://github.com/paritytech/ink/issues/1374 + # is fixed. + if: > + false && + github.event_name == 'push' && + github.ref == 'refs/heads/master' + runs-on: ubuntu-latest + needs: [set-image, measurements] + defaults: + run: + shell: bash + container: + image: ${{ needs.set-image.outputs.IMAGE }} + strategy: + fail-fast: false + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 100 + + - name: Cache + uses: Swatinem/rust-cache@v2 + with: + cache-directories: ${{ env.CARGO_TARGET_DIR }} + + - name: Rust Info + uses: ./.github/rust-info + + - name: Fuzz + env: + QUICKCHECK_TESTS: 5000 + run: | + # We fuzz-test only crates which possess the `ink-fuzz-tests` feature + all_tests_passed=0 + ALL_CRATES="${PURELY_STD_CRATES} ${ALSO_WASM_CRATES}" + 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 + exit ${all_tests_passed} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 0eac2296aa4..00000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,571 +0,0 @@ -# .gitlab-ci.yml -# -# ink -# -# pipelines can be triggered manually in the web - -default: - retry: - max: 2 - when: - - runner_system_failure - - unknown_failure - - api_failure - -stages: - - lint - - check - - workspace - - examples - - measurements - - 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/ci-unified:bullseye-1.73.0" - PURELY_STD_CRATES: "ink/codegen metadata engine e2e e2e/macro ink/ir" - ALSO_WASM_CRATES: "env storage storage/traits allocator prelude primitives ink ink/macro" - ALL_CRATES: "${PURELY_STD_CRATES} ${ALSO_WASM_CRATES}" - # TODO `cargo clippy --verbose --all-targets --all-features` for this crate - # currently fails on `stable`, but succeeds on `nightly`. This is due to - # this fix not yet in stable: https://github.com/rust-lang/rust-clippy/issues/8895. - # Remove the following line again as soon as `clippy` on stable succeeds again. - CLIPPY_ALLOWED: "clippy::extra_unused_lifetimes" - # We plan to fully support RISC-V as a bytecode for contracts soon. - # RISC-V does not have a standard library in contrast to Wasm. Compiling against - # this target also makes sure that we don't pull in `std` by accident (through dependencies). - # RISC-V is a modular archtitecture. We might switch to a different flavor with more features - # later. For example, `riscv32imc-unknown-none-elf`. - RISCV_TARGET: "riscv32i-unknown-none-elf" - -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/ - -.rust-info-script: &rust-info-script - - rustup show - - cargo --version - - rustup +nightly show - - cargo +nightly --version - - cargo spellcheck --version - - bash --version - -.test-refs: &test-refs - 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 - -.docker-env: &docker-env - image: "${CI_IMAGE}" - before_script: - - *rust-info-script - interruptible: true - tags: - - linux-docker - -.kubernetes-env: &kubernetes-env - image: "${CI_IMAGE}" - interruptible: true - tags: - - kubernetes-parity-build - -#### stage: lint -# -# Note: For all of these lints we `allow_failure` so that the rest of the build can -# continue running despite them not passing. Merging is still disallowed since (most) of -# the lint steps are marked as "Required" in GitHub. -spellcheck: - stage: lint - <<: *kubernetes-env - <<: *test-refs - script: - - cargo spellcheck check -v --cfg=.config/cargo_spellcheck.toml --checkers hunspell --code 1 -- recursive . - - cargo spellcheck check -v --cfg=.config/cargo_spellcheck.toml --checkers hunspell --code 1 -- recursive ./integration-tests/* - allow_failure: true - -fmt: - stage: lint - <<: *kubernetes-env - <<: *test-refs - script: - - cargo +nightly fmt --verbose --all -- --check - # For the UI tests we need to disable the license check - - cargo +nightly fmt --verbose --all -- --check ./crates/ink/tests/ui/contract/{pass,fail}/*.rs - - cargo +nightly fmt --verbose --all -- --check ./crates/ink/tests/ui/trait_def/{pass,fail}/*.rs - allow_failure: true - -examples-fmt: - stage: lint - <<: *kubernetes-env - <<: *test-refs - script: - - scripts/for_all_contracts_exec.sh - --path integration-tests - -- cargo +nightly fmt --verbose --manifest-path {} -- --check - # This file is not a part of the cargo project, so it wouldn't be formatted the usual way - - rustfmt +nightly --verbose --check ./integration-tests/psp22-extension/runtime/psp22-extension-example.rs - allow_failure: true - -clippy-std: - stage: lint - <<: *docker-env - <<: *test-refs - script: - - for crate in ${ALL_CRATES}; do - cargo clippy --verbose --all-targets --all-features --manifest-path ./crates/${crate}/Cargo.toml -- -D warnings -A $CLIPPY_ALLOWED; - done - -clippy-wasm: - stage: lint - <<: *docker-env - <<: *test-refs - 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 -A $CLIPPY_ALLOWED; - done - allow_failure: true - -examples-clippy-std: - stage: lint - <<: *docker-env - <<: *test-refs - script: - - scripts/for_all_contracts_exec.sh - --path integration-tests - -- cargo clippy --verbose --all-targets --manifest-path {} -- -D warnings -A $CLIPPY_ALLOWED - allow_failure: true - -examples-clippy-wasm: - stage: lint - <<: *docker-env - <<: *test-refs - script: - - scripts/for_all_contracts_exec.sh - --path integration-tests - -- cargo clippy --verbose --manifest-path {} --no-default-features --target wasm32-unknown-unknown -- -D warnings -A $CLIPPY_ALLOWED - allow_failure: true - - -#### stage: check - -check-std: - stage: check - <<: *docker-env - <<: *test-refs - 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 - <<: *test-refs - 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 - -check-riscv: - stage: check - <<: *docker-env - <<: *test-refs - variables: - RUSTC_BOOTSTRAP: "1" - script: - - for crate in ${ALSO_WASM_CRATES}; do - cargo check --verbose --no-default-features --target $RISCV_TARGET -Zbuild-std="core,alloc" --manifest-path ./crates/${crate}/Cargo.toml; - done - -dylint: - stage: check - <<: *docker-env - <<: *test-refs - script: - - cd linting/ - # we are using a toolchain file in this directory - # add required components for CI - - rustup component add rustfmt clippy - - cargo check --verbose - - cargo +nightly fmt --verbose --all -- --check - - cargo clippy --verbose -- -D warnings; - # Needed until https://github.com/mozilla/sccache/issues/1000 is fixed. - - unset RUSTC_WRAPPER - - cargo test --verbose --all-features - -#### stage: workspace - -build-std: - stage: workspace - <<: *docker-env - <<: *test-refs - 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 - <<: *test-refs - 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 - <<: *test-refs - needs: - - job: check-std - artifacts: false - variables: - # Fix for linking of `linkme` for `cargo test`: https://github.com/dtolnay/linkme/issues/49 - RUSTFLAGS: "-Clink-arg=-z -Clink-arg=nostart-stop-gc" - # 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 - - cargo test --verbose --all-features --no-fail-fast --workspace --doc - -docs: - stage: workspace - <<: *docker-env - <<: *test-refs - variables: - RUSTDOCFLAGS: -Dwarnings - artifacts: - name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" - when: on_success - expire_in: 7 days - paths: - - ./crate-docs/ - script: - # All crate docs currently need to be built separately. The reason - # is that `smart-bench-macro` is a dependency now in a number of places. - # This crate uses e.g. `ink_metadata`, but in its published form. So if - # e.g. the `-p ink_metadata` is added to the `ink_lang` command this - # results in the cargo failure "multiple packages with same spec, ambiguous". - - cargo doc --no-deps --all-features -p ink_env - - cargo doc --no-deps --all-features -p ink_storage - - cargo doc --no-deps --all-features -p ink_storage_traits - - cargo doc --no-deps --all-features -p ink_primitives - - cargo doc --no-deps --all-features -p ink_prelude - - cargo doc --no-deps --all-features -p ink - - cargo doc --no-deps --all-features -p ink_macro - - cargo doc --no-deps --all-features -p ink_ir - - cargo doc --no-deps --all-features -p ink_codegen - - cargo doc --no-deps --all-features -p ink_metadata - - cargo doc --no-deps --all-features -p ink_e2e - - cargo doc --no-deps --all-features -p ink_e2e_macro - - mv ${CARGO_TARGET_DIR}/doc ./crate-docs - # FIXME: remove me after CI image gets nonroot - - chown -R nonroot:nonroot ./crate-docs - - -.codecov: - stage: workspace - <<: *docker-env - <<: *test-refs - needs: - - job: check-std - artifacts: false - variables: - # For codecov it's sufficient to run the fuzz tests only once. - QUICKCHECK_TESTS: 1 - INK_COVERAGE_REPORTING: "true" - CARGO_INCREMENTAL: 0 - # Needed because `codecov` requires nightly features to work - # (see `-Z` in the `RUSTFLAGS` below). - RUSTC_BOOTSTRAP: "1" - # Variables partly came from https://github.com/mozilla/grcov/blob/master/README.md - RUSTFLAGS: "-Zprofile -Zmir-opt-level=0 -Ccodegen-units=1 - -Clink-dead-code -Copt-level=0 -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: - - *rust-info-script - # RUSTFLAGS are the cause target cache can't be used here - # FIXME: cust-covfix doesn't support the external target dir - # https://github.com/Kogia-sima/rust-covfix/issues/7 - - unset "CARGO_TARGET_DIR" - - cargo clean - # make sure there's no stale coverage artifacts - - find . -name "*.profraw" -type f -delete - - find . -name "*.gcda" -type f -delete - 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 . --binary-path ./target/debug/ --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 - - codecov --token "$CODECOV_P_TOKEN" --file lcov-w-branch-fixed.info --nonZero - # lines coverage - - grcov . --binary-path ./target/debug/ --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 - - codecov --token "$CODECOV_TOKEN" --file lcov-lines-fixed.info --nonZero - - -#### stage: examples - -examples-test: - stage: examples - <<: *docker-env - <<: *test-refs - needs: - - job: clippy-std - artifacts: false - variables: - # Fix linking of `linkme`: https://github.com/dtolnay/linkme/issues/49 - RUSTFLAGS: "-Clink-arg=-z -Clink-arg=nostart-stop-gc" - script: - # run all tests with --all-features, which will run the e2e-tests feature if present - - scripts/for_all_contracts_exec.sh - --path integration-tests - --ignore static-buffer - -- cargo test --verbose --all-features --manifest-path {} - # run the static buffer test with a custom buffer size - - cargo clean --manifest-path integration-tests/static-buffer/Cargo.toml - - INK_STATIC_BUFFER_SIZE=30 cargo test --verbose --manifest-path integration-tests/static-buffer/Cargo.toml --all-features - -examples-contract-build: - stage: examples - <<: *docker-env - <<: *test-refs - script: - - rustup component add rust-src --toolchain stable - - cargo contract -V - # Build all examples - - scripts/for_all_contracts_exec.sh - --path integration-tests - -- cargo contract build --release --manifest-path {} - # Build the different features for the conditional compilation example - - pushd ./integration-tests/conditional-compilation - - cargo contract build --release --features "foo" - - cargo contract build --release --features "bar" - - cargo contract build --release --features "foo, bar" - - popd - -## TODO: Use cargo contract as soon as it has RISC-V support -examples-contract-build-riscv: - stage: examples - <<: *docker-env - <<: *test-refs - variables: - RUSTC_BOOTSTRAP: "1" - script: - - rustup component add rust-src --toolchain stable - - cargo contract -V - # We skip some examples for those reasons: - # This uses dlmalloc which is only supported on select targets. - # - custom_allocator - # Pulls in sp-std which needlessly requires atomic pointers (TODO: Fix sp-std and enable this example) - # - call-runtime - - scripts/for_all_contracts_exec.sh - --path integration-tests - --ignore custom-allocator - --ignore call-runtime - -- cargo build --manifest-path {} --no-default-features --target $RISCV_TARGET -Zbuild-std="core,alloc" - -examples-docs: - stage: examples - <<: *docker-env - <<: *test-refs - 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. - - scripts/for_all_contracts_exec.sh - --path integration-tests - -- cargo doc --manifest-path {} --document-private-items --verbose --no-deps - -#### stage: measurements - -.contract-sizes: - stage: measurements - <<: *docker-env - rules: - - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME != "master" - variables: - MEASUREMENTS_DIR: ${CI_PROJECT_DIR}/../ink-ci-measurements - SCRIPTS_DIR: ${CI_PROJECT_DIR}/scripts - PR_BRANCH_CONTRACT_SIZES: ${MEASUREMENTS_DIR}/${CI_COMMIT_BRANCH}_contract_sizes - UPSTREAM_BRANCH: "master" - UPSTREAM_CONTRACT_SIZES: ${MEASUREMENTS_DIR}/${UPSTREAM_BRANCH}_contract_sizes - UPSTREAM_REPO: "https://github.com/paritytech/ink.git" - UPSTREAM_DIR: ${MEASUREMENTS_DIR}/ink-${UPSTREAM_BRANCH} - CONTRACT_SIZES_DIFF: ${MEASUREMENTS_DIR}/${CI_COMMIT_BRANCH}_contract_sizes_diff.md - PR_COMMENTS_URL: "https://api.github.com/repos/paritytech/ink/issues/${CI_COMMIT_REF_NAME}/comments" - WORKFLOW_URL: "https://gitlab.parity.io/parity/mirrors/ink/-/pipelines/${CI_PIPELINE_ID}" - before_script: - - mkdir ${MEASUREMENTS_DIR} - script: - # Measure contract sizes for the current branch - - ${SCRIPTS_DIR}/for_all_contracts_exec.sh - --path integration-tests - --quiet - -- ${SCRIPTS_DIR}/contract_size.sh {} > $PR_BRANCH_CONTRACT_SIZES - - sed -ie 's/^integration-tests\///g' ${PR_BRANCH_CONTRACT_SIZES} - # Measure contract sizes for the upstream branch - - git clone --verbose --depth 1 --branch ${UPSTREAM_BRANCH} ${UPSTREAM_REPO} ${UPSTREAM_DIR} - - pushd ${UPSTREAM_DIR} - - ${SCRIPTS_DIR}/for_all_contracts_exec.sh - --path integration-tests - --quiet - -- ${SCRIPTS_DIR}/contract_size.sh {} > ${UPSTREAM_CONTRACT_SIZES} - - sed -ie 's/^integration-tests\///g' ${UPSTREAM_CONTRACT_SIZES} - - popd - # Build the comparison table - - ${SCRIPTS_DIR}/contract_sizes_diff.sh ${UPSTREAM_CONTRACT_SIZES} ${PR_BRANCH_CONTRACT_SIZES} > ${CONTRACT_SIZES_DIFF} - - cat ${CONTRACT_SIZES_DIFF} - # Submit the comparison table as a comment to the PR - - echo "Submitting contract sizes diff to ${PR_COMMENTS_URL}" - - CARGO_CONTRACT_VERSION=$(cargo-contract --version | egrep --only-matching "cargo-contract.* .*-x86" | sed -s 's/-x86//') - - ${SCRIPTS_DIR}/contract_sizes_submit.sh ${PR_COMMENTS_URL} ${WORKFLOW_URL} ${CARGO_CONTRACT_VERSION} < ${CONTRACT_SIZES_DIFF} - after_script: - - rm -rf ${MEASUREMENTS_DIR} - -# Disabled because `polkadot-js` doesn't support WeightsV2 for -# contracts yet. -.ink-waterfall: - stage: ink-waterfall - image: paritytech/tools:latest - <<: *kubernetes-env - <<: *test-refs - variables: - TRGR_PROJECT: ${CI_PROJECT_NAME} - TRGR_REF: ${CI_COMMIT_REF_NAME} - # The `ink-waterfall` project id in GitLab - DWNSTRM_ID: 409 - script: - - ./scripts/ci/trigger_pipeline.sh - allow_failure: true - - -#### stage: publish - -.publish-docs: - stage: publish - <<: *kubernetes-env - image: paritytech/tools:latest - needs: - - job: docs - artifacts: true - variables: - GIT_DEPTH: 100 - rules: - - if: $CI_PIPELINE_SOURCE == "web" - - if: $CI_PIPELINE_SOURCE == "schedule" - when: never - - if: $CI_COMMIT_REF_NAME == "master" - - if: $CI_COMMIT_REF_NAME == "tags" - before_script: - - unset CARGO_TARGET_DIR - script: - # Setup ssh - - eval $(ssh-agent) - - ssh-add - <<< ${GITHUB_SSH_PRIV_KEY} - - mkdir ~/.ssh && touch ~/.ssh/known_hosts - - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts - # Set git config - - git config user.email "${GITHUB_EMAIL}" - - git config user.name "${GITHUB_USER}" - - git config remote.origin.url "git@github.com:/paritytech/${CI_PROJECT_NAME}.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` has an exit code of > 0 if there is nothing to commit. - # This unfortunately causes GitLab to exit immediately and mark this - # job as failed subsequently. - # We don't want to mark the entire job as failed if there's nothing to - # publish though, hence the `|| true`. - - git commit -m "Updated docs for ${CI_COMMIT_REF_NAME} and pushed to gh-pages" || true - - git push origin gh-pages --force - after_script: - - rm -rf .git/ ./* - -#### stage: fuzz - -# Temporarily disabled until https://github.com/paritytech/ink/issues/1374 -# is fixed. -.fuzz-tests: - stage: fuzz - <<: *docker-env - variables: - # The QUICKCHECK_TESTS default is 100 - QUICKCHECK_TESTS: 5000 - 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_PR_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}