version: 2.1 workflows: object-introspection: jobs: - lint - build: name: build-gcc cc: /usr/bin/gcc cxx: /usr/bin/g++ warnings_as_errors: "OFF" - test: name: test-gcc requires: - build-gcc - test: name: test-type-graph-gcc requires: - build-gcc oid_test_args: "-ftype-graph" tests_regex: "OidIntegration\\..*" exclude_regex: ".*inheritance_polymorphic.*|.*pointers_incomplete_containing_struct|.*arrays_member_int0" - test: name: test-typed-data-segment-gcc requires: - build-gcc oid_test_args: "-ftyped-data-segment" tests_regex: "OidIntegration\\..*" exclude_regex: ".*inheritance_polymorphic.*|.*pointers.*|.*arrays_member_int0|.*cycles_.*" - coverage: name: coverage requires: - test-gcc - coverage: name: coverage-type-graph requires: - test-type-graph-gcc - coverage: name: coverage-typed-data-segment requires: - test-typed-data-segment-gcc - build: name: build-clang cc: /usr/bin/clang-12 cxx: /usr/bin/clang++-12 warnings_as_errors: "ON" - test: name: test-clang requires: - build-clang - test: name: test-type-graph-clang requires: - build-clang oid_test_args: "-ftype-graph" tests_regex: "OidIntegration\\..*" # Tests disabled due to bad DWARF generated by the old clang compiler in CI exclude_regex: ".*inheritance_polymorphic.*|.*pointers_incomplete_containing_struct|.*arrays_member_int0|.*fbstring.*|.*std_string_*|.*multi_arg_tb_.*|.*ignored_a" executors: ubuntu-docker: docker: - image: ubuntu:jammy resource_class: small big-boy: machine: image: ubuntu-2204:2022.10.2 resource_class: 2xlarge jobs: lint: executor: ubuntu-docker steps: - run: name: Install dependencies command: | apt-get update apt-get install -y \ clang-format \ git \ python3-pip # click broke semver with 8.1.0, causing issues for black pip install click==8.0.0 black isort - checkout - run: name: clang-format command: | git ls-files '*.cpp' '*.h' | xargs clang-format --fallback-style=Google -i git ls-files '*.py' | xargs black git ls-files '*.py' | xargs isort git diff --exit-code - run: name: python linting command: | black --check --diff test/ isort --check --diff test/ build: # TODO this job could be run in Docker executor: big-boy parameters: cc: type: string cxx: type: string warnings_as_errors: type: string environment: CC: << parameters.cc >> CXX: << parameters.cxx >> working_directory: /tmp/object-introspection steps: - run: name: Install dependencies command: | sudo apt-get update sudo apt-get install -y \ bison \ build-essential \ clang-12 \ cmake \ flex \ gawk \ libboost-all-dev \ libbz2-dev \ libcap2-bin \ libclang-12-dev \ libcurl4-gnutls-dev \ libdouble-conversion-dev \ libdw-dev \ libfmt-dev \ libgflags-dev \ libgmock-dev \ libgoogle-glog-dev \ libgtest-dev \ libjemalloc-dev \ libmsgpack-dev \ libzstd-dev \ llvm-12-dev \ ninja-build \ pkg-config \ python3-setuptools pip3 install toml environment: DEBIAN_FRONTEND: noninteractive - checkout - run: name: Build command: | cmake -G Ninja -B build/ -DWITH_FLAKY_TESTS=Off -DCODE_COVERAGE=On -DWARNINGS_AS_ERRORS=<< parameters.warnings_as_errors >> cmake --build build/ # Testing rubbish: cp test/ci.oid.toml build/testing.oid.toml - persist_to_workspace: root: . paths: - build/* - extern/* - types/* test: executor: big-boy parameters: oid_test_args: type: string default: "" tests_regex: type: string default: ".*" exclude_regex: type: string default: "" working_directory: /tmp/object-introspection steps: - attach_workspace: at: . - run: name: Install dependencies command: | sudo apt-get update sudo apt-get install -y \ clang-12 \ libboost-all-dev \ libgflags-dev \ llvm-12-dev \ libfmt-dev \ libjemalloc-dev - run: name: Test environment: # disable drgn multithreading as tests are already run in parallel OMP_NUM_THREADS: 1 command: | echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope OID_TEST_ARGS='<< parameters.oid_test_args >>' ctest \ --test-dir build/test/ \ --test-action Test \ -j 16 \ --tests-regex '<< parameters.tests_regex >>' \ --exclude-regex '<< parameters.exclude_regex >>' \ --no-compress-output \ --output-on-failure \ --schedule-random \ --timeout 60 \ --repeat until-pass:2 \ --output-junit results.xml - store_test_results: path: build/test/results.xml - persist_to_workspace: # Save code coverage data root: . paths: - build/* coverage: executor: ubuntu-docker working_directory: /tmp/object-introspection steps: - run: name: Install dependencies command: | apt-get update apt-get install -y \ build-essential \ cpanminus \ curl \ git \ gpg # Install lcov 2.0 - required for the "--filter branch" option. # This improves C++ branch coverage by excluding compiler-generated # branches, which primarily come from exception handling in # standard library functions. cpanm --notest Capture::Tiny DateTime pushd /tmp curl -sLO https://github.com/linux-test-project/lcov/releases/download/v2.0/lcov-2.0.tar.gz tar -xf lcov-2.0.tar.gz cd lcov-2.0 make install popd - checkout - attach_workspace: at: . - run: name: Code Coverage when: always command: | lcov --capture --directory . --filter branch --no-external --ignore-errors mismatch --ignore-errors source --rc lcov_branch_coverage=1 --output-file coverage.info # Empirically, extract-then-remove is faster than remove-then-extract lcov --extract coverage.info '/tmp/object-introspection/*' --rc lcov_branch_coverage=1 --output-file coverage.info lcov --remove coverage.info '/tmp/object-introspection/build/*' '/tmp/object-introspection/extern/*' --rc lcov_branch_coverage=1 --output-file coverage.info lcov --list --rc lcov_branch_coverage=1 coverage.info curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import curl -Os https://uploader.codecov.io/latest/linux/codecov curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM.sig gpgv codecov.SHA256SUM.sig codecov.SHA256SUM shasum -a 256 -c codecov.SHA256SUM chmod +x codecov # It appears that codecov wants to scan through all directories # other than "build", looking for files to upload, even if we # specify a file name on the command line. # # "extern" is huge and makes uploading the coverage report take # forever. Delete it for a speedup. rm -rf extern ./codecov -Z -f coverage.info -t $CODECOV_TOKEN