# vim:ts=2:sw=2:et # -------------------------------------------------------------------------- # Prefixes used in order to keep CircleCI workflow overview more readable: # - b: build # - t: test # - ubu: ubuntu # - ems: Emscripten version: 2.1 parameters: ubuntu-2004-docker-image: type: string # solbuildpackpusher/solidity-buildpack-deps:ubuntu2004-9 default: "solbuildpackpusher/solidity-buildpack-deps@sha256:3d8a912e8e78e98cd217955d06d98608ad60adc67728d4c3a569991235fa1abb" ubuntu-2004-clang-docker-image: type: string # solbuildpackpusher/solidity-buildpack-deps:ubuntu2004.clang-9 default: "solbuildpackpusher/solidity-buildpack-deps@sha256:a1ba002cae17279d1396a898b04e4e9c45602ad881295db3e2f484a7e24f6f43" ubuntu-1604-clang-ossfuzz-docker-image: type: string # solbuildpackpusher/solidity-buildpack-deps:ubuntu1604.clang.ossfuzz-14 default: "solbuildpackpusher/solidity-buildpack-deps@sha256:f353823cce2f6cd2f9f1459d86cd76fdfc551a0261d87626615ea6c1d8f90587" emscripten-docker-image: type: string # solbuildpackpusher/solidity-buildpack-deps:emscripten-8 default: "solbuildpackpusher/solidity-buildpack-deps@sha256:842d6074e0e7e5355c89122c1cafc1fdb59696596750e7d56e5f35c0d883ad59" evm-version: type: string default: london orbs: win: circleci/windows@2.2.0 commands: gitter_notify_unless_pr: description: "Posts a notification to the main room on Gitter (if not running on a PR)." parameters: event: type: enum enum: ["failure", "success"] condition: type: string steps: - run: name: "Gitter notification" when: << parameters.condition >> command: | # FIXME: Checking $CIRCLE_PULL_REQUEST would be better than hard-coding branch names # but it's broken. CircleCI associates runs on develop/breaking with random old PRs. [[ $CIRCLE_BRANCH == develop || $CIRCLE_BRANCH == breaking ]] || { echo "Running on a PR or a feature branch - notification skipped."; exit 0; } # Workflow name is not exposed as an env variable. Has to be queried from the API. # The name is not critical so if anything fails, use the raw workflow ID as a fallback. workflow_info=$(curl --silent "https://circleci.com/api/v2/workflow/${CIRCLE_WORKFLOW_ID}") || true workflow_name=$(echo "$workflow_info" | grep -E '"\s*name"\s*:\s*".*"' | cut -d \" -f 4 || echo "$CIRCLE_WORKFLOW_ID") [[ "<< parameters.event >>" == "failure" ]] && message=" ❌ [${workflow_name}] Job **${CIRCLE_JOB}** failed on **${CIRCLE_BRANCH}**. Please see [build ${CIRCLE_BUILD_NUM}](${CIRCLE_BUILD_URL}) for details." [[ "<< parameters.event >>" == "success" ]] && message=" ✅ [${workflow_name}] Job **${CIRCLE_JOB}** succeeded on **${CIRCLE_BRANCH}**. Please see [build ${CIRCLE_BUILD_NUM}](${CIRCLE_BUILD_URL}) for details." curl "https://api.gitter.im/v1/rooms/${GITTER_NOTIFY_ROOM_ID}/chatMessages" \ --request POST \ --include \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer ${GITTER_API_TOKEN}" \ --data "{\"text\":\"${message}\"}" gitter_notify_failure_unless_pr: description: "Posts a failure notification to the main room on Gitter (if not running on a PR)." steps: - gitter_notify_unless_pr: event: failure condition: on_fail gitter_notify_success_unless_pr: description: "Posts a success notification to the main room on Gitter (if not running on a PR)." steps: - gitter_notify_unless_pr: event: success condition: on_success defaults: # -------------------------------------------------------------------------- # Build Templates - setup_prerelease_commit_hash: &setup_prerelease_commit_hash name: Store commit hash and prerelease command: | if [ "$CIRCLE_BRANCH" = release -o -n "$CIRCLE_TAG" ]; then echo -n > prerelease.txt; else date -u +"nightly.%Y.%-m.%-d" > prerelease.txt; fi echo -n "$CIRCLE_SHA1" > commit_hash.txt - run_build: &run_build name: Build command: scripts/ci/build.sh - run_build_ossfuzz: &run_build_ossfuzz name: Build_ossfuzz command: scripts/ci/build_ossfuzz.sh - run_proofs: &run_proofs name: Correctness proofs for optimization rules command: scripts/run_proofs.sh - run_soltest: &run_soltest name: soltest no_output_timeout: 30m command: ./.circleci/soltest.sh - run_soltest_all: &run_soltest_all name: soltest_all no_output_timeout: 30m command: ./.circleci/soltest_all.sh - run_cmdline_tests: &run_cmdline_tests name: command line tests no_output_timeout: 30m command: ./test/cmdlineTests.sh - run_docs_pragma_min_version: &run_docs_pragma_min_version name: docs pragma version check command: ./scripts/docs_version_pragma_check.sh # -------------------------------------------------------------------------- # Artifacts Templates # the whole build directory - artifacts_build_dir: &artifacts_build_dir root: build paths: - "*" # compiled solc executable target - artifacts_solc: &artifacts_solc path: build/solc/solc destination: solc # windows artifacts - artifact_solc_windows: &artifact_solc_windows path: upload/ # compiled tool executable target - artifact_solidity_upgrade: &artifact_solidity_upgrade path: build/tools/solidity-upgrade destination: solidity-upgrade - artifact_yul_phaser: &artifact_yul_phaser path: build/tools/yul-phaser destination: yul-phaser # compiled executable targets - artifacts_executables: &artifacts_executables root: build paths: - solc/solc - test/soltest - test/tools/solfuzzer # compiled OSSFUZZ targets - artifacts_executables_ossfuzz: &artifacts_executables_ossfuzz root: build paths: - test/tools/ossfuzz/abiv2_proto_ossfuzz - test/tools/ossfuzz/abiv2_isabelle_ossfuzz - test/tools/ossfuzz/const_opt_ossfuzz - test/tools/ossfuzz/solc_mutator_ossfuzz - test/tools/ossfuzz/solc_ossfuzz - test/tools/ossfuzz/stack_reuse_codegen_ossfuzz - test/tools/ossfuzz/strictasm_assembly_ossfuzz - test/tools/ossfuzz/strictasm_diff_ossfuzz - test/tools/ossfuzz/strictasm_opt_ossfuzz - test/tools/ossfuzz/yul_proto_diff_ossfuzz - test/tools/ossfuzz/yul_proto_diff_custom_mutate_ossfuzz - test/tools/ossfuzz/yul_proto_ossfuzz - test/tools/ossfuzz/sol_proto_ossfuzz # test result output directory - artifacts_test_results: &artifacts_test_results path: test_results/ destination: test_results/ # -------------------------------------------------------------------------- # Step Templates # store_test_results helper - store_test_results: &store_test_results path: test_results/ - steps_soltest: &steps_soltest steps: - checkout - attach_workspace: at: build # NOTE: Different build jobs produce different soltest executables (release/debug, # clang/gcc, windows/linux/macos, etc.). The executable used by these steps comes from the # attached workspace and we only see the items added to the workspace by jobs we depend on. - run: *run_soltest - store_test_results: *store_test_results - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr - steps_soltest_all: &steps_soltest_all steps: - checkout - attach_workspace: at: build - run: *run_soltest_all - store_test_results: *store_test_results - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr - steps_cmdline_tests: &steps_cmdline_tests steps: - checkout - attach_workspace: at: build - run: *run_cmdline_tests - store_test_results: *store_test_results - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr # -------------------------------------------------------------------------- # Base Image Templates - base_ubuntu1604_clang: &base_ubuntu1604_clang docker: - image: << pipeline.parameters.ubuntu-1604-clang-ossfuzz-docker-image >> environment: TERM: xterm MAKEFLAGS: -j 3 - base_ubuntu1604_clang_small: &base_ubuntu1604_clang_small <<: *base_ubuntu1604_clang resource_class: small environment: TERM: xterm MAKEFLAGS: -j 2 - base_ubuntu2004_clang: &base_ubuntu2004_clang docker: - image: << pipeline.parameters.ubuntu-2004-clang-docker-image >> environment: TERM: xterm CC: clang CXX: clang++ MAKEFLAGS: -j 3 - base_ubuntu2004_clang_small: &base_ubuntu2004_clang_small <<: *base_ubuntu2004_clang resource_class: small environment: TERM: xterm CC: clang CXX: clang++ MAKEFLAGS: -j 2 - base_ubuntu2004_clang_large: &base_ubuntu2004_clang_large <<: *base_ubuntu2004_clang resource_class: large environment: TERM: xterm CC: clang CXX: clang++ MAKEFLAGS: -j 5 - base_ubuntu2004: &base_ubuntu2004 docker: - image: << pipeline.parameters.ubuntu-2004-docker-image >> environment: TERM: xterm MAKEFLAGS: -j 3 - base_ubuntu2004_small: &base_ubuntu2004_small <<: *base_ubuntu2004 resource_class: small environment: TERM: xterm MAKEFLAGS: -j 2 - base_ubuntu2004_large: &base_ubuntu2004_large <<: *base_ubuntu2004 resource_class: large environment: TERM: xterm MAKEFLAGS: -j 5 - base_ubuntu2004_xlarge: &base_ubuntu2004_xlarge <<: *base_ubuntu2004 resource_class: xlarge environment: TERM: xterm MAKEFLAGS: -j 10 - base_buildpack_focal_small: &base_buildpack_focal_small docker: - image: buildpack-deps:focal resource_class: small environment: TERM: xterm MAKEFLAGS: -j 2 - base_buildpack_latest_small: &base_buildpack_latest_small docker: - image: buildpack-deps:latest resource_class: small environment: TERM: xterm MAKEFLAGS: -j 2 - base_archlinux: &base_archlinux docker: - image: archlinux:base environment: TERM: xterm MAKEFLAGS: -j 3 - base_archlinux_large: &base_archlinux_large docker: - image: archlinux:base resource_class: large environment: TERM: xterm MAKEFLAGS: -j 5 - base_win_powershell: &base_win_powershell executor: name: win/default shell: powershell.exe - base_win_powershell_large: &base_win_powershell_large executor: name: win/default shell: powershell.exe size: large - base_win_cmd: &base_win_cmd executor: name: win/default shell: cmd.exe - base_osx: &base_osx macos: xcode: "11.0.0" environment: TERM: xterm MAKEFLAGS: -j 5 - base_ems_large: &base_ems_large docker: - image: << pipeline.parameters.emscripten-docker-image >> resource_class: large environment: TERM: xterm MAKEFLAGS: -j 5 - base_python_small: &base_python_small docker: - image: circleci/python:3.6 resource_class: small environment: TERM: xterm MAKEFLAGS: -j 2 - base_node_latest_small: &base_node_latest_small docker: - image: circleci/node resource_class: small environment: TERM: xterm MAKEFLAGS: -j 2 # -------------------------------------------------------------------------- # Workflow Templates - workflow_trigger_on_tags: &workflow_trigger_on_tags filters: tags: only: /.*/ - workflow_ubuntu2004: &workflow_ubuntu2004 <<: *workflow_trigger_on_tags requires: - b_ubu - workflow_ubuntu1604_clang: &workflow_ubuntu1604_clang <<: *workflow_trigger_on_tags requires: - b_ubu_ossfuzz - workflow_ubuntu2004_clang: &workflow_ubuntu2004_clang <<: *workflow_trigger_on_tags requires: - b_ubu_clang - workflow_ubuntu2004_release: &workflow_ubuntu2004_release <<: *workflow_trigger_on_tags requires: - b_ubu_release - workflow_archlinux: &workflow_archlinux <<: *workflow_trigger_on_tags requires: - b_archlinux - workflow_ubuntu2004_codecov: &workflow_ubuntu2004_codecov <<: *workflow_trigger_on_tags requires: - b_ubu_codecov - workflow_osx: &workflow_osx <<: *workflow_trigger_on_tags requires: - b_osx - workflow_ubuntu2004_asan: &workflow_ubuntu2004_asan <<: *workflow_trigger_on_tags requires: - b_ubu_asan - workflow_ubuntu2004_asan_clang: &workflow_ubuntu2004_asan_clang <<: *workflow_trigger_on_tags requires: - b_ubu_asan_clang - workflow_ubuntu2004_ubsan_clang: &workflow_ubuntu2004_ubsan_clang <<: *workflow_trigger_on_tags requires: - b_ubu_ubsan_clang - workflow_emscripten: &workflow_emscripten <<: *workflow_trigger_on_tags requires: - b_ems - workflow_ubuntu1604_ossfuzz: &workflow_ubuntu1604_ossfuzz <<: *workflow_trigger_on_tags requires: - b_ubu_ossfuzz - workflow_win: &workflow_win <<: *workflow_trigger_on_tags requires: - b_win - workflow_win_release: &workflow_win_release <<: *workflow_trigger_on_tags requires: - b_win_release # ----------------------------------------------------------------------------------------------- jobs: chk_spelling: <<: *base_python_small steps: - checkout - attach_workspace: at: build - run: name: Install dependencies command: | pip install --user codespell - run: name: Check spelling command: ~/.local/bin/codespell -S "*.enc,.git,Dockerfile*" -I ./scripts/codespell_whitelist.txt - gitter_notify_failure_unless_pr chk_docs_examples: <<: *base_node_latest_small steps: - checkout - attach_workspace: at: build - run: name: JS deps command: sudo npm install -g solhint - run: name: Test Docs examples command: ./test/docsCodeStyle.sh - gitter_notify_failure_unless_pr chk_coding_style: <<: *base_buildpack_focal_small steps: - checkout - run: name: Install shellcheck command: apt -q update && apt install -y shellcheck - run: name: Check for C++ coding style command: ./scripts/check_style.sh - run: name: checking shell scripts command: ./scripts/chk_shellscripts/chk_shellscripts.sh - run: name: Check for broken symlinks command: ./scripts/check_symlinks.sh - gitter_notify_failure_unless_pr chk_errorcodes: <<: *base_python_small steps: - checkout - run: name: Check for error codes command: ./scripts/error_codes.py --check - gitter_notify_failure_unless_pr chk_pylint: <<: *base_buildpack_focal_small steps: - checkout - run: name: Install pip command: apt -q update && apt install -y python3-pip - run: name: Install pylint command: python3 -m pip install pylint z3-solver pygments-lexer-solidity parsec tabulate # also z3-solver, parsec and tabulate to make sure pylint knows about this module, pygments-lexer-solidity for docs - run: name: Linting Python Scripts command: ./scripts/pylint_all.py - gitter_notify_failure_unless_pr chk_antlr_grammar: <<: *base_buildpack_focal_small steps: - checkout - run: name: Install Java command: apt -q update && apt install -y openjdk-16-jdk - run: name: Run tests command: ./scripts/test_antlr_grammar.sh - gitter_notify_failure_unless_pr chk_buglist: <<: *base_node_latest_small steps: - checkout - run: name: JS deps command: | npm install download npm install JSONPath npm install mktemp - run: name: Test buglist command: ./test/buglistTests.js - gitter_notify_failure_unless_pr chk_proofs: <<: *base_buildpack_latest_small steps: - checkout - run: name: Z3 python deps command: | apt-get -qq update apt-get -qy install python3-pip pip3 install --user z3-solver - run: *run_proofs - gitter_notify_failure_unless_pr chk_docs_pragma_min_version: <<: *base_ubuntu2004_small steps: - checkout - run: *run_docs_pragma_min_version - gitter_notify_failure_unless_pr t_ubu_pyscripts: <<: *base_ubuntu2004_small steps: - checkout - run: name: Python unit tests command: python3 test/pyscriptTests.py - gitter_notify_failure_unless_pr t_win_pyscripts: <<: *base_win_powershell steps: - run: git config --global core.autocrlf false - checkout - run: name: Python unit tests command: python.exe test/pyscriptTests.py - gitter_notify_failure_unless_pr b_ubu: &b_ubu # this runs 2x faster on xlarge but takes 4x more resources (compared to medium). # Enough other jobs depend on it that it's worth it though. <<: *base_ubuntu2004_xlarge steps: - checkout - run: *run_build - store_artifacts: *artifacts_solc - store_artifacts: *artifact_solidity_upgrade - store_artifacts: *artifact_yul_phaser - persist_to_workspace: *artifacts_executables - gitter_notify_failure_unless_pr # x64 ASAN build, for testing for memory related bugs b_ubu_asan: &b_ubu_asan # Runs slightly faster on large and xlarge but we only run it nightly so efficiency matters more. <<: *base_ubuntu2004 environment: CMAKE_OPTIONS: -DSANITIZE=address MAKEFLAGS: -j 3 CMAKE_BUILD_TYPE: Release steps: - checkout - run: *run_build - store_artifacts: *artifacts_solc - persist_to_workspace: *artifacts_executables - gitter_notify_failure_unless_pr b_ubu_clang: &b_ubu_clang <<: *base_ubuntu2004_clang_large environment: TERM: xterm CC: clang CXX: clang++ MAKEFLAGS: -j 10 steps: - checkout - run: *run_build - store_artifacts: *artifacts_solc - persist_to_workspace: *artifacts_executables - gitter_notify_failure_unless_pr b_ubu_asan_clang: &b_ubu_asan_clang # This runs a bit faster on large and xlarge but on nightly efficiency matters more. <<: *base_ubuntu2004_clang environment: CC: clang CXX: clang++ CMAKE_OPTIONS: -DSANITIZE=address MAKEFLAGS: -j 3 steps: - checkout - run: *run_build - store_artifacts: *artifacts_solc - persist_to_workspace: *artifacts_executables - gitter_notify_failure_unless_pr b_ubu_ubsan_clang: &b_ubu_ubsan_clang # This runs a bit faster on large and xlarge but on nightly efficiency matters more. <<: *base_ubuntu2004_clang environment: CC: clang CXX: clang++ CMAKE_OPTIONS: -DSANITIZE=undefined MAKEFLAGS: -j 3 steps: - checkout - run: *run_build - store_artifacts: *artifacts_solc - persist_to_workspace: *artifacts_executables - gitter_notify_failure_unless_pr b_ubu_release: &b_ubu_release <<: *b_ubu environment: FORCE_RELEASE: ON MAKEFLAGS: -j 10 b_ubu_static: # Runs 2x faster on large and 3x on xlarge but no other jobs depend on it we can live with medium. <<: *base_ubuntu2004 environment: MAKEFLAGS: -j 5 CMAKE_OPTIONS: -DCMAKE_BUILD_TYPE=Release -DUSE_Z3_DLOPEN=ON -DUSE_CVC4=OFF -DSOLC_STATIC_STDLIBS=ON steps: - checkout - run: *run_build - run: name: strip binary command: strip build/solc/solc - store_artifacts: *artifacts_solc - gitter_notify_failure_unless_pr b_ubu_codecov: # Runs ~30% faster on large but we only run it nightly so efficiency matters more. <<: *base_ubuntu2004 environment: COVERAGE: ON CMAKE_BUILD_TYPE: Debug MAKEFLAGS: -j 3 steps: - checkout - run: *run_build - persist_to_workspace: *artifacts_executables - gitter_notify_failure_unless_pr t_ubu_codecov: <<: *base_ubuntu2004 parallelism: 6 environment: EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 1 steps: - checkout - attach_workspace: at: build - run: name: "soltest: Syntax Tests" command: build/test/soltest -t 'syntaxTest*' -- --testpath test - run: name: "Code Coverage: Syntax Tests" command: codecov --flags syntax --gcov-root build - run: *run_soltest - run: name: "Coverage: All" command: codecov --flags all --gcov-root build - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr # Builds in C++20 mode and uses debug build in order to speed up. # Do *NOT* store any artifacts or workspace as we don't run tests on this build. b_ubu_cxx20: <<: *base_ubuntu2004_large environment: CMAKE_BUILD_TYPE: Debug CMAKE_OPTIONS: -DCMAKE_CXX_STANDARD=20 -DUSE_CVC4=OFF MAKEFLAGS: -j 10 steps: - checkout - run: *run_build - gitter_notify_failure_unless_pr b_ubu_ossfuzz: &b_ubu_ossfuzz <<: *base_ubuntu1604_clang steps: - checkout - run: *setup_prerelease_commit_hash - run: *run_build_ossfuzz - persist_to_workspace: *artifacts_executables_ossfuzz - gitter_notify_failure_unless_pr t_ubu_ossfuzz: &t_ubu_ossfuzz <<: *base_ubuntu1604_clang_small steps: - checkout - attach_workspace: at: build - run: name: Regression tests command: | git clone https://github.com/ethereum/solidity-fuzzing-corpus /tmp/solidity-fuzzing-corpus mkdir -p test_results scripts/regressions.py -o test_results - store_test_results: *store_test_results - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr - gitter_notify_success_unless_pr b_archlinux: <<: *base_archlinux_large environment: TERM: xterm MAKEFLAGS: -j 5 steps: - run: name: Install build dependencies command: | pacman --noconfirm -Syu --noprogressbar --needed base-devel boost cmake z3 cvc4 git openssh tar - checkout - run: *run_build - store_artifacts: *artifacts_solc - persist_to_workspace: *artifacts_executables - gitter_notify_failure_unless_pr b_osx: <<: *base_osx environment: TERM: xterm CMAKE_BUILD_TYPE: Release MAKEFLAGS: -j 5 steps: - checkout - restore_cache: keys: - dependencies-osx-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} # DO NOT EDIT between here and save_cache, but rather edit ./circleci/osx_install_dependencies.sh # WARNING! If you do edit anything here instead, remember to invalidate the cache manually. - run: name: Install build dependencies command: ./.circleci/osx_install_dependencies.sh - save_cache: key: dependencies-osx-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} paths: - /usr/local/bin - /usr/local/sbin - /usr/local/lib - /usr/local/include - /usr/local/Cellar - /usr/local/Homebrew - run: *run_build - store_artifacts: *artifacts_solc - store_artifacts: *artifact_solidity_upgrade - store_artifacts: *artifact_yul_phaser - persist_to_workspace: root: . paths: - build/solc/solc - build/test/soltest - build/test/tools/solfuzzer - gitter_notify_failure_unless_pr t_osx_soltest: <<: *base_osx environment: EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 TERM: xterm steps: - checkout - restore_cache: keys: - dependencies-osx-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} - attach_workspace: at: . - run: *run_soltest - store_test_results: *store_test_results - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr t_osx_cli: <<: *base_osx steps: - checkout - restore_cache: keys: - dependencies-osx-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} - attach_workspace: at: . - run: *run_cmdline_tests - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr b_ems: <<: *base_ems_large environment: TERM: xterm MAKEFLAGS: -j 10 steps: - checkout - run: name: Build command: | scripts/ci/build_emscripten.sh - store_artifacts: path: emscripten_build/libsolc/soljson.js destination: soljson.js - run: mkdir -p workspace - run: cp emscripten_build/libsolc/soljson.js workspace/soljson.js - run: scripts/get_version.sh > workspace/version.txt - persist_to_workspace: root: workspace paths: - soljson.js - version.txt - gitter_notify_failure_unless_pr b_docs: <<: *base_ubuntu2004_small steps: - checkout - run: *setup_prerelease_commit_hash - run: name: Build documentation command: ./scripts/docs.sh - store_artifacts: path: docs/_build/html/ destination: docs-html - gitter_notify_failure_unless_pr t_ubu_soltest_all: &t_ubu_soltest_all <<: *base_ubuntu2004 parallelism: 6 <<: *steps_soltest_all t_archlinux_soltest: &t_archlinux_soltest <<: *base_archlinux environment: EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 TERM: xterm # For Archlinux we do not have prebuilt docker images and we would need to build evmone from source, # thus we forgo semantics tests to speed things up. SOLTEST_FLAGS: --no-semantic-tests steps: - run: name: Install runtime dependencies command: | pacman --noconfirm -Syu --noprogressbar --needed base-devel boost cmake z3 cvc4 git openssh tar - when: condition: true <<: *steps_soltest t_ubu_soltest_enforce_yul: &t_ubu_soltest_enforce_yul <<: *base_ubuntu2004 environment: EVM: << pipeline.parameters.evm-version >> SOLTEST_FLAGS: --enforce-via-yul OPTIMIZE: 0 TERM: xterm <<: *steps_soltest t_ubu_clang_soltest: &t_ubu_clang_soltest <<: *base_ubuntu2004_clang environment: EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 <<: *steps_soltest t_ubu_release_soltest_all: &t_ubu_release_soltest_all # NOTE: This definition is identical to t_ubu_soltest_all but in the workflow we make it depend on # a different job (b_ubu_release) so the workspace it attaches contains a different executable. <<: *t_ubu_soltest_all t_ubu_cli: &t_ubu_cli <<: *base_ubuntu2004_small <<: *steps_cmdline_tests t_ubu_release_cli: &t_ubu_release_cli <<: *t_ubu_cli t_ubu_asan_cli: # Runs slightly faster on medium but we only run it nightly so efficiency matters more. <<: *base_ubuntu2004_small environment: TERM: xterm ASAN_OPTIONS: check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true:strict_string_checks=true:detect_invalid_pointer_pairs=2 <<: *steps_cmdline_tests t_ubu_asan_soltest: <<: *base_ubuntu2004 parallelism: 6 environment: EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 SOLTEST_FLAGS: --no-smt ASAN_OPTIONS: check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true:strict_string_checks=true:detect_invalid_pointer_pairs=2 <<: *steps_soltest t_ubu_asan_clang_soltest: <<: *base_ubuntu2004_clang environment: EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 SOLTEST_FLAGS: --no-smt ASAN_OPTIONS: check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true:strict_string_checks=true:detect_invalid_pointer_pairs=2 <<: *steps_soltest t_ubu_ubsan_clang_soltest: <<: *base_ubuntu2004_clang environment: EVM: << pipeline.parameters.evm-version >> <<: *steps_soltest t_ubu_ubsan_clang_cli: <<: *base_ubuntu2004_clang_small <<: *steps_cmdline_tests t_ems_solcjs: # Unlike other t_ems jobs this one actually runs 2x faster on medium (compared to small). <<: *base_ubuntu2004 steps: - checkout - attach_workspace: at: /tmp/workspace - run: name: Install test dependencies command: | apt-get update apt-get install -qqy --no-install-recommends nodejs npm - run: name: Test solcjs no_output_timeout: 30m command: | node --version npm --version test/externalTests/solc-js/solc-js.sh /tmp/workspace/soljson.js $(cat /tmp/workspace/version.txt) - gitter_notify_failure_unless_pr t_ems_ext_hardhat: <<: *base_node_latest_small environment: TERM: xterm HARDHAT_TESTS_SOLC_PATH: /tmp/workspace/soljson.js steps: - checkout - attach_workspace: at: /tmp/workspace - run: git clone --depth 1 https://github.com/nomiclabs/hardhat.git - run: name: Install dependencies command: | cd hardhat yarn - run: name: Run hardhat-core test suite command: | HARDHAT_TESTS_SOLC_VERSION=$(scripts/get_version.sh) export HARDHAT_TESTS_SOLC_VERSION # NOTE: This is expected to work without running `yarn build` first. cd hardhat/packages/hardhat-core yarn test - gitter_notify_failure_unless_pr t_ems_ext: parameters: project: type: string binary_type: type: enum enum: - solcjs - native compile_only: type: integer default: 0 nodejs_version: type: string default: latest resource_class: type: string default: small docker: - image: circleci/node:<> resource_class: <> # NOTE: Each external test does 3 separate compile&test runs parallelism: 3 environment: TERM: xterm COMPILE_ONLY: <> steps: - checkout - attach_workspace: at: /tmp/workspace - run: name: Install lsof command: | # lsof is used by Colony in its stop-blockchain-client.sh script sudo apt-get --quiet --assume-yes --no-install-recommends install lsof - when: condition: equal: [<< parameters.binary_type >>, "solcjs"] steps: - run: name: External <> tests (solcjs) command: | test/externalTests/<>.sh solcjs /tmp/workspace/soljson.js - when: condition: equal: [<< parameters.binary_type >>, "native"] steps: - run: name: External <> tests (native) command: | test/externalTests/<>.sh native /tmp/workspace/solc/solc - gitter_notify_failure_unless_pr b_win: &b_win <<: *base_win_powershell_large steps: # NOTE: Not disabling git's core.autocrlf here because we want to build using the typical Windows config. - checkout - restore_cache: keys: - dependencies-win-{{ arch }}-{{ checksum "scripts/install_deps.ps1" }} # DO NOT EDIT between here and save_cache, but rather edit .\scripts\install_deps.ps1 # WARNING! If you do edit anything here instead, remember to invalidate the cache manually. - run: name: "Installing dependencies" command: .\scripts\install_deps.ps1 - save_cache: key: dependencies-win-{{ arch }}-{{ checksum "scripts/install_deps.ps1" }} paths: - .\deps - run: name: "Building solidity" command: .circleci/build_win.ps1 - run: name: "Run solc.exe to make sure build was successful." command: .\build\solc\Release\solc.exe --version - store_artifacts: *artifact_solc_windows - persist_to_workspace: root: build paths: - .\solc\*\solc.exe - .\test\*\soltest.exe - gitter_notify_failure_unless_pr b_win_release: <<: *b_win environment: FORCE_RELEASE: ON t_win_soltest: &t_win_soltest <<: *base_win_powershell steps: # NOTE: Git's default core.autocrlf is fine for running soltest. We get additional coverage # for files using CRLF that way. - checkout - attach_workspace: at: build - run: name: "Install evmone" command: scripts/install_evmone.ps1 - run: name: "Run soltest" command: .circleci/soltest.ps1 - store_test_results: *store_test_results - store_artifacts: *artifacts_test_results - gitter_notify_failure_unless_pr t_win_release_soltest: <<: *t_win_soltest b_bytecode_ubu: <<: *base_ubuntu2004_small steps: - checkout - attach_workspace: at: build - run: mkdir test-cases/ - run: cd test-cases && ../scripts/isolate_tests.py ../test/ - run: cd test-cases && ../scripts/bytecodecompare/prepare_report.py ../build/solc/solc --interface standard-json --report-file ../bytecode-report-ubuntu-json.txt - run: cd test-cases && ../scripts/bytecodecompare/prepare_report.py ../build/solc/solc --interface cli --report-file ../bytecode-report-ubuntu-cli.txt - store_artifacts: path: bytecode-report-ubuntu-json.txt - store_artifacts: path: bytecode-report-ubuntu-cli.txt - persist_to_workspace: root: . paths: - bytecode-report-ubuntu-json.txt - bytecode-report-ubuntu-cli.txt - gitter_notify_failure_unless_pr b_bytecode_osx: <<: *base_osx steps: - checkout - attach_workspace: at: . - run: mkdir test-cases/ - run: cd test-cases && ../scripts/isolate_tests.py ../test/ - run: cd test-cases && ../scripts/bytecodecompare/prepare_report.py ../build/solc/solc --interface standard-json --report-file ../bytecode-report-osx-json.txt - run: cd test-cases && ../scripts/bytecodecompare/prepare_report.py ../build/solc/solc --interface cli --report-file ../bytecode-report-osx-cli.txt - store_artifacts: path: bytecode-report-osx-json.txt - store_artifacts: path: bytecode-report-osx-cli.txt - persist_to_workspace: root: . paths: - bytecode-report-osx-json.txt - bytecode-report-osx-cli.txt - gitter_notify_failure_unless_pr b_bytecode_win: <<: *base_win_cmd steps: # NOTE: For bytecode generation we need the input files to be byte-for-byte identical on all # platforms so line ending conversions must absolutely be disabled. - run: git config --global core.autocrlf false - checkout - attach_workspace: at: build - run: mkdir test-cases\ - run: cd test-cases\ && python ..\scripts\isolate_tests.py ..\test\ - run: cd test-cases\ && python ..\scripts\bytecodecompare\prepare_report.py ..\build\solc\Release\solc.exe --interface standard-json --report-file ..\bytecode-report-windows-json.txt - run: cd test-cases\ && python ..\scripts\bytecodecompare\prepare_report.py ..\build\solc\Release\solc.exe --interface cli --report-file ..\bytecode-report-windows-cli.txt - store_artifacts: path: bytecode-report-windows-json.txt - store_artifacts: path: bytecode-report-windows-cli.txt - persist_to_workspace: root: . paths: - bytecode-report-windows-json.txt - bytecode-report-windows-cli.txt - gitter_notify_failure_unless_pr b_bytecode_ems: <<: *base_node_latest_small environment: SOLC_EMSCRIPTEN: "On" steps: - checkout - attach_workspace: at: emscripten_build/libsolc - run: scripts/bytecodecompare/storebytecode.sh && mv -v report.txt bytecode-report-emscripten.txt - store_artifacts: path: bytecode-report-emscripten.txt - persist_to_workspace: root: . paths: - bytecode-report-emscripten.txt - gitter_notify_failure_unless_pr t_bytecode_compare: <<: *base_ubuntu2004_small environment: REPORT_FILES: | bytecode-report-emscripten.txt bytecode-report-ubuntu-json.txt bytecode-report-ubuntu-cli.txt bytecode-report-osx-json.txt bytecode-report-osx-cli.txt bytecode-report-windows-json.txt bytecode-report-windows-cli.txt steps: - attach_workspace: at: . - run: name: Compare reports command: diff --brief --report-identical-files --from-file $REPORT_FILES - run: name: Print diff when: on_fail command: diff --unified=0 --report-identical-files --from-file $REPORT_FILES | head --lines 50 - run: name: Install zip when: on_fail command: | apt update --quiet apt install zip --assume-yes - run: name: Bundle reports into a single package when: on_fail command: zip all-bytecode-reports.zip $REPORT_FILES - store_artifacts: # NOTE: store_artifacts does not support the 'when' attribute. # Fortunately when the artifact does not exist it just says "No artifact files found" and ignores it. path: all-bytecode-reports.zip - gitter_notify_failure_unless_pr workflows: version: 2 main: jobs: # basic checks - chk_spelling: *workflow_trigger_on_tags - chk_coding_style: *workflow_trigger_on_tags # DISABLED FOR 0.6.0 - chk_docs_examples: *workflow_trigger_on_tags - chk_buglist: *workflow_trigger_on_tags - chk_proofs: *workflow_trigger_on_tags - chk_pylint: *workflow_trigger_on_tags - chk_errorcodes: *workflow_trigger_on_tags - chk_antlr_grammar: *workflow_trigger_on_tags - chk_docs_pragma_min_version: *workflow_trigger_on_tags - t_ubu_pyscripts: *workflow_trigger_on_tags - t_win_pyscripts: *workflow_trigger_on_tags # build-only - b_docs: *workflow_trigger_on_tags - b_ubu_cxx20: *workflow_trigger_on_tags - b_ubu_ossfuzz: *workflow_trigger_on_tags # OS/X build and tests - b_osx: *workflow_trigger_on_tags - t_osx_cli: *workflow_osx - t_osx_soltest: *workflow_osx # ArchLinux build and tests - b_archlinux: *workflow_trigger_on_tags - t_archlinux_soltest: *workflow_archlinux # Static build - b_ubu_static: *workflow_trigger_on_tags # Ubuntu build and tests - b_ubu: *workflow_trigger_on_tags - t_ubu_cli: *workflow_ubuntu2004 - t_ubu_soltest_all: *workflow_ubuntu2004 - t_ubu_soltest_enforce_yul: *workflow_ubuntu2004 - b_ubu_clang: *workflow_trigger_on_tags - t_ubu_clang_soltest: *workflow_ubuntu2004_clang # Ubuntu fake release build and tests - b_ubu_release: *workflow_trigger_on_tags - t_ubu_release_cli: *workflow_ubuntu2004_release - t_ubu_release_soltest_all: *workflow_ubuntu2004_release # Emscripten build and tests that take 15 minutes or less - b_ems: *workflow_trigger_on_tags - t_ems_solcjs: *workflow_emscripten - t_ems_ext_hardhat: *workflow_emscripten # Separate compile-only runs of those external tests where a full run takes much longer. - t_ems_ext: <<: *workflow_emscripten name: t_ems_compile_ext_colony project: colony binary_type: solcjs compile_only: 1 nodejs_version: '14' - t_ems_ext: <<: *workflow_emscripten name: t_ems_compile_ext_gnosis project: gnosis binary_type: solcjs compile_only: 1 nodejs_version: '14' # FIXME: Gnosis tests are pretty flaky right now. They often fail on CircleCI due to random ProviderError # and there are also other less frequent problems. See https://github.com/gnosis/safe-contracts/issues/216. #- t_ems_ext: # <<: *workflow_emscripten # name: t_ems_test_ext_gnosis # project: gnosis # binary_type: solcjs # # NOTE: Tests do not start on node.js 14 ("ganache-cli exited early with code 1"). # nodejs_version: '12' - t_ems_ext: <<: *workflow_emscripten name: t_ems_test_ext_gnosis_v2 project: gnosis-v2 binary_type: solcjs # NOTE: Tests do not start on node.js 14 ("ganache-cli exited early with code 1"). nodejs_version: '12' - t_ems_ext: <<: *workflow_emscripten name: t_ems_test_ext_zeppelin project: zeppelin binary_type: solcjs # NOTE: Tests crash on nodejs 17: "Error: error:0308010C:digital envelope routines::unsupported" nodejs_version: '16' resource_class: large - t_ems_ext: <<: *workflow_emscripten name: t_ems_test_ext_ens project: ens binary_type: solcjs # NOTE: One of the dependencies (fsevents) fails to build its native extension on node.js 12+. nodejs_version: '10' # Windows build and tests - b_win: *workflow_trigger_on_tags - b_win_release: *workflow_trigger_on_tags - t_win_soltest: *workflow_win - t_win_release_soltest: *workflow_win_release # Bytecode comparison: - b_bytecode_ubu: requires: - b_ubu - b_bytecode_win: requires: - b_win - b_bytecode_osx: requires: - b_osx - b_bytecode_ems: requires: - b_ems - t_bytecode_compare: requires: - b_bytecode_ubu - b_bytecode_win - b_bytecode_osx - b_bytecode_ems nightly: triggers: - schedule: cron: "0 0 * * *" filters: branches: only: - develop jobs: # OSSFUZZ builds and (regression) tests - b_ubu_ossfuzz: *workflow_trigger_on_tags - t_ubu_ossfuzz: *workflow_ubuntu1604_ossfuzz # Code Coverage enabled build and tests - b_ubu_codecov: *workflow_trigger_on_tags - t_ubu_codecov: *workflow_ubuntu2004_codecov # ASan build and tests - b_ubu_asan: *workflow_trigger_on_tags - b_ubu_asan_clang: *workflow_trigger_on_tags - t_ubu_asan_soltest: *workflow_ubuntu2004_asan - t_ubu_asan_clang_soltest: *workflow_ubuntu2004_asan_clang - t_ubu_asan_cli: *workflow_ubuntu2004_asan # UBSan build and tests - b_ubu_ubsan_clang: *workflow_trigger_on_tags - t_ubu_ubsan_clang_soltest: *workflow_ubuntu2004_ubsan_clang - t_ubu_ubsan_clang_cli: *workflow_ubuntu2004_ubsan_clang # Emscripten build and tests that take more than 15 minutes to execute - b_ems: *workflow_trigger_on_tags - t_ems_ext: <<: *workflow_emscripten name: t_ems_test_ext_colony project: colony binary_type: solcjs resource_class: medium