From 54fd2735959e7281bfc18d307249e69cdfefb702 Mon Sep 17 00:00:00 2001 From: iphydf Date: Wed, 11 Dec 2024 11:12:21 +0000 Subject: [PATCH] chore: Fix tsan build on circleci. --- .circleci/config.yml | 59 ++--- .github/workflows/ci.yml | 361 +++++++++++++++------------- other/docker/circleci/Dockerfile | 8 +- other/docker/circleci/entrypoint.sh | 4 +- other/docker/circleci/run | 4 +- 5 files changed, 223 insertions(+), 213 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8692cd0a1b..7541738fa4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ workflows: # - bazel-tsan # Dynamic analysis with CMake - asan - # - tsan + - tsan - ubsan # Static analysis - clang-analyze @@ -55,54 +55,28 @@ jobs: //c-toxcore/auto_tests:lossless_packet_test asan: - working_directory: ~/work - docker: - - image: ubuntu + machine: { image: ubuntu-2204:current } steps: - - run: &apt_install - apt-get update && - DEBIAN_FRONTEND=noninteractive - apt-get install -y - ca-certificates - clang - cmake - git - libbenchmark-dev - libconfig-dev - libgmock-dev - libgtest-dev - libopus-dev - libsodium-dev - libvpx-dev - llvm-dev - ninja-build - pkg-config - checkout - run: git submodule update --init --recursive - - run: CC=clang .circleci/cmake-asan + - run: other/docker/circleci/run asan tsan: - working_directory: ~/work - docker: - - image: ubuntu + machine: { image: ubuntu-2204:current } steps: - - run: *apt_install - checkout - run: git submodule update --init --recursive - - run: CC=clang .circleci/cmake-tsan + - run: other/docker/circleci/run tsan ubsan: - working_directory: ~/work - docker: - - image: ubuntu + machine: { image: ubuntu-2204:current } steps: - - run: *apt_install - checkout - run: git submodule update --init --recursive - - run: CC=clang .circleci/cmake-ubsan + - run: other/docker/circleci/run ubsan static-analysis: working_directory: ~/work @@ -110,7 +84,24 @@ jobs: - image: ubuntu steps: - - run: *apt_install + - run: &apt_install + apt-get update && + DEBIAN_FRONTEND=noninteractive + apt-get install -y + ca-certificates + clang + cmake + git + libbenchmark-dev + libconfig-dev + libgmock-dev + libgtest-dev + libopus-dev + libsodium-dev + libvpx-dev + llvm-dev + ninja-build + pkg-config - run: apt-get install -y --no-install-recommends ca-certificates diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46aa57f315..4dcb294dfc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,188 +13,205 @@ jobs: common: uses: TokTok/ci-tools/.github/workflows/common-ci.yml@master - analysis: +# analysis: +# strategy: +# fail-fast: false +# matrix: +# tool: [autotools, clang-tidy, compcert, cppcheck, doxygen, goblint, infer, freebsd, misra, modules, pkgsrc, rpm, slimcc, sparse, tcc, tokstyle] +# runs-on: ubuntu-latest +# steps: +# - name: Set up Docker Buildx +# uses: docker/setup-buildx-action@v3 +# with: +# driver: docker +# - name: Build toxchat/c-toxcore:sources +# uses: docker/build-push-action@v5 +# with: +# file: other/docker/sources/sources.Dockerfile +# tags: toxchat/c-toxcore:sources +# - name: Docker Build +# uses: docker/build-push-action@v5 +# with: +# file: other/docker/${{ matrix.tool }}/${{ matrix.tool }}.Dockerfile + + sanitizer: strategy: fail-fast: false matrix: - tool: [autotools, clang-tidy, compcert, cppcheck, doxygen, goblint, infer, freebsd, misra, modules, pkgsrc, rpm, slimcc, sparse, tcc, tokstyle] + sanitizer: [asan, tsan, ubsan] runs-on: ubuntu-latest steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: driver: docker - - name: Build toxchat/c-toxcore:sources - uses: docker/build-push-action@v5 - with: - file: other/docker/sources/sources.Dockerfile - tags: toxchat/c-toxcore:sources - - name: Docker Build - uses: docker/build-push-action@v5 - with: - file: other/docker/${{ matrix.tool }}/${{ matrix.tool }}.Dockerfile - - coverage-linux: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Build, test, and upload coverage - run: other/docker/coverage/run - - generate-events: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Run generate_event_c - run: | - other/event_tooling/run - git diff --exit-code - - cimplefmt: - runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 with: submodules: recursive - - name: Run cimplefmt - run: other/docker/cimplefmt/run -u $(find tox* -name "*.[ch]") + - name: Run sanitizer + run: other/docker/circleci/run "${{ matrix.sanitizer }}" - build-android: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - run: .github/scripts/cmake-android armeabi-v7a - - run: .github/scripts/cmake-android arm64-v8a - - run: .github/scripts/cmake-android x86 - - run: .github/scripts/cmake-android x86_64 - - build-macos: - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Build and test - run: .github/scripts/cmake-osx - - build-windows-msvc: - strategy: - matrix: - version: [2019, 2022] - runs-on: windows-${{ matrix.version }} - env: - VCPKG_ROOT: "C:/vcpkg" - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v7 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Configure CMake - run: cmake --preset windows-default - - name: Build - run: cmake --build _build -j $([int]$env:NUMBER_OF_PROCESSORS+2) - - name: Test - run: | - cd _build - ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 --build-config Debug - - build-netbsd: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Test in NetBSD - id: test - uses: vmactions/netbsd-vm@v1 - with: - usesh: true - copyback: false - prepare: - /usr/sbin/pkg_add - cmake - googletest - libconfig - libopus - libsodium - libvpx - pkg-config - - run: | - # TODO(iphydf): Investigate NetBSD failures on these tests. - sed -Ei -e '/\((TCP|dht_getnodes_api)\)/s/^/#/' auto_tests/CMakeLists.txt - cmake . \ - -DMIN_LOGGER_LEVEL=TRACE \ - -DMUST_BUILD_TOXAV=ON \ - -DNON_HERMETIC_TESTS=ON \ - -DTEST_TIMEOUT_SECONDS=90 \ - -DUSE_IPV6=OFF \ - -DAUTOTEST=ON - cmake --build . --target install - ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 - - build-freebsd: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Test in FreeBSD - id: test - uses: vmactions/freebsd-vm@v1 - with: - usesh: true - copyback: false - prepare: - PAGER=cat ASSUME_ALWAYS_YES=YES pkg install - cmake - git - gmake - googletest - libconfig - libsodium - libvpx - opus - pkgconf - - run: | - # TODO(iphydf): Investigate FreeBSD failures on these tests. - sed -Ei -e '/\(dht_getnodes_api\)/s/^/#/' auto_tests/CMakeLists.txt - cmake . \ - -DMIN_LOGGER_LEVEL=TRACE \ - -DMUST_BUILD_TOXAV=ON \ - -DNON_HERMETIC_TESTS=ON \ - -DTEST_TIMEOUT_SECONDS=50 \ - -DUSE_IPV6=OFF \ - -DAUTOTEST=ON - cmake --build . --target install - ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 - - mypy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Set up Python 3.9 - uses: actions/setup-python@v5 - with: - python-version: 3.9 - - name: Install mypy - run: pip install mypy - - name: Run mypy - run: | - (find . -name "*.py" -and -not -name "conanfile.py"; grep -lR '^#!.*python') \ - | xargs -n1 -P8 mypy --strict +# coverage-linux: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Build, test, and upload coverage +# run: other/docker/coverage/run +# +# generate-events: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Run generate_event_c +# run: | +# other/event_tooling/run +# git diff --exit-code +# +# cimplefmt: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Run cimplefmt +# run: other/docker/cimplefmt/run -u $(find tox* -name "*.[ch]") +# +# build-android: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - run: .github/scripts/cmake-android armeabi-v7a +# - run: .github/scripts/cmake-android arm64-v8a +# - run: .github/scripts/cmake-android x86 +# - run: .github/scripts/cmake-android x86_64 +# +# build-macos: +# runs-on: macos-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Build and test +# run: .github/scripts/cmake-osx +# +# build-windows-msvc: +# strategy: +# matrix: +# version: [2019, 2022] +# runs-on: windows-${{ matrix.version }} +# env: +# VCPKG_ROOT: "C:/vcpkg" +# VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Export GitHub Actions cache environment variables +# uses: actions/github-script@v7 +# with: +# script: | +# core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); +# core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); +# - name: Configure CMake +# run: cmake --preset windows-default +# - name: Build +# run: cmake --build _build -j $([int]$env:NUMBER_OF_PROCESSORS+2) +# - name: Test +# run: | +# cd _build +# ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 --build-config Debug +# +# build-netbsd: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Test in NetBSD +# id: test +# uses: vmactions/netbsd-vm@v1 +# with: +# usesh: true +# copyback: false +# prepare: +# /usr/sbin/pkg_add +# cmake +# googletest +# libconfig +# libopus +# libsodium +# libvpx +# pkg-config +# +# run: | +# # TODO(iphydf): Investigate NetBSD failures on these tests. +# sed -Ei -e '/\((TCP|dht_getnodes_api)\)/s/^/#/' auto_tests/CMakeLists.txt +# cmake . \ +# -DMIN_LOGGER_LEVEL=TRACE \ +# -DMUST_BUILD_TOXAV=ON \ +# -DNON_HERMETIC_TESTS=ON \ +# -DTEST_TIMEOUT_SECONDS=90 \ +# -DUSE_IPV6=OFF \ +# -DAUTOTEST=ON +# cmake --build . --target install +# ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 +# +# build-freebsd: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Test in FreeBSD +# id: test +# uses: vmactions/freebsd-vm@v1 +# with: +# usesh: true +# copyback: false +# prepare: +# PAGER=cat ASSUME_ALWAYS_YES=YES pkg install +# cmake +# git +# gmake +# googletest +# libconfig +# libsodium +# libvpx +# opus +# pkgconf +# +# run: | +# # TODO(iphydf): Investigate FreeBSD failures on these tests. +# sed -Ei -e '/\(dht_getnodes_api\)/s/^/#/' auto_tests/CMakeLists.txt +# cmake . \ +# -DMIN_LOGGER_LEVEL=TRACE \ +# -DMUST_BUILD_TOXAV=ON \ +# -DNON_HERMETIC_TESTS=ON \ +# -DTEST_TIMEOUT_SECONDS=50 \ +# -DUSE_IPV6=OFF \ +# -DAUTOTEST=ON +# cmake --build . --target install +# ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 +# +# mypy: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# submodules: recursive +# - name: Set up Python 3.9 +# uses: actions/setup-python@v5 +# with: +# python-version: 3.9 +# - name: Install mypy +# run: pip install mypy +# - name: Run mypy +# run: | +# (find . -name "*.py" -and -not -name "conanfile.py"; grep -lR '^#!.*python') \ +# | xargs -n1 -P8 mypy --strict diff --git a/other/docker/circleci/Dockerfile b/other/docker/circleci/Dockerfile index 3b23eed793..cb431c3d9f 100644 --- a/other/docker/circleci/Dockerfile +++ b/other/docker/circleci/Dockerfile @@ -1,18 +1,18 @@ ################################################ # cmake-asan -FROM ubuntu:20.04 +FROM ubuntu:24.04 RUN apt-get update && \ DEBIAN_FRONTEND="noninteractive" apt-get install -y --no-install-recommends \ clang \ cmake \ + libclang-rt-dev \ libconfig-dev \ libgmock-dev \ libgtest-dev \ libopus-dev \ libsodium-dev \ libvpx-dev \ - llvm-dev \ ninja-build \ pkg-config \ && apt-get clean \ @@ -22,8 +22,8 @@ COPY entrypoint.sh / RUN ["chmod", "755", "/entrypoint.sh"] WORKDIR /home/builder -RUN groupadd -r -g 1000 builder \ - && useradd --no-log-init -r -g builder -u 1000 builder \ +RUN groupadd -r -g 987 builder \ + && useradd --no-log-init -r -g builder -u 987 builder \ && chown builder:builder /home/builder USER builder diff --git a/other/docker/circleci/entrypoint.sh b/other/docker/circleci/entrypoint.sh index 971759235f..0788e71d51 100755 --- a/other/docker/circleci/entrypoint.sh +++ b/other/docker/circleci/entrypoint.sh @@ -1,9 +1,9 @@ #!/bin/sh -set -eu +set -eux SANITIZER="${1:-asan}" cp -a /c-toxcore . cd c-toxcore -.circleci/cmake-"$SANITIZER" +.circleci/cmake-"$SANITIZER" || (cat /home/builder/c-toxcore/_build/CMakeFiles/CMakeError.log && false) diff --git a/other/docker/circleci/run b/other/docker/circleci/run index 668e0fc865..2a54e07213 100755 --- a/other/docker/circleci/run +++ b/other/docker/circleci/run @@ -1,6 +1,8 @@ #!/bin/sh +set -eux + SANITIZER="${1:-asan}" docker build -t toxchat/c-toxcore:circleci other/docker/circleci -docker run --name toxcore-circleci --rm -it -v "$PWD:/c-toxcore" toxchat/c-toxcore:circleci "$SANITIZER" +docker run --name toxcore-circleci --rm --interactive --tty --volume "$PWD:/c-toxcore" toxchat/c-toxcore:circleci "$SANITIZER"