From 0f29c38725b23fb67232c02f4ee6683d5378b2d5 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Wed, 11 Mar 2026 17:10:03 +0100 Subject: [PATCH 1/3] ci: add Bitcoin Core IPC tests (ASan + macOS) --- .github/workflows/bitcoin-core-ci.yml | 160 ++++++++++++++++++++++++++ ci/scripts/bitcoin_core_ci.sh | 98 ++++++++++++++++ ci/scripts/ci_helpers.sh | 74 ++++++++++++ 3 files changed, 332 insertions(+) create mode 100644 .github/workflows/bitcoin-core-ci.yml create mode 100755 ci/scripts/bitcoin_core_ci.sh create mode 100755 ci/scripts/ci_helpers.sh diff --git a/.github/workflows/bitcoin-core-ci.yml b/.github/workflows/bitcoin-core-ci.yml new file mode 100644 index 0000000..8c9412e --- /dev/null +++ b/.github/workflows/bitcoin-core-ci.yml @@ -0,0 +1,160 @@ +# Copyright (c) The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://opensource.org/license/mit. + +# Test libmultiprocess inside Bitcoin Core by replacing the subtree copy +# with the version from this PR, then building and running IPC-related +# unit & functional tests. + +name: Bitcoin Core CI + +on: + push: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + BITCOIN_REPO: bitcoin/bitcoin + LLVM_VERSION: 22 + +jobs: + bitcoin-core: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runner }} + timeout-minutes: 120 + + strategy: + fail-fast: false + matrix: + include: + - name: 'ASan + UBSan' + unit_test_runs: 1 + functional_test_runs: 1 + nproc_multiplier: 1 + functional_timeout_factor: 4 + runner: ubuntu-24.04 + apt-llvm: true + packages: >- + ccache + clang-22 + llvm-22 + libclang-rt-22-dev + libevent-dev + libboost-dev + libsqlite3-dev + libcapnp-dev + capnproto + ninja-build + pkgconf + python3-pip + pip-packages: --break-system-packages pycapnp + cmake-args: |- + -DSANITIZERS=address,float-divide-by-zero,integer,undefined + -DCMAKE_C_COMPILER=clang + -DCMAKE_CXX_COMPILER=clang++ + -DCMAKE_C_FLAGS=-ftrivial-auto-var-init=pattern + -DCMAKE_CXX_FLAGS=-ftrivial-auto-var-init=pattern + + - name: 'macOS' + unit_test_runs: 1 + functional_test_runs: 1 + nproc_multiplier: 1 + functional_timeout_factor: 4 + runner: macos-15 + brew-packages: ccache capnp boost libevent sqlite pkgconf ninja + pip-packages: --break-system-packages pycapnp + cmake-args: |- + -DREDUCE_EXPORTS=ON + + env: + CCACHE_MAXSIZE: 400M + CCACHE_DIR: ${{ github.workspace }}/.ccache + + steps: + - name: Checkout Bitcoin Core + uses: actions/checkout@v4 + with: + repository: ${{ env.BITCOIN_REPO }} + fetch-depth: 1 + + - name: Checkout libmultiprocess + uses: actions/checkout@v4 + with: + path: _libmultiprocess + + - name: Replace libmultiprocess subtree + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh replace_subtree + + - name: Add LLVM apt repository + if: matrix.apt-llvm + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh add_llvm_apt_repository + + - name: Install APT packages + if: matrix.packages + run: _libmultiprocess/ci/scripts/ci_helpers.sh install_apt_packages ${{ matrix.packages }} + + - name: Configure LLVM alternatives + if: matrix.packages + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh install_llvm_alternatives + + - name: Install Homebrew packages + if: matrix.brew-packages + run: _libmultiprocess/ci/scripts/ci_helpers.sh install_homebrew_packages ${{ matrix.brew-packages }} + + - name: Install pip packages + if: matrix.pip-packages + run: _libmultiprocess/ci/scripts/ci_helpers.sh install_pip_packages ${{ matrix.pip-packages }} + + - name: Determine parallelism + run: _libmultiprocess/ci/scripts/ci_helpers.sh determine_parallelism "${{ matrix.nproc_multiplier }}" + + - name: Restore ccache + id: ccache-restore + uses: actions/cache/restore@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-${{ matrix.name }}-${{ github.ref }}-${{ github.sha }} + restore-keys: | + ccache-${{ matrix.name }}-${{ github.ref }}- + ccache-${{ matrix.name }}- + + - name: Reset ccache stats + if: matrix.packages || matrix.brew-packages + run: _libmultiprocess/ci/scripts/ci_helpers.sh reset_ccache_stats + + - name: CMake configure + env: + BITCOIN_CORE_CMAKE_ARGS: ${{ matrix.cmake-args }} + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh configure_bitcoin_core + + - name: Build + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh build_bitcoin_core + + - name: Show ccache stats + if: matrix.packages || matrix.brew-packages + run: _libmultiprocess/ci/scripts/ci_helpers.sh show_ccache_stats + + - name: Run IPC unit tests + env: + ASAN_OPTIONS: detect_leaks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1 + LSAN_OPTIONS: suppressions=${{ github.workspace }}/test/sanitizer_suppressions/lsan + UBSAN_OPTIONS: suppressions=${{ github.workspace }}/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1 + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh run_ipc_unit_tests "${{ matrix.unit_test_runs }}" + + - name: Run IPC functional tests + env: + ASAN_OPTIONS: detect_leaks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1 + LSAN_OPTIONS: suppressions=${{ github.workspace }}/test/sanitizer_suppressions/lsan + UBSAN_OPTIONS: suppressions=${{ github.workspace }}/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1 + CI_FAILFAST_TEST_LEAVE_DANGLING: 1 + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh run_ipc_functional_tests "${{ matrix.functional_test_runs }}" "${{ matrix.functional_timeout_factor }}" + + - name: Save ccache + uses: actions/cache/save@v4 + if: github.ref == 'refs/heads/master' || steps.ccache-restore.outputs.cache-hit != 'true' + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-${{ matrix.name }}-${{ github.ref }}-${{ github.sha }} diff --git a/ci/scripts/bitcoin_core_ci.sh b/ci/scripts/bitcoin_core_ci.sh new file mode 100755 index 0000000..6b91852 --- /dev/null +++ b/ci/scripts/bitcoin_core_ci.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +set -o errexit -o nounset -o pipefail -o xtrace + +readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" + +source "${SCRIPT_DIR}/ci_helpers.sh" + +replace_subtree() { + rm -rf src/ipc/libmultiprocess + cp -a _libmultiprocess src/ipc/libmultiprocess + rm -rf src/ipc/libmultiprocess/.git +} + +add_llvm_apt_repository() { + curl -s "https://apt.llvm.org/llvm-snapshot.gpg.key" | sudo tee "/etc/apt/trusted.gpg.d/apt.llvm.org.asc" > /dev/null + source /etc/os-release + echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${LLVM_VERSION} main" | sudo tee "/etc/apt/sources.list.d/llvm.list" + sudo apt-get update +} + +install_llvm_alternatives() { + sudo update-alternatives --install /usr/bin/clang++ clang++ "/usr/bin/clang++-${LLVM_VERSION}" 100 + sudo update-alternatives --install /usr/bin/clang clang "/usr/bin/clang-${LLVM_VERSION}" 100 + sudo update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer "/usr/bin/llvm-symbolizer-${LLVM_VERSION}" 100 +} + + +configure_bitcoin_core() { + local cmake_arg + local cmake_args=() + + if [[ -n "${BITCOIN_CORE_CMAKE_ARGS:-}" ]]; then + while IFS= read -r cmake_arg; do + [[ -n "${cmake_arg}" ]] || continue + cmake_args+=("${cmake_arg}") + done <<< "${BITCOIN_CORE_CMAKE_ARGS}" + fi + + cmake -S . -B build \ + --preset=dev-mode \ + -DCMAKE_BUILD_TYPE=Debug \ + -DBUILD_GUI=OFF \ + -DBUILD_GUI_TESTS=OFF \ + -DWITH_ZMQ=OFF \ + -DWITH_USDT=OFF \ + -DBUILD_BENCH=OFF \ + -DBUILD_FUZZ_BINARY=OFF \ + -DWITH_QRENCODE=OFF \ + -G Ninja \ + "${cmake_args[@]}" +} + +build_bitcoin_core() { + cmake --build build --parallel "${BUILD_PARALLEL}" +} + +run_ipc_unit_tests() { + local runs="$1" + + for _ in $(seq 1 "${runs}"); do + build/bin/test_bitcoin --run_test=ipc_tests,miner_tests --catch_system_error=no --log_level=nothing --report_level=no + done +} + +run_ipc_functional_tests() { + local runs="$1" + local timeout_factor="$2" + local test_scripts + local test_args=() + + test_scripts=$(python3 -c "import sys; import os; sys.path.append(os.path.abspath('build/test/functional')); from test_runner import ALL_SCRIPTS; print(' '.join(s for s in ALL_SCRIPTS if s.startswith('interface_ipc')))") + for _ in $(seq 1 "${runs}"); do + for script in $test_scripts; do + test_args+=("$script") + done + done + build/test/functional/test_runner.py "${test_args[@]}" --jobs "${PARALLEL}" --timeout-factor="${timeout_factor}" --failfast --combinedlogslen=99999999 +} + +main() { + local command="${1:?missing command}" + shift + + [[ "${command}" =~ ^[a-z_][a-z0-9_]*$ ]] || { + echo "Invalid command: ${command}" >&2 + exit 1 + } + + if declare -F "${command}" >/dev/null; then + "${command}" "$@" + else + echo "Unknown command: ${command}" >&2 + exit 1 + fi +} + +main "$@" diff --git a/ci/scripts/ci_helpers.sh b/ci/scripts/ci_helpers.sh new file mode 100755 index 0000000..9128018 --- /dev/null +++ b/ci/scripts/ci_helpers.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +set -o errexit -o nounset -o pipefail -o xtrace + +write_env_var() { + local key="$1" + local value="$2" + + if [[ -n "${GITHUB_ENV:-}" ]]; then + echo "${key}=${value}" >> "${GITHUB_ENV}" + else + export "${key}=${value}" + fi +} + +available_nproc() { + if command -v nproc >/dev/null 2>&1; then + nproc + else + sysctl -n hw.logicalcpu + fi +} + +determine_parallelism() { + local multiplier="$1" + local available + + available="$(available_nproc)" + write_env_var BUILD_PARALLEL "${available}" + write_env_var PARALLEL "$((available * multiplier))" +} + +reset_ccache_stats() { + which ccache + ccache --version + ccache --zero-stats +} + +show_ccache_stats() { + ccache --show-stats +} + +install_apt_packages() { + sudo apt-get install --no-install-recommends -y "$@" +} + +install_homebrew_packages() { + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew install --quiet "$@" +} + +install_pip_packages() { + pip3 install "$@" +} + +ci_helpers_main() { + local command="${1:?missing command}" + shift + + [[ "${command}" =~ ^[a-z_][a-z0-9_]*$ ]] || { + echo "Invalid command: ${command}" >&2 + exit 1 + } + + if declare -F "${command}" >/dev/null; then + "${command}" "$@" + else + echo "Unknown command: ${command}" >&2 + exit 1 + fi +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + ci_helpers_main "$@" +fi From fb0fc84d5564966d942ec76b6754c524851d2540 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Wed, 11 Mar 2026 17:16:56 +0100 Subject: [PATCH 2/3] ci: add TSan job with instrumented libc++ --- .github/workflows/bitcoin-core-ci.yml | 140 ++++++++++++++++++++++++++ ci/scripts/bitcoin_core_ci.sh | 73 ++++++++++++++ ci/scripts/ci_helpers.sh | 18 ++++ 3 files changed, 231 insertions(+) diff --git a/.github/workflows/bitcoin-core-ci.yml b/.github/workflows/bitcoin-core-ci.yml index 8c9412e..9726782 100644 --- a/.github/workflows/bitcoin-core-ci.yml +++ b/.github/workflows/bitcoin-core-ci.yml @@ -19,6 +19,7 @@ concurrency: env: BITCOIN_REPO: bitcoin/bitcoin LLVM_VERSION: 22 + LIBCXX_DIR: /tmp/libcxx-build/ jobs: bitcoin-core: @@ -158,3 +159,142 @@ jobs: with: path: ${{ env.CCACHE_DIR }} key: ccache-${{ matrix.name }}-${{ github.ref }}-${{ github.sha }} + + bitcoin-core-tsan: + name: ${{ matrix.name }} + runs-on: ubuntu-24.04 + timeout-minutes: 180 + + strategy: + matrix: + include: + - name: TSan + unit_test_runs: 8 + functional_test_runs: 300 + nproc_multiplier: 10 + functional_timeout_factor: 10 + + env: + CCACHE_MAXSIZE: 400M + CCACHE_DIR: ${{ github.workspace }}/.ccache + LIBCXX_FLAGS: >- + -fsanitize=thread + -nostdinc++ + -nostdlib++ + -isystem /tmp/libcxx-build/include/c++/v1 + -L/tmp/libcxx-build/lib + -Wl,-rpath,/tmp/libcxx-build/lib + -lc++ + -lc++abi + -lpthread + -Wno-unused-command-line-argument + TSAN_OPTIONS: suppressions=${{ github.workspace }}/test/sanitizer_suppressions/tsan:halt_on_error=1:second_deadlock_stack=1 + + steps: + - name: Checkout Bitcoin Core + uses: actions/checkout@v4 + with: + repository: ${{ env.BITCOIN_REPO }} + fetch-depth: 1 + + - name: Checkout libmultiprocess + uses: actions/checkout@v4 + with: + path: _libmultiprocess + + - name: Add LLVM apt repository + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh add_llvm_apt_repository + + - name: Install packages + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh install_tsan_packages + + - name: Determine parallelism + run: _libmultiprocess/ci/scripts/ci_helpers.sh determine_parallelism "${{ matrix.nproc_multiplier }}" + + - name: Restore instrumented libc++ cache + id: libcxx-cache + uses: actions/cache@v4 + with: + path: ${{ env.LIBCXX_DIR }} + key: libcxx-Thread-llvmorg-${{ env.LLVM_VERSION }}.1.0 + + - name: Build instrumented libc++ + if: steps.libcxx-cache.outputs.cache-hit != 'true' + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh build_instrumented_libcxx + + - name: Determine host + id: host + run: _libmultiprocess/ci/scripts/ci_helpers.sh determine_host + + - name: Restore depends cache + id: depends-cache + uses: actions/cache/restore@v4 + with: + path: | + depends/built + depends/${{ steps.host.outputs.host }} + key: depends-tsan-${{ hashFiles('depends/packages/*.mk') }}-${{ env.LLVM_VERSION }} + + - name: Build depends (stage 1, without IPC) + if: steps.depends-cache.outputs.cache-hit != 'true' + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh build_depends_without_ipc + + - name: Save depends cache + uses: actions/cache/save@v4 + if: steps.depends-cache.outputs.cache-hit != 'true' + with: + path: | + depends/built + depends/${{ steps.host.outputs.host }} + key: depends-tsan-${{ hashFiles('depends/packages/*.mk') }}-${{ env.LLVM_VERSION }} + + - name: Replace libmultiprocess subtree + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh replace_subtree + + - name: Build depends (stage 2, IPC packages including libmultiprocess) + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh build_depends_with_ipc + + - name: Restore ccache + id: ccache-restore + uses: actions/cache/restore@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-TSan-${{ github.ref }}-${{ github.sha }} + restore-keys: | + ccache-TSan-${{ github.ref }}- + ccache-TSan- + + - name: Reset ccache stats + run: _libmultiprocess/ci/scripts/ci_helpers.sh reset_ccache_stats + + - name: CMake configure + env: + BITCOIN_CORE_CMAKE_ARGS: |- + -DSANITIZERS=thread + -DAPPEND_CPPFLAGS=-DARENA_DEBUG -DDEBUG_LOCKCONTENTION -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES + -DCMAKE_TOOLCHAIN_FILE=depends/${{ steps.host.outputs.host }}/toolchain.cmake + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh configure_bitcoin_core + + - name: Build + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh build_bitcoin_core + + - name: Show ccache stats + run: _libmultiprocess/ci/scripts/ci_helpers.sh show_ccache_stats + + - name: Run IPC unit tests + env: + LD_LIBRARY_PATH: depends/${{ steps.host.outputs.host }}/lib + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh run_ipc_unit_tests "${{ matrix.unit_test_runs }}" + + - name: Run IPC functional tests + env: + LD_LIBRARY_PATH: depends/${{ steps.host.outputs.host }}/lib + CI_FAILFAST_TEST_LEAVE_DANGLING: 1 + run: _libmultiprocess/ci/scripts/bitcoin_core_ci.sh run_ipc_functional_tests "${{ matrix.functional_test_runs }}" "${{ matrix.functional_timeout_factor }}" + + - name: Save ccache + uses: actions/cache/save@v4 + if: github.ref == 'refs/heads/master' || steps.ccache-restore.outputs.cache-hit != 'true' + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-TSan-${{ github.ref }}-${{ github.sha }} diff --git a/ci/scripts/bitcoin_core_ci.sh b/ci/scripts/bitcoin_core_ci.sh index 6b91852..cba022d 100755 --- a/ci/scripts/bitcoin_core_ci.sh +++ b/ci/scripts/bitcoin_core_ci.sh @@ -25,6 +25,56 @@ install_llvm_alternatives() { sudo update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer "/usr/bin/llvm-symbolizer-${LLVM_VERSION}" 100 } +set_llvm_alternatives() { + sudo update-alternatives --set clang "/usr/bin/clang-${LLVM_VERSION}" + sudo update-alternatives --set clang++ "/usr/bin/clang++-${LLVM_VERSION}" + sudo update-alternatives --set llvm-symbolizer "/usr/bin/llvm-symbolizer-${LLVM_VERSION}" +} + +install_tsan_packages() { + install_apt_packages \ + ccache \ + "clang-${LLVM_VERSION}" \ + "llvm-${LLVM_VERSION}" \ + "llvm-${LLVM_VERSION}-dev" \ + "libclang-${LLVM_VERSION}-dev" \ + "libclang-rt-${LLVM_VERSION}-dev" \ + ninja-build \ + pkgconf \ + python3-pip \ + bison + install_llvm_alternatives + set_llvm_alternatives + install_pip_packages --break-system-packages pycapnp +} + +build_instrumented_libcxx() { + export PATH="/usr/lib/llvm-${LLVM_VERSION}/bin:${PATH}" + + ls -l /usr/bin/clang /usr/bin/clang++ /usr/bin/llvm-symbolizer + which clang clang++ llvm-symbolizer + clang --version + clang++ --version + "/usr/bin/clang-${LLVM_VERSION}" --version + "/usr/bin/clang++-${LLVM_VERSION}" --version + git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-${LLVM_VERSION}.1.0" /tmp/llvm-project + cmake -G Ninja -B "${LIBCXX_DIR}" \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_USE_SANITIZER=Thread \ + -DCMAKE_C_COMPILER="/usr/bin/clang-${LLVM_VERSION}" \ + -DCMAKE_CXX_COMPILER="/usr/bin/clang++-${LLVM_VERSION}" \ + -DLLVM_TARGETS_TO_BUILD=Native \ + -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \ + -DLIBCXX_INCLUDE_TESTS=OFF \ + -DLIBCXXABI_INCLUDE_TESTS=OFF \ + -DLIBUNWIND_INCLUDE_TESTS=OFF \ + -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ + -S /tmp/llvm-project/runtimes + grep -E 'CMAKE_(C|CXX)_COMPILER' "${LIBCXX_DIR}/CMakeCache.txt" + ninja -C "${LIBCXX_DIR}" -j "${BUILD_PARALLEL}" -v + rm -rf /tmp/llvm-project +} configure_bitcoin_core() { local cmake_arg @@ -55,6 +105,29 @@ build_bitcoin_core() { cmake --build build --parallel "${BUILD_PARALLEL}" } +build_depends_without_ipc() { + make -C depends -j "${BUILD_PARALLEL}" \ + CC=clang \ + CXX=clang++ \ + CXXFLAGS="${LIBCXX_FLAGS}" \ + NO_QT=1 \ + NO_ZMQ=1 \ + NO_USDT=1 \ + NO_QR=1 \ + NO_IPC=1 +} + +build_depends_with_ipc() { + make -C depends -j "${BUILD_PARALLEL}" \ + CC=clang \ + CXX=clang++ \ + CXXFLAGS="${LIBCXX_FLAGS}" \ + NO_QT=1 \ + NO_ZMQ=1 \ + NO_USDT=1 \ + NO_QR=1 +} + run_ipc_unit_tests() { local runs="$1" diff --git a/ci/scripts/ci_helpers.sh b/ci/scripts/ci_helpers.sh index 9128018..dbd1141 100755 --- a/ci/scripts/ci_helpers.sh +++ b/ci/scripts/ci_helpers.sh @@ -13,6 +13,17 @@ write_env_var() { fi } +write_output_var() { + local key="$1" + local value="$2" + + if [[ -n "${GITHUB_OUTPUT:-}" ]]; then + echo "${key}=${value}" >> "${GITHUB_OUTPUT}" + else + echo "${key}=${value}" + fi +} + available_nproc() { if command -v nproc >/dev/null 2>&1; then nproc @@ -52,6 +63,13 @@ install_pip_packages() { pip3 install "$@" } +determine_host() { + local config_guess="${1:-./depends/config.guess}" + local output_key="${2:-host}" + + write_output_var "${output_key}" "$("${config_guess}")" +} + ci_helpers_main() { local command="${1:?missing command}" shift From 55a9b557b195247fb4532b755ec7775592c0b70c Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Thu, 12 Mar 2026 21:21:07 +0100 Subject: [PATCH 3/3] ci: set Bitcoin Core CI test repetition --- .github/workflows/bitcoin-core-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/bitcoin-core-ci.yml b/.github/workflows/bitcoin-core-ci.yml index 9726782..db94e55 100644 --- a/.github/workflows/bitcoin-core-ci.yml +++ b/.github/workflows/bitcoin-core-ci.yml @@ -32,9 +32,9 @@ jobs: matrix: include: - name: 'ASan + UBSan' - unit_test_runs: 1 - functional_test_runs: 1 - nproc_multiplier: 1 + unit_test_runs: 15 + functional_test_runs: 300 + nproc_multiplier: 10 functional_timeout_factor: 4 runner: ubuntu-24.04 apt-llvm: true @@ -60,9 +60,9 @@ jobs: -DCMAKE_CXX_FLAGS=-ftrivial-auto-var-init=pattern - name: 'macOS' - unit_test_runs: 1 - functional_test_runs: 1 - nproc_multiplier: 1 + unit_test_runs: 50 + functional_test_runs: 200 + nproc_multiplier: 5 functional_timeout_factor: 4 runner: macos-15 brew-packages: ccache capnp boost libevent sqlite pkgconf ninja