Merge branch 'master' into release-0.1.13 #96
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | ||
on: | ||
pull_request: | ||
push: | ||
branches: | ||
- '**' | ||
tags-ignore: | ||
- '**' | ||
concurrency: | ||
group: ${{ github.event_name != 'pull_request' && github.run_id || github.ref }} | ||
cancel-in-progress: true | ||
env: | ||
### compiler options | ||
HOST: | ||
WRAPPER_CMD: | ||
# Specific warnings can be disabled with -Wno-error=foo. | ||
# -pedantic-errors is not equivalent to -Werror=pedantic and thus not implied by -Werror according to the GCC manual. | ||
WERROR_CFLAGS: '-Werror -pedantic-errors' | ||
MAKEFLAGS: '-j4' | ||
BUILD: 'check' | ||
### secp256k1 config | ||
ECMULTWINDOW: 15 | ||
ECMULTGENKB: 22 | ||
ASM: 'no' | ||
WIDEMUL: 'auto' | ||
WITH_VALGRIND: 'yes' | ||
EXTRAFLAGS: | ||
### secp256k1 modules | ||
EXPERIMENTAL: 'no' | ||
ECDH: 'no' | ||
RECOVERY: 'no' | ||
SCHNORRSIG: 'no' | ||
ELLSWIFT: 'no' | ||
### test options | ||
SECP256K1_TEST_ITERS: | ||
BENCH: 'yes' | ||
SECP256K1_BENCH_ITERS: 2 | ||
CTIMETESTS: 'yes' | ||
# Compile and run the examples. | ||
EXAMPLES: 'yes' | ||
jobs: | ||
test-each-commit: | ||
name: 'test each commit' | ||
runs-on: 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/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes. Assuming a worst case time of 1 hour per commit, this leads to a --max-count=6 below. | ||
env: | ||
MAX_COUNT: 6 | ||
steps: | ||
- name: Set up Docker Buildx | ||
uses: docker/setup-buildx-action@v3 | ||
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~ | ||
# Figure out test base commit by listing ancestors of HEAD, excluding | ||
# ancestors of the most recent merge commit, limiting the list to the | ||
# newest MAX_COUNT ancestors, ordering it from oldest to newest, and | ||
# taking the first one. | ||
# | ||
# If the branch contains up to MAX_COUNT ancestor commits after the | ||
# most recent merge commit, all of those commits will be tested. If it | ||
# contains more, only the most recent MAX_COUNT commits will be | ||
# tested. | ||
# | ||
# 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$((${{ env.MAX_COUNT }} + 1)) --reverse HEAD $EXCLUDE_MERGE_BASE_ANCESTORS | head -1)" >> "$GITHUB_ENV" | ||
- run: | | ||
sudo apt-get update | ||
sudo apt-get install clang ccache build-essential libtool autotools-dev automake pkg-config bsdmainutils python3-zmq libevent-dev libboost-dev libsqlite3-dev libdb++-dev systemtap-sdt-dev libminiupnpc-dev libnatpmp-dev qtbase5-dev qttools5-dev qttools5-dev-tools qtwayland5 libqrencode-dev -y | ||
- name: Compile and run tests | ||
run: | | ||
# Run tests on commits after the last merge commit and before the PR head commit | ||
# Use clang++, because it is a bit faster and uses less memory than g++ | ||
git rebase --exec "echo Running test-one-commit on \$( git log -1 ) && ./autogen.sh && CC=clang CXX=clang++ ./configure && make clean && make -j $(nproc) check && ./test/functional/test_runner.py -j $(( $(nproc) * 2 ))" ${{ env.TEST_BASE }} | ||
macos-native-x86_64: | ||
name: 'macOS 13 native, x86_64, no depends, sqlite only, gui' | ||
# Use latest image, but hardcode version to avoid silent upgrades (and breaks). | ||
# See: https://github.com/actions/runner-images#available-images. | ||
runs-on: macos-13 | ||
- name: Build container | ||
uses: docker/build-push-action@v5 | ||
with: | ||
file: ./ci/linux-debian.Dockerfile | ||
tags: linux-debian-image | ||
cache-from: type=gha | ||
cache-to: type=gha,mode=min | ||
linux_debian: | ||
name: "x86_64: Linux (Debian stable)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
configuration: | ||
- env_vars: { WIDEMUL: 'int64', RECOVERY: 'yes' } | ||
- env_vars: { WIDEMUL: 'int64', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- env_vars: { WIDEMUL: 'int128' } | ||
- env_vars: { WIDEMUL: 'int128_struct', ELLSWIFT: 'yes' } | ||
- env_vars: { WIDEMUL: 'int128', RECOVERY: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- env_vars: { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes' } | ||
- env_vars: { WIDEMUL: 'int128', ASM: 'x86_64', ELLSWIFT: 'yes' } | ||
- env_vars: { RECOVERY: 'yes', SCHNORRSIG: 'yes' } | ||
- env_vars: { CTIMETESTS: 'no', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', CPPFLAGS: '-DVERIFY' } | ||
- env_vars: { BUILD: 'distcheck', WITH_VALGRIND: 'no', CTIMETESTS: 'no', BENCH: 'no' } | ||
- env_vars: { CPPFLAGS: '-DDETERMINISTIC' } | ||
- env_vars: { CFLAGS: '-O0', CTIMETESTS: 'no' } | ||
- env_vars: { CFLAGS: '-O1', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- env_vars: { ECMULTGENKB: 2, ECMULTWINDOW: 2 } | ||
- env_vars: { ECMULTGENKB: 86, ECMULTWINDOW: 4 } | ||
cc: | ||
- 'gcc' | ||
- 'clang' | ||
- 'gcc-snapshot' | ||
- 'clang-snapshot' | ||
env: | ||
DANGER_RUN_CI_ON_HOST: 1 | ||
FILE_ENV: './ci/test/00_setup_env_mac_native.sh' | ||
BASE_ROOT_DIR: ${{ github.workspace }} | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Clang version | ||
run: | | ||
sudo xcode-select --switch /Applications/Xcode_15.0.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 python@3 || brew link --overwrite python@3 | ||
brew install automake libtool pkg-config gnu-getopt ccache boost libevent miniupnpc libnatpmp zeromq qt@5 qrencode | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Restore Ccache cache | ||
id: ccache-cache | ||
uses: actions/cache/restore@v4 | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
s390x_debian: | ||
name: "s390x (big-endian): Linux (Debian stable, QEMU)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
env: | ||
WRAPPER_CMD: 'qemu-s390x' | ||
SECP256K1_TEST_ITERS: 16 | ||
HOST: 's390x-linux-gnu' | ||
WITH_VALGRIND: 'no' | ||
ECDH: 'yes' | ||
RECOVERY: 'yes' | ||
SCHNORRSIG: 'yes' | ||
ELLSWIFT: 'yes' | ||
CTIMETESTS: 'no' | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: CI script | ||
uses: ./.github/actions/run-in-docker-action | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
arm32_debian: | ||
name: "ARM32: Linux (Debian stable, QEMU)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
configuration: | ||
- env_vars: {} | ||
- env_vars: { EXPERIMENTAL: 'yes', ASM: 'arm32' } | ||
- name: Save Ccache cache | ||
uses: actions/cache/save@v4 | ||
if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true' | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
arm64_debian: | ||
name: "ARM64: Linux (Debian stable, QEMU)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
env: | ||
WRAPPER_CMD: 'qemu-aarch64' | ||
SECP256K1_TEST_ITERS: 16 | ||
HOST: 'aarch64-linux-gnu' | ||
WITH_VALGRIND: 'no' | ||
ECDH: 'yes' | ||
RECOVERY: 'yes' | ||
SCHNORRSIG: 'yes' | ||
ELLSWIFT: 'yes' | ||
CTIMETESTS: 'no' | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
configuration: | ||
- env_vars: { } # gcc | ||
- env_vars: # clang | ||
CC: 'clang --target=aarch64-linux-gnu' | ||
- env_vars: # clang-snapshot | ||
CC: 'clang-snapshot --target=aarch64-linux-gnu' | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: CI script | ||
env: ${{ matrix.configuration.env_vars }} | ||
uses: ./.github/actions/run-in-docker-action | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
ppc64le_debian: | ||
name: "ppc64le: Linux (Debian stable, QEMU)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
env: | ||
CCACHE_MAXSIZE: '200M' | ||
CI_CCACHE_VERSION: '4.7.5' | ||
CI_QT_CONF: '-release -silent -opensource -confirm-license -opengl desktop -static -static-runtime -mp -qt-zlib -qt-pcre -qt-libpng -nomake examples -nomake tests -nomake tools -no-angle -no-dbus -no-gif -no-gtk -no-ico -no-icu -no-libjpeg -no-libudev -no-sql-sqlite -no-sql-odbc -no-sqlite -no-vulkan -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip doc -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtlottie -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquick3d -skip qtquickcontrols -skip qtquickcontrols2 -skip qtquicktimeline -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtsvg -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns -no-openssl -no-feature-bearermanagement -no-feature-printdialog -no-feature-printer -no-feature-printpreviewdialog -no-feature-printpreviewwidget -no-feature-sql -no-feature-sqlmodel -no-feature-textbrowser -no-feature-textmarkdownwriter -no-feature-textodfwriter -no-feature-xml' | ||
CI_QT_DIR: 'qt-everywhere-src-5.15.11' | ||
CI_QT_URL: 'https://download.qt.io/official_releases/qt/5.15/5.15.11/single/qt-everywhere-opensource-src-5.15.11.zip' | ||
PYTHONUTF8: 1 | ||
TEST_RUNNER_TIMEOUT_FACTOR: 40 | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Configure Developer Command Prompt for Microsoft Visual C++ | ||
# Using microsoft/setup-msbuild is not enough. | ||
uses: ilammy/msvc-dev-cmd@v1 | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
valgrind_debian: | ||
name: "Valgrind (memcheck)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
configuration: | ||
- env_vars: { CC: 'clang', ASM: 'auto' } | ||
- env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'auto' } | ||
- env_vars: { CC: 'clang', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } | ||
- env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } | ||
- name: Get tool information | ||
run: | | ||
msbuild -version | Tee-Object -FilePath "msbuild_version" | ||
$env:VCToolsVersion | Tee-Object -FilePath "toolset_version" | ||
$env:CI_QT_URL | Out-File -FilePath "qt_url" | ||
$env:CI_QT_CONF | Out-File -FilePath "qt_conf" | ||
py -3 --version | ||
Write-Host "PowerShell version $($PSVersionTable.PSVersion.ToString())" | ||
- name: Restore static Qt cache | ||
id: static-qt-cache | ||
uses: actions/cache/restore@v4 | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
sanitizers_debian: | ||
name: "UBSan, ASan, LSan" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
configuration: | ||
- env_vars: { CC: 'clang', ASM: 'auto' } | ||
- env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'auto' } | ||
- env_vars: { CC: 'clang', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } | ||
- env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } | ||
env: | ||
ECDH: 'yes' | ||
RECOVERY: 'yes' | ||
SCHNORRSIG: 'yes' | ||
ELLSWIFT: 'yes' | ||
CTIMETESTS: 'no' | ||
CFLAGS: '-fsanitize=undefined,address -g' | ||
UBSAN_OPTIONS: 'print_stacktrace=1:halt_on_error=1' | ||
ASAN_OPTIONS: 'strict_string_checks=1:detect_stack_use_after_return=1:detect_leaks=1' | ||
LSAN_OPTIONS: 'use_unaligned=1' | ||
SECP256K1_TEST_ITERS: 32 | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Build static Qt. Create build directory | ||
if: steps.static-qt-cache.outputs.cache-hit != 'true' | ||
run: | | ||
Rename-Item -Path "C:\$env:CI_QT_DIR" -NewName "C:\qt-src" | ||
New-Item -ItemType Directory -Path "C:\qt-src\build" | ||
- name: Build static Qt. Configure | ||
if: steps.static-qt-cache.outputs.cache-hit != 'true' | ||
working-directory: C:\qt-src\build | ||
shell: cmd | ||
run: ..\configure %CI_QT_CONF% -prefix C:\Qt_static | ||
- name: Build static Qt. Build | ||
if: steps.static-qt-cache.outputs.cache-hit != 'true' | ||
working-directory: C:\qt-src\build | ||
shell: cmd | ||
run: jom | ||
- name: Build static Qt. Install | ||
if: steps.static-qt-cache.outputs.cache-hit != 'true' | ||
working-directory: C:\qt-src\build | ||
shell: cmd | ||
run: jom install | ||
- name: Save static Qt cache | ||
if: steps.static-qt-cache.outputs.cache-hit != 'true' | ||
uses: actions/cache/save@v4 | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
msan_debian: | ||
name: "MSan" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
configuration: | ||
- env_vars: | ||
CTIMETESTS: 'yes' | ||
CFLAGS: '-fsanitize=memory -fsanitize-recover=memory -g' | ||
- env_vars: | ||
ECMULTGENKB: 2 | ||
ECMULTWINDOW: 2 | ||
CTIMETESTS: 'yes' | ||
CFLAGS: '-fsanitize=memory -fsanitize-recover=memory -g -O3' | ||
- env_vars: | ||
# -fsanitize-memory-param-retval is clang's default, but our build system disables it | ||
# when ctime_tests when enabled. | ||
CFLAGS: '-fsanitize=memory -fsanitize-recover=memory -fsanitize-memory-param-retval -g' | ||
CTIMETESTS: 'no' | ||
env: | ||
ECDH: 'yes' | ||
RECOVERY: 'yes' | ||
SCHNORRSIG: 'yes' | ||
ELLSWIFT: 'yes' | ||
CC: 'clang' | ||
SECP256K1_TEST_ITERS: 32 | ||
ASM: 'no' | ||
WITH_VALGRIND: 'no' | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: CI script | ||
env: ${{ matrix.configuration.env_vars }} | ||
uses: ./.github/actions/run-in-docker-action | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
mingw_debian: | ||
name: ${{ matrix.configuration.job_name }} | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
- name: Restore Ccache cache | ||
id: ccache-cache | ||
uses: actions/cache/restore@v4 | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
x86_64-macos-native: | ||
name: "x86_64: macOS Monterey, Valgrind" | ||
# See: https://github.com/actions/runner-images#available-images. | ||
runs-on: macos-12 | ||
env: | ||
CC: 'clang' | ||
HOMEBREW_NO_AUTO_UPDATE: 1 | ||
HOMEBREW_NO_INSTALL_CLEANUP: 1 | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
env_vars: | ||
- { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- { WIDEMUL: 'int128_struct', ECMULTGENKB: 2, ECMULTWINDOW: 4 } | ||
- { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY', CTIMETESTS: 'no' } | ||
- BUILD: 'distcheck' | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Install Homebrew packages | ||
run: | | ||
Set-Location "$env:VCPKG_INSTALLATION_ROOT" | ||
Add-Content -Path "triplets\x64-windows-static.cmake" -Value "set(VCPKG_BUILD_TYPE release)" | ||
.\vcpkg.exe --vcpkg-root "$env:VCPKG_INSTALLATION_ROOT" integrate install | ||
git rev-parse HEAD | Tee-Object -FilePath "$env:GITHUB_WORKSPACE\vcpkg_commit" | ||
- name: vcpkg tools cache | ||
uses: actions/cache@v4 | ||
with: | ||
path: C:/vcpkg/downloads/tools | ||
key: ${{ github.job }}-vcpkg-tools | ||
- name: vcpkg binary cache | ||
uses: actions/cache@v4 | ||
with: | ||
path: ~/AppData/Local/vcpkg/archives | ||
key: ${{ github.job }}-vcpkg-binary-${{ hashFiles('vcpkg_commit', 'msbuild_version', 'toolset_version', 'build_msvc/vcpkg.json') }} | ||
- name: CI script | ||
env: ${{ matrix.env_vars }} | ||
run: ./ci/ci.sh | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
arm64-macos-native: | ||
name: "ARM64: macOS Sonoma" | ||
# See: https://github.com/actions/runner-images#available-images. | ||
runs-on: macos-14 | ||
env: | ||
CC: 'clang' | ||
HOMEBREW_NO_AUTO_UPDATE: 1 | ||
HOMEBREW_NO_INSTALL_CLEANUP: 1 | ||
WITH_VALGRIND: 'no' | ||
CTIMETESTS: 'no' | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
env_vars: | ||
- { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- { WIDEMUL: 'int128_struct', ECMULTGENPRECISION: 2, ECMULTWINDOW: 4 } | ||
- { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' } | ||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY' } | ||
- BUILD: 'distcheck' | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Install Homebrew packages | ||
run: | | ||
brew install automake libtool gcc | ||
ln -s $(brew --prefix gcc)/bin/gcc-?? /usr/local/bin/gcc | ||
- name: CI script | ||
env: ${{ matrix.env_vars }} | ||
run: ./ci/ci.sh | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
win64-native: | ||
name: ${{ matrix.configuration.job_name }} | ||
# See: https://github.com/actions/runner-images#available-images. | ||
runs-on: windows-2022 | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
configuration: | ||
- job_name: 'x64 (MSVC): Windows (VS 2022, shared)' | ||
cmake_options: '-A x64 -DBUILD_SHARED_LIBS=ON' | ||
- job_name: 'x64 (MSVC): Windows (VS 2022, static)' | ||
cmake_options: '-A x64 -DBUILD_SHARED_LIBS=OFF' | ||
- job_name: 'x64 (MSVC): Windows (VS 2022, int128_struct)' | ||
cmake_options: '-A x64 -DSECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY=int128_struct' | ||
- job_name: 'x64 (MSVC): Windows (VS 2022, int128_struct with __(u)mulh)' | ||
cmake_options: '-A x64 -DSECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY=int128_struct' | ||
cpp_flags: '/DSECP256K1_MSVC_MULH_TEST_OVERRIDE' | ||
- job_name: 'x86 (MSVC): Windows (VS 2022)' | ||
cmake_options: '-A Win32' | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Generate buildsystem | ||
run: cmake -E env CFLAGS="/WX ${{ matrix.configuration.cpp_flags }}" cmake -B build -DSECP256K1_ENABLE_MODULE_RECOVERY=ON -DSECP256K1_BUILD_EXAMPLES=ON ${{ matrix.configuration.cmake_options }} | ||
- name: Build | ||
run: cmake --build build --config RelWithDebInfo -- /p:UseMultiToolTask=true /maxCpuCount | ||
- name: Binaries info | ||
# Use the bash shell included with Git for Windows. | ||
shell: bash | ||
run: | | ||
cd build/src/RelWithDebInfo && file *tests.exe bench*.exe libsecp256k1-*.dll || true | ||
- name: Check | ||
run: | | ||
ctest -C RelWithDebInfo --test-dir build -j ([int]$env:NUMBER_OF_PROCESSORS + 1) | ||
build\src\RelWithDebInfo\bench_ecmult.exe | ||
build\src\RelWithDebInfo\bench_internal.exe | ||
build\src\RelWithDebInfo\bench.exe | ||
win64-native-headers: | ||
name: "x64 (MSVC): C++ (public headers)" | ||
# See: https://github.com/actions/runner-images#available-images. | ||
runs-on: windows-2022 | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Add cl.exe to PATH | ||
uses: ilammy/msvc-dev-cmd@v1 | ||
- name: C++ (public headers) | ||
run: | | ||
cl.exe -c -WX -TP include/*.h | ||
cxx_fpermissive_debian: | ||
name: "C++ -fpermissive (entire project)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
env: | ||
CC: 'g++' | ||
CFLAGS: '-fpermissive -g' | ||
CPPFLAGS: '-DSECP256K1_CPLUSPLUS_TEST_OVERRIDE' | ||
WERROR_CFLAGS: | ||
ECDH: 'yes' | ||
RECOVERY: 'yes' | ||
SCHNORRSIG: 'yes' | ||
ELLSWIFT: 'yes' | ||
- name: Save Ccache cache | ||
uses: actions/cache/save@v4 | ||
if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true' | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
- run: cat tests.log || true | ||
if: ${{ always() }} | ||
- run: cat noverify_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat exhaustive_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat ctime_tests.log || true | ||
if: ${{ always() }} | ||
- run: cat bench.log || true | ||
if: ${{ always() }} | ||
- run: cat config.log || true | ||
if: ${{ always() }} | ||
- run: cat test_env.log || true | ||
if: ${{ always() }} | ||
- name: CI env | ||
run: env | ||
if: ${{ always() }} | ||
cxx_headers_debian: | ||
name: "C++ (public headers)" | ||
runs-on: ubuntu-latest | ||
needs: docker_cache | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: CI script | ||
uses: ./.github/actions/run-in-docker-action | ||
with: | ||
dockerfile: ./ci/linux-debian.Dockerfile | ||
tag: linux-debian-image | ||
command: | | ||
g++ -Werror include/*.h | ||
clang -Werror -x c++-header include/*.h | ||
sage: | ||
name: "SageMath prover" | ||
runs-on: ubuntu-latest | ||
container: | ||
image: sagemath/sagemath:latest | ||
options: --user root | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: CI script | ||
run: | | ||
cd sage | ||
sage prove_group_implementations.sage | ||
release: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- run: ./autogen.sh && ./configure --enable-dev-mode && make distcheck | ||
- name: Check installation with Autotools | ||
env: | ||
CI_INSTALL: ${{ runner.temp }}/${{ github.run_id }}${{ github.action }}/install | ||
run: | | ||
./autogen.sh && ./configure --prefix=${{ env.CI_INSTALL }} && make clean && make install && ls -RlAh ${{ env.CI_INSTALL }} | ||
gcc -o ecdsa examples/ecdsa.c $(PKG_CONFIG_PATH=${{ env.CI_INSTALL }}/lib/pkgconfig pkg-config --cflags --libs libsecp256k1) -Wl,-rpath,"${{ env.CI_INSTALL }}/lib" && ./ecdsa | ||
- name: Run functional tests | ||
env: | ||
TEST_RUNNER_EXTRA: ${{ github.event_name != 'pull_request' && '--extended' || '' }} | ||
shell: cmd | ||
run: py -3 test\functional\test_runner.py --jobs %NUMBER_OF_PROCESSORS% --ci --quiet --tmpdirprefix=%RUNNER_TEMP% --combinedlogslen=99999999 --timeout-factor=%TEST_RUNNER_TIMEOUT_FACTOR% %TEST_RUNNER_EXTRA% | ||
- name: Clone fuzz corpus | ||
run: | | ||
git clone --depth=1 https://github.com/bitcoin-core/qa-assets "$env:RUNNER_TEMP\qa-assets" | ||
Set-Location "$env:RUNNER_TEMP\qa-assets" | ||
Write-Host "Using qa-assets repo from commit ..." | ||
git log -1 | ||
- name: Run fuzz binaries | ||
env: | ||
BITCOINFUZZ: "${{ github.workspace}}\\src\\fuzz.exe" | ||
shell: cmd | ||
run: py -3 test\fuzz\test_runner.py --par %NUMBER_OF_PROCESSORS% --loglevel DEBUG %RUNNER_TEMP%\qa-assets\fuzz_seed_corpus | ||
asan-lsan-ubsan-integer-no-depends-usdt: | ||
name: 'ASan + LSan + UBSan + integer, no depends, USDT' | ||
runs-on: ubuntu-24.04 # has to match container in ci/test/00_setup_env_native_asan.sh for tracing tools | ||
# No need to run on the read-only mirror, unless it is a PR. | ||
if: github.repository != 'bitcoin-core/gui' || github.event_name == 'pull_request' | ||
timeout-minutes: 120 | ||
env: | ||
FILE_ENV: "./ci/test/00_setup_env_native_asan.sh" | ||
DANGER_CI_ON_HOST_CACHE_FOLDERS: 1 | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
- name: Set Ccache directory | ||
run: echo "CCACHE_DIR=${RUNNER_TEMP}/ccache_dir" >> "$GITHUB_ENV" | ||
- name: Set base root directory | ||
run: echo "BASE_ROOT_DIR=${RUNNER_TEMP}" >> "$GITHUB_ENV" | ||
- name: Restore Ccache cache | ||
id: ccache-cache | ||
uses: actions/cache/restore@v4 | ||
with: | ||
path: ${{ env.CCACHE_DIR }} | ||
key: ${{ github.job }}-ccache-${{ github.run_id }} | ||
restore-keys: ${{ github.job }}-ccache- | ||
- name: Enable bpfcc script | ||
# 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: CI script | ||
run: ./ci/test_run_all.sh | ||
- name: Save Ccache cache | ||
uses: actions/cache/save@v4 | ||
if: github.event_name != 'pull_request' && 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 }}-ccache-${{ github.run_id }} |