version: 2.1 workflows: object-introspection: jobs: - build: name: build-gcc cc: /usr/bin/gcc cxx: /usr/bin/g++ warnings_as_errors: "OFF" - test: name: test-gcc requires: - build-gcc exclude_regex: ".*inheritance_polymorphic.*|.*arrays_member_int0|ClangTypeParserTest.*" - coverage: name: coverage requires: - test-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 # Tests disabled due to bad DWARF generated by the old clang compiler in CI exclude_regex: ".*inheritance_polymorphic.*|.*arrays_member_int0|.*fbstring.*|.*std_string_*|.*multi_arg_tb_.*|.*ignored_member|OilIntegration.fbstring_.*|OilIntegration.capture_keys_string|OilIntegration.capture_keys_multi_level" executors: ubuntu-docker: docker: - image: ubuntu:jammy resource_class: small big-boy: machine: image: ubuntu-2204:2022.10.2 resource_class: 2xlarge jobs: 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 \ clang-15 \ cmake \ flex \ gawk \ libboost-all-dev \ libbz2-dev \ libcap2-bin \ libclang-15-dev \ libcurl4-gnutls-dev \ libdouble-conversion-dev \ libdw-dev \ libfmt-dev \ libgflags-dev \ libgmock-dev \ libgoogle-glog-dev \ libgtest-dev \ libjemalloc-dev \ libmsgpack-dev \ libomp-12-dev \ liburing-dev \ libzstd-dev \ llvm-15-dev \ ninja-build \ pkg-config \ python3-setuptools pip3 install toml # Ubuntu 22.04 CMake is too old and we don't have a newer image yet git clone --depth 1 --branch v3.30.2 https://github.com/Kitware/CMake.git /tmp/cmake (cd /tmp/cmake && cmake -B build/ -G Ninja && cmake --build build/) environment: DEBIAN_FRONTEND: noninteractive - checkout - run: name: Build command: | /tmp/cmake/build/bin/cmake -G Ninja -B build/ -DLLVM_REQUESTED_VERSION=15 -DWITH_FLAKY_TESTS=Off -DCODE_COVERAGE=On -DWARNINGS_AS_ERRORS=<< parameters.warnings_as_errors >> ninja -C build/ # Testing rubbish: cp test/ci.oid.toml build/testing.oid.toml - persist_to_workspace: root: . paths: - build/* - extern/* - include/* - 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-15 \ libboost-all-dev \ libfmt-dev \ libgflags-dev \ libgoogle-glog-dev \ libjemalloc-dev \ libomp-12-dev \ llvm-15-dev environment: DEBIAN_FRONTEND: noninteractive - 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 environment: DEBIAN_FRONTEND: noninteractive - 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