mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-24 00:06:09 +01:00
eb510f8678ci: fail fast in test-each-commit script (Lőrinc)04c4d71008ci: remove commit count limit from `test-each-commit` (Lőrinc) Pull request description: ### Problem `test-each-commit` currently tests only a limited number of ancestor commits in a PR, so failures introduced deeper in the commit stack might be missed. ### Fix Remove the max-count limit so `test-each-commit` runs the full build + unit + functional test flow on every non-head PR commit, while keeping the PR tip excluded because it is already covered by the normal CI jobs. It will also stop after the first failure to surface the root cause sooner and keep logs readable when testing ancestor commits. ### Examples * Example failure 10 commits deep: https://github.com/l0rinc/bitcoin/actions/runs/21390976651/job/61577575033?pr=105 in https://github.com/l0rinc/bitcoin/pull/105 * Example pass with >7 dummy commits: https://github.com/l0rinc/bitcoin/actions/runs/21392557521/job/61595159841?pr=106 in https://github.com/l0rinc/bitcoin/pull/106 --------- Note: this PR has gone through a few iterations, the latest one just extends the existing job. ACKs for top commit: maflcko: lgtm ACKeb510f8678🕓 hebasto: re-ACKeb510f8678. willcl-ark: ACKeb510f8678Tree-SHA512: 5aadafd32daad610ce882277802c390642dc34f7d5bfa71d4b503ee007942d1ebafce2a3430ea5fd2af6673c83f9aee42450043be4722d7c02407d90920f8bce
612 lines
24 KiB
YAML
612 lines
24 KiB
YAML
# Copyright (c) 2023-present The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or https://opensource.org/license/mit.
|
|
|
|
name: CI
|
|
on:
|
|
# See: https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request.
|
|
pull_request:
|
|
# See: https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#push.
|
|
push:
|
|
branches:
|
|
- '**'
|
|
tags-ignore:
|
|
- '**'
|
|
|
|
concurrency:
|
|
group: ${{ github.event_name != 'pull_request' && github.run_id || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
CI_FAILFAST_TEST_LEAVE_DANGLING: 1 # GHA does not care about dangling processes and setting this variable avoids killing the CI script itself on error
|
|
CIRRUS_CACHE_HOST: http://127.0.0.1:12321/ # When using Cirrus Runners this host can be used by the docker `gha` build cache type.
|
|
REPO_USE_CIRRUS_RUNNERS: 'bitcoin/bitcoin' # Use cirrus runners and cache for this repo, instead of falling back to the slow GHA runners
|
|
|
|
defaults:
|
|
run:
|
|
# Enforce fail-fast behavior for all platforms.
|
|
# See: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference
|
|
shell: bash
|
|
|
|
jobs:
|
|
runners:
|
|
name: '[meta] determine runners'
|
|
runs-on: ubuntu-slim
|
|
outputs:
|
|
provider: ${{ steps.runners.outputs.provider }}
|
|
steps:
|
|
- &ANNOTATION_PR_NUMBER
|
|
name: Annotate with pull request number
|
|
# This annotation is machine-readable and can be used to assign a check
|
|
# run to its corresponding pull request. Running in all check runs is
|
|
# required, because check re-runs discard the annotations of other
|
|
# tasks in the test suite.
|
|
run: |
|
|
if [ "${{ github.event_name }}" = "pull_request" ]; then
|
|
echo "::notice title=debug_pull_request_number_str::${{ github.event.number }}"
|
|
fi
|
|
- id: runners
|
|
run: |
|
|
if [[ "${REPO_USE_CIRRUS_RUNNERS}" == "${{ github.repository }}" ]]; then
|
|
echo "provider=cirrus" >> "$GITHUB_OUTPUT"
|
|
echo "::notice title=Runner Selection::Using Cirrus Runners"
|
|
else
|
|
echo "provider=gha" >> "$GITHUB_OUTPUT"
|
|
echo "::notice title=Runner Selection::Using GitHub-hosted runners"
|
|
fi
|
|
|
|
test-each-commit:
|
|
name: 'test ancestor commits'
|
|
needs: runners
|
|
runs-on: ${{ needs.runners.outputs.provider == 'cirrus' && 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md' || 'ubuntu-24.04' }}
|
|
if: github.event_name == 'pull_request' && github.event.pull_request.commits != 1
|
|
timeout-minutes: 360 # Use maximum time, see https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes.
|
|
steps:
|
|
- name: Determine fetch depth
|
|
run: echo "FETCH_DEPTH=$((${{ github.event.pull_request.commits }} + 2))" >> "$GITHUB_ENV"
|
|
- *ANNOTATION_PR_NUMBER
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha }}
|
|
fetch-depth: ${{ env.FETCH_DEPTH }}
|
|
- name: Determine commit range
|
|
run: |
|
|
# Checkout HEAD~ and find the test base commit.
|
|
# Checkout HEAD~ because it would be wasteful to rerun
|
|
# tests on the PR head commit that are already run
|
|
# by other jobs.
|
|
git checkout HEAD~
|
|
# Moreover, pull requests that contain a merge commit
|
|
# are generally draft pull requests that merge in other
|
|
# pull requests, so only check the relevant commits
|
|
# after the last merge commit. A merge commit could
|
|
# also be a subtree merge commit, which may be
|
|
# worthwhile to check. However, it is rare that the
|
|
# subtree merge commit is not the top commit (which
|
|
# would be skipped anyway by this task, because it is
|
|
# run by all other tasks). Also, `git rebase --exec`
|
|
# does not work on merge commits, so if this was
|
|
# important to check, the logic would have to be
|
|
# rewritten.
|
|
#
|
|
# Figure out test base commit by listing ancestors of
|
|
# HEAD, excluding ancestors of the most recent merge
|
|
# commit, ordering them from oldest to newest, and
|
|
# taking the first one.
|
|
#
|
|
# In the command below, the ^@ suffix is used to refer
|
|
# to all parents of the merge commit as described in:
|
|
# https://git-scm.com/docs/git-rev-parse#_other_rev_parent_shorthand_notations
|
|
# and the ^ prefix is used to exclude these parents
|
|
# and all their ancestors from the rev-list output
|
|
# as described in:
|
|
# https://git-scm.com/docs/git-rev-list
|
|
MERGE_BASE=$(git rev-list -n1 --merges HEAD)
|
|
EXCLUDE_MERGE_BASE_ANCESTORS=
|
|
# MERGE_BASE can be empty due to limited fetch-depth
|
|
if test -n "$MERGE_BASE"; then
|
|
EXCLUDE_MERGE_BASE_ANCESTORS=^${MERGE_BASE}^@
|
|
fi
|
|
echo "TEST_BASE=$(git rev-list -n${{ github.event.pull_request.commits }} --reverse HEAD $EXCLUDE_MERGE_BASE_ANCESTORS | head -1)" >> "$GITHUB_ENV"
|
|
- run: |
|
|
git fetch origin "${GITHUB_BASE_REF}"
|
|
git config user.email "ci@example.com"
|
|
git config user.name "CI"
|
|
- run: |
|
|
sudo apt-get update
|
|
sudo apt-get install clang mold ccache build-essential cmake ninja-build pkgconf python3-zmq libevent-dev libboost-dev libsqlite3-dev systemtap-sdt-dev libzmq3-dev qt6-base-dev qt6-tools-dev qt6-l10n-tools libqrencode-dev capnproto libcapnp-dev -y
|
|
sudo pip3 install --break-system-packages pycapnp
|
|
- name: Compile and run tests
|
|
run: |
|
|
# Run tests on commits after the last merge commit and before the PR head commit
|
|
git rebase --exec "git merge --no-commit origin/${GITHUB_BASE_REF} && python3 ./.github/ci-test-each-commit-exec.py && git reset --hard" ${{ env.TEST_BASE }}
|
|
|
|
macos-native-arm64:
|
|
name: ${{ matrix.job-name }}
|
|
# Use any image to support the xcode-select below, but hardcode version to avoid silent upgrades (and breaks).
|
|
# See: https://github.com/actions/runner-images#available-images.
|
|
runs-on: macos-15
|
|
|
|
# When a contributor maintains a fork of the repo, any pull request they make
|
|
# to their own fork, or to the main repository, will trigger two CI runs:
|
|
# one for the branch push and one for the pull request.
|
|
# This can be avoided by setting SKIP_BRANCH_PUSH=true as a custom env variable
|
|
# in Github repository settings.
|
|
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}
|
|
|
|
timeout-minutes: 120
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
job-type: [standard, fuzz]
|
|
include:
|
|
- job-type: standard
|
|
file-env: './ci/test/00_setup_env_mac_native.sh'
|
|
job-name: 'macOS native'
|
|
- job-type: fuzz
|
|
file-env: './ci/test/00_setup_env_mac_native_fuzz.sh'
|
|
job-name: 'macOS native, fuzz'
|
|
|
|
env:
|
|
DANGER_RUN_CI_ON_HOST: 1
|
|
BASE_ROOT_DIR: ${{ github.workspace }}/repo_archive
|
|
|
|
steps:
|
|
- *ANNOTATION_PR_NUMBER
|
|
|
|
- &CHECKOUT
|
|
name: Checkout
|
|
uses: actions/checkout@v6
|
|
with:
|
|
# Ensure the latest merged pull request state is used, even on re-runs.
|
|
ref: &CHECKOUT_REF_TMPL ${{ github.event_name == 'pull_request' && github.ref || '' }}
|
|
|
|
- name: Clang version
|
|
run: |
|
|
# Use the latest Xcode supported by the version of macOS denoted in
|
|
# doc/release-notes-empty-template.md and providing at least the
|
|
# minimum clang version denoted in doc/dependencies.md.
|
|
# See: https://developer.apple.com/documentation/xcode-release-notes/xcode-16_2-release-notes
|
|
sudo xcode-select --switch /Applications/Xcode_16.2.app
|
|
clang --version
|
|
|
|
- name: Install Homebrew packages
|
|
env:
|
|
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
|
|
run: |
|
|
# A workaround for "The `brew link` step did not complete successfully" error.
|
|
brew install --quiet python@3 || brew link --overwrite python@3
|
|
brew install --quiet coreutils ninja pkgconf ccache boost libevent zeromq qt@6 qrencode capnp
|
|
|
|
- name: Set Ccache directory
|
|
run: echo "CCACHE_DIR=${RUNNER_TEMP}/ccache_dir" >> "$GITHUB_ENV"
|
|
|
|
- name: Restore Ccache cache
|
|
id: ccache-cache
|
|
uses: actions/cache/restore@v4
|
|
with:
|
|
path: ${{ env.CCACHE_DIR }}
|
|
key: ${{ github.job }}-${{ matrix.job-type }}-ccache-${{ github.run_id }}
|
|
restore-keys: ${{ github.job }}-${{ matrix.job-type }}-ccache-
|
|
|
|
- name: Create git archive
|
|
run: |
|
|
git log -1
|
|
git archive --format=tar --prefix=repo_archive/ --output=repo.tar HEAD
|
|
tar -xf repo.tar
|
|
|
|
- name: CI script
|
|
run: |
|
|
cd repo_archive
|
|
./ci/test_run_all.sh
|
|
env:
|
|
FILE_ENV: ${{ matrix.file-env }}
|
|
|
|
- name: Save Ccache cache
|
|
uses: actions/cache/save@v4
|
|
if: github.event_name != 'pull_request' && github.ref_name == github.event.repository.default_branch && steps.ccache-cache.outputs.cache-hit != 'true'
|
|
with:
|
|
path: ${{ env.CCACHE_DIR }}
|
|
# https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache
|
|
key: ${{ github.job }}-${{ matrix.job-type }}-ccache-${{ github.run_id }}
|
|
|
|
windows-native-dll:
|
|
name: ${{ matrix.job-name }}
|
|
runs-on: windows-2025-vs2026
|
|
|
|
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}
|
|
|
|
env:
|
|
PYTHONUTF8: 1
|
|
TEST_RUNNER_TIMEOUT_FACTOR: 40
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
job-type: [standard, fuzz]
|
|
include:
|
|
- job-type: standard
|
|
job-name: 'Windows native, VS'
|
|
- job-type: fuzz
|
|
job-name: 'Windows native, fuzz, VS'
|
|
|
|
steps:
|
|
- *ANNOTATION_PR_NUMBER
|
|
|
|
- *CHECKOUT
|
|
|
|
- &SET_UP_VS
|
|
name: Set up VS Developer Prompt
|
|
shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'"
|
|
run: |
|
|
$vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
|
$installationPath = & $vswherePath -latest -property installationPath
|
|
& "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x64 -no_logo && set" | foreach-object {
|
|
$name, $value = $_ -split '=', 2
|
|
echo "$name=$value" >> $env:GITHUB_ENV
|
|
}
|
|
|
|
- name: Get tool information
|
|
shell: pwsh
|
|
run: |
|
|
cmake -version | Tee-Object -FilePath "cmake_version"
|
|
Write-Output "---"
|
|
msbuild -version | Tee-Object -FilePath "msbuild_version"
|
|
$env:VCToolsVersion | Tee-Object -FilePath "toolset_version"
|
|
py -3 --version
|
|
Write-Host "PowerShell version $($PSVersionTable.PSVersion.ToString())"
|
|
bash --version
|
|
|
|
- name: Using vcpkg with MSBuild
|
|
run: |
|
|
echo "set(VCPKG_BUILD_TYPE release)" >> "${VCPKG_INSTALLATION_ROOT}/triplets/x64-windows.cmake"
|
|
# Workaround for libevent, which requires CMake 3.1 but is incompatible with CMake >= 4.0.
|
|
sed -i '1s/^/set(ENV{CMAKE_POLICY_VERSION_MINIMUM} 3.5)\n/' "${VCPKG_INSTALLATION_ROOT}/scripts/ports.cmake"
|
|
|
|
- name: Set VCPKG_ROOT
|
|
run: |
|
|
echo "VCPKG_ROOT=${VCPKG_INSTALLATION_ROOT}" >> "$GITHUB_ENV"
|
|
|
|
- name: Restore vcpkg tools cache
|
|
id: vcpkg-tools-cache
|
|
uses: actions/cache/restore@v5
|
|
with:
|
|
path: C:/vcpkg/downloads/tools
|
|
key: ${{ github.job }}-vcpkg-tools-${{ github.run_id }}
|
|
restore-keys: ${{ github.job }}-vcpkg-tools-
|
|
|
|
- name: Restore vcpkg binary cache
|
|
uses: actions/cache/restore@v4
|
|
id: vcpkg-binary-cache
|
|
with:
|
|
path: ~/AppData/Local/vcpkg/archives
|
|
key: ${{ github.job }}-vcpkg-binary-${{ hashFiles('cmake_version', 'msbuild_version', 'toolset_version', 'vcpkg.json') }}
|
|
|
|
- name: Generate build system
|
|
run: |
|
|
py -3 .github/ci-windows.py ${{ matrix.job-type }} generate
|
|
|
|
- name: Save vcpkg binary cache
|
|
uses: actions/cache/save@v4
|
|
if: github.event_name != 'pull_request' && github.ref_name == github.event.repository.default_branch && steps.vcpkg-binary-cache.outputs.cache-hit != 'true' && matrix.job-type == 'standard'
|
|
with:
|
|
path: ~/AppData/Local/vcpkg/archives
|
|
key: ${{ github.job }}-vcpkg-binary-${{ hashFiles('cmake_version', 'msbuild_version', 'toolset_version', 'vcpkg.json') }}
|
|
|
|
- name: Save vcpkg tools cache
|
|
uses: actions/cache/save@v5
|
|
if: github.event_name != 'pull_request' && github.ref_name == github.event.repository.default_branch && steps.vcpkg-tools-cache.outputs.cache-hit != 'true'
|
|
with:
|
|
path: C:/vcpkg/downloads/tools
|
|
key: ${{ github.job }}-vcpkg-tools-${{ github.run_id }}
|
|
|
|
- name: Build
|
|
run: |
|
|
py -3 .github/ci-windows.py ${{ matrix.job-type }} build
|
|
|
|
- name: Check executable manifests
|
|
run: |
|
|
py -3 .github/ci-windows.py ${{ matrix.job-type }} check_manifests
|
|
|
|
- name: Prepare tests
|
|
run: |
|
|
py -3 .github/ci-windows.py ${{ matrix.job-type }} prepare_tests
|
|
|
|
- name: Run tests
|
|
env:
|
|
TEST_RUNNER_EXTRA: "--timeout-factor=${{ env.TEST_RUNNER_TIMEOUT_FACTOR }} ${{ case(github.event_name == 'pull_request', '', '--extended') }}"
|
|
run: |
|
|
py -3 .github/ci-windows.py ${{ matrix.job-type }} run_tests
|
|
|
|
record-frozen-commit:
|
|
# Record frozen commit, so that the native tests on cross-builds can run on
|
|
# the exact same commit id of the build.
|
|
name: '[meta] record frozen commit'
|
|
runs-on: ubuntu-slim
|
|
outputs:
|
|
commit: ${{ steps.record-commit.outputs.commit }}
|
|
steps:
|
|
- *ANNOTATION_PR_NUMBER
|
|
- *CHECKOUT
|
|
- name: Record commit
|
|
id: record-commit
|
|
run: echo "commit=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
|
|
|
|
windows-cross:
|
|
name: 'Windows-cross to x86_64, ${{ matrix.crt }}'
|
|
needs: [runners, record-frozen-commit]
|
|
runs-on: ${{ needs.runners.outputs.provider == 'cirrus' && 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-sm' || 'ubuntu-24.04' }}
|
|
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
crt: [msvcrt, ucrt]
|
|
include:
|
|
- crt: msvcrt
|
|
file-env: './ci/test/00_setup_env_win64_msvcrt.sh'
|
|
artifact-name: 'x86_64-w64-mingw32-executables'
|
|
- crt: ucrt
|
|
file-env: './ci/test/00_setup_env_win64.sh'
|
|
artifact-name: 'x86_64-w64-mingw32ucrt-executables'
|
|
|
|
env:
|
|
FILE_ENV: ${{ matrix.file-env }}
|
|
DANGER_CI_ON_HOST_FOLDERS: 1
|
|
|
|
steps:
|
|
- *ANNOTATION_PR_NUMBER
|
|
|
|
- name: Checkout
|
|
uses: actions/checkout@v6
|
|
with:
|
|
ref: ${{ needs.record-frozen-commit.outputs.commit }}
|
|
|
|
- name: Configure environment
|
|
uses: ./.github/actions/configure-environment
|
|
|
|
- name: Restore caches
|
|
id: restore-cache
|
|
uses: ./.github/actions/restore-caches
|
|
|
|
- name: Configure Docker
|
|
uses: ./.github/actions/configure-docker
|
|
with:
|
|
cache-provider: ${{ needs.runners.outputs.provider }}
|
|
|
|
- name: CI script
|
|
run: ./ci/test_run_all.sh
|
|
|
|
- name: Save caches
|
|
uses: ./.github/actions/save-caches
|
|
|
|
- name: Upload built executables
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: ${{ matrix.artifact-name }}-${{ github.run_id }}
|
|
path: |
|
|
${{ env.BASE_BUILD_DIR }}/bin/*.dll
|
|
${{ env.BASE_BUILD_DIR }}/bin/*.exe
|
|
${{ env.BASE_BUILD_DIR }}/src/secp256k1/bin/*.exe
|
|
${{ env.BASE_BUILD_DIR }}/src/univalue/*.exe
|
|
${{ env.BASE_BUILD_DIR }}/test/config.ini
|
|
|
|
windows-native-test:
|
|
name: 'Windows, ${{ matrix.crt }}, test cross-built'
|
|
runs-on: windows-2022
|
|
needs: [windows-cross, record-frozen-commit]
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
crt: [msvcrt, ucrt]
|
|
include:
|
|
- crt: msvcrt
|
|
artifact-name: 'x86_64-w64-mingw32-executables'
|
|
- crt: ucrt
|
|
artifact-name: 'x86_64-w64-mingw32ucrt-executables'
|
|
|
|
env:
|
|
PYTHONUTF8: 1
|
|
TEST_RUNNER_TIMEOUT_FACTOR: 40
|
|
|
|
steps:
|
|
- *ANNOTATION_PR_NUMBER
|
|
|
|
- name: Checkout
|
|
uses: actions/checkout@v6
|
|
with:
|
|
ref: ${{ needs.record-frozen-commit.outputs.commit }}
|
|
|
|
- name: Download built executables
|
|
uses: actions/download-artifact@v7
|
|
with:
|
|
name: ${{ matrix.artifact-name }}-${{ github.run_id }}
|
|
|
|
- name: Run bitcoind.exe
|
|
run: py -3 .github/ci-windows-cross.py print_version
|
|
|
|
- *SET_UP_VS
|
|
|
|
- name: Check executable manifests
|
|
run: py -3 .github/ci-windows-cross.py check_manifests
|
|
|
|
- name: Run unit tests
|
|
run: py -3 .github/ci-windows-cross.py run_unit_tests
|
|
|
|
- name: Prepare Windows test environment
|
|
run: |
|
|
py -3 .github/ci-windows-cross.py prepare_tests
|
|
|
|
- name: Run functional tests
|
|
env:
|
|
TEST_RUNNER_EXTRA: "--timeout-factor=${{ env.TEST_RUNNER_TIMEOUT_FACTOR }} ${{ case(github.event_name == 'pull_request', '', '--extended') }}"
|
|
run: |
|
|
py -3 .github/ci-windows-cross.py run_functional_tests
|
|
|
|
ci-matrix:
|
|
name: ${{ matrix.name }}
|
|
needs: runners
|
|
runs-on: ${{ needs.runners.outputs.provider == 'cirrus' && matrix.cirrus-runner || matrix.fallback-runner }}
|
|
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}
|
|
timeout-minutes: ${{ matrix.timeout-minutes }}
|
|
|
|
env:
|
|
DANGER_CI_ON_HOST_FOLDERS: 1
|
|
FILE_ENV: ${{ matrix.file-env }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- name: 'iwyu'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_iwyu.sh'
|
|
|
|
- name: '32 bit ARM'
|
|
cirrus-runner: 'ubuntu-24.04-arm' # Cirrus' Arm runners are Apple (with virtual Linux aarch64), which doesn't support 32-bit mode
|
|
fallback-runner: 'ubuntu-24.04-arm'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_arm.sh'
|
|
provider: 'gha'
|
|
|
|
- name: 'ASan + LSan + UBSan + integer'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md' # has to match container in ci/test/00_setup_env_native_asan.sh for tracing tools
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_asan.sh'
|
|
|
|
- name: 'macOS-cross to arm64'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-sm'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_mac_cross.sh'
|
|
|
|
- name: 'macOS-cross to x86_64'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-sm'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_mac_cross_intel.sh'
|
|
|
|
- name: 'No wallet'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-sm'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_nowallet.sh'
|
|
|
|
- name: 'i686, no IPC'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_i686_no_ipc.sh'
|
|
|
|
- name: 'fuzzer,address,undefined,integer'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-lg'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 240
|
|
file-env: './ci/test/00_setup_env_native_fuzz.sh'
|
|
|
|
- name: 'previous releases'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_previous_releases.sh'
|
|
|
|
- name: 'Alpine (musl)'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_alpine_musl.sh'
|
|
|
|
- name: 'tidy'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_tidy.sh'
|
|
|
|
- name: 'TSan'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_tsan.sh'
|
|
|
|
- name: 'MSan, fuzz'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 150
|
|
file-env: './ci/test/00_setup_env_native_fuzz_with_msan.sh'
|
|
|
|
- name: 'MSan'
|
|
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-lg'
|
|
fallback-runner: 'ubuntu-24.04'
|
|
timeout-minutes: 120
|
|
file-env: './ci/test/00_setup_env_native_msan.sh'
|
|
|
|
steps:
|
|
- *ANNOTATION_PR_NUMBER
|
|
|
|
- *CHECKOUT
|
|
|
|
- name: Configure environment
|
|
uses: ./.github/actions/configure-environment
|
|
|
|
- name: Restore caches
|
|
id: restore-cache
|
|
uses: ./.github/actions/restore-caches
|
|
|
|
- name: Configure Docker
|
|
uses: ./.github/actions/configure-docker
|
|
with:
|
|
cache-provider: ${{ matrix.provider || needs.runners.outputs.provider }}
|
|
|
|
- name: Clear unnecessary files
|
|
if: ${{ needs.runners.outputs.provider == 'gha' && true || false }} # Only needed on GHA runners
|
|
uses: ./.github/actions/clear-files
|
|
|
|
- name: Enable bpfcc script
|
|
if: ${{ env.CONTAINER_NAME == 'ci_native_asan' }}
|
|
# In the image build step, no external environment variables are available,
|
|
# so any settings will need to be written to the settings env file:
|
|
run: sed -i "s|\${INSTALL_BCC_TRACING_TOOLS}|true|g" ./ci/test/00_setup_env_native_asan.sh
|
|
|
|
- name: Set mmap_rnd_bits
|
|
if: ${{ env.CONTAINER_NAME == 'ci_native_tsan' || env.CONTAINER_NAME == 'ci_native_msan' || env.CONTAINER_NAME == 'ci_native_fuzz_msan' }}
|
|
# Prevents crashes due to high ASLR entropy
|
|
run: sudo sysctl -w vm.mmap_rnd_bits=28
|
|
|
|
- name: CI script
|
|
run: ./ci/test_run_all.sh
|
|
|
|
- name: Save caches
|
|
uses: ./.github/actions/save-caches
|
|
|
|
lint:
|
|
name: 'lint'
|
|
needs: runners
|
|
runs-on: ${{ needs.runners.outputs.provider == 'cirrus' && 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-xs' || 'ubuntu-24.04' }}
|
|
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}
|
|
timeout-minutes: 20
|
|
env:
|
|
CONTAINER_NAME: "bitcoin-linter"
|
|
steps:
|
|
- *ANNOTATION_PR_NUMBER
|
|
|
|
- name: Checkout
|
|
uses: actions/checkout@v6
|
|
with:
|
|
ref: *CHECKOUT_REF_TMPL
|
|
fetch-depth: 0
|
|
|
|
- name: Configure Docker
|
|
uses: ./.github/actions/configure-docker
|
|
with:
|
|
cache-provider: ${{ needs.runners.outputs.provider }}
|
|
|
|
- name: CI script
|
|
run: |
|
|
git worktree add ../lint-worktree HEAD
|
|
../lint-worktree/ci/lint.py
|