CI: run 10% less tests in CI #2412
Workflow file for this run
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: Constantine CI | |
on: [push, pull_request] | |
# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#permissions | |
permissions: | |
actions: write | |
checks: write | |
contents: read # list commits, change to write to create a release | |
jobs: | |
test: | |
strategy: | |
fail-fast: false | |
max-parallel: 20 | |
matrix: | |
# version-2-0 is crashing due to https://github.com/mratsim/constantine/issues/471 | |
# version-1-6 and version-2-0 have issues with templates in typedef operating on a generic for Fp12 tower in https://github.com/mratsim/constantine/pull/485 | |
# Hence we only test and officially sypport 2.2.0, though 99% of Constantine should work on older compilers | |
# For ARM support on Linux we need to set a specific host | |
# either ubuntu-22.04-arm | |
# or ubuntu-24.04-arm | |
# We might as well test on 22.04 for ARM | |
nim_version: [version-2-2] | |
rust_toolchain: [stable] # [beta, nightly] | |
go_toolchain: [stable] | |
target: | |
# We only need to test 32-bit for targets like RISC-V that don't have ASM. | |
- os: linux | |
cpu: i386 | |
ctt_backend: NO_ASM | |
host: ubuntu-latest | |
- os: linux | |
cpu: amd64 | |
ctt_backend: NO_ASM | |
host: ubuntu-latest | |
- os: linux | |
cpu: amd64 | |
ctt_backend: ASM | |
host: ubuntu-latest | |
# ASM code for ARM Linux is not available yet | |
- os: linux | |
cpu: arm64 | |
ctt_backend: NO_ASM | |
host: ubuntu-22.04-arm | |
- os: windows | |
cpu: amd64 | |
ctt_backend: NO_ASM | |
host: windows-latest | |
- os: windows | |
cpu: amd64 | |
ctt_backend: ASM | |
host: windows-latest | |
- os: macos | |
cpu: arm64 | |
ctt_backend: NO_ASM | |
host: macos-latest | |
- os: macos | |
cpu: arm64 | |
ctt_backend: ASM | |
host: macos-latest | |
include: | |
- target: | |
os: linux | |
nim_channel: nightly | |
- target: | |
os: linux | |
nim_channel: nightly | |
- target: | |
os: macos | |
# MacOS Github agents are now using ARM and there are no ARM nightlies: | |
# https://github.com/mratsim/constantine/issues/372 | |
# So we build from source | |
nim_channel: source | |
- target: | |
os: windows | |
nim_channel: nightly | |
name: '${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ matrix.target.ctt_backend }} (${{ matrix.nim_version }})' | |
runs-on: ${{ matrix.target.host }} | |
steps: | |
- name: Get branch name | |
shell: bash | |
run: | | |
if [[ '${{ github.event_name }}' == 'pull_request' ]]; then | |
echo "##[set-output name=branch_name;]$(echo ${GITHUB_HEAD_REF})" | |
echo "Branch found (PR): ${GITHUB_HEAD_REF}" | |
else | |
echo "##[set-output name=branch_name;]$(echo ${GITHUB_REF#refs/heads/})" | |
echo "Branch found (not PR): ${GITHUB_REF#refs/heads/}" | |
fi | |
id: get_branch | |
- name: Cancel Previous Runs (except master) | |
if: > | |
steps.get_branch.outputs.branch_name != 'master' | |
uses: styfle/[email protected] | |
with: | |
access_token: ${{ github.token }} | |
- name: Checkout constantine | |
uses: actions/checkout@v4 | |
with: | |
path: constantine | |
- name: Restore MinGW-W64 (Windows) from cache | |
if: runner.os == 'Windows' | |
id: windows-mingw-cache | |
uses: actions/cache@v4 | |
with: | |
path: external/mingw-${{ matrix.target.cpu }} | |
key: 'mingw-${{ matrix.target.cpu }}' | |
- name: Restore Nim DLLs dependencies (Windows) from cache | |
if: runner.os == 'Windows' | |
id: windows-dlls-cache | |
uses: actions/cache@v4 | |
with: | |
path: external/dlls-${{ matrix.target.cpu }} | |
key: 'dlls-${{ matrix.target.cpu }}' | |
- name: Install MinGW64 dependency (Windows) | |
if: > | |
steps.windows-mingw-cache.outputs.cache-hit != 'true' && | |
runner.os == 'Windows' | |
shell: bash | |
run: | | |
mkdir -p external | |
if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then | |
MINGW_URL="https://github.com/brechtsanders/winlibs_mingw/releases/download/11.1.0-12.0.0-9.0.0-r2/winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-9.0.0-r2.7z" | |
ARCH=64 | |
else | |
MINGW_URL="https://github.com/brechtsanders/winlibs_mingw/releases/download/11.1.0-12.0.0-9.0.0-r2/winlibs-i686-posix-dwarf-gcc-11.1.0-mingw-w64-9.0.0-r2.7z" | |
ARCH=32 | |
fi | |
curl -L "$MINGW_URL" -o "external/mingw-${{ matrix.target.cpu }}.7z" | |
7z x -y "external/mingw-${{ matrix.target.cpu }}.7z" -oexternal/ | |
mv external/mingw$ARCH external/mingw-${{ matrix.target.cpu }} | |
- name: Install DLLs dependencies (Windows) | |
if: > | |
steps.windows-dlls-cache.outputs.cache-hit != 'true' && | |
runner.os == 'Windows' | |
shell: bash | |
run: | | |
mkdir -p external | |
curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip | |
7z x -y external/windeps.zip -oexternal/dlls-${{ matrix.target.cpu }} | |
- name: Path to cached dependencies (Windows) | |
if: > | |
runner.os == 'Windows' | |
shell: bash | |
run: | | |
echo '${{ github.workspace }}'"/external/mingw-${{ matrix.target.cpu }}/bin" >> $GITHUB_PATH | |
echo '${{ github.workspace }}'"/external/dlls-${{ matrix.target.cpu }}" >> $GITHUB_PATH | |
- name: Get latest Nim commit hash & install dir | |
id: versions | |
shell: bash | |
run: | | |
getHash() { | |
git ls-remote "https://github.com/$1" "${2:-HEAD}" | cut -f 1 | |
} | |
nimHash=$(getHash nim-lang/Nim '${{ matrix.branch }}') | |
installdir="nim-${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ matrix.nim_version }}-$nimHash" | |
echo "##[set-output name=installdir;]$(echo $installdir)" | |
echo "Nim installation directory: $installdir" | |
# Nightlies are already on Github | |
- name: Restore Nim from cache (except nightlies) | |
if: matrix.nim_channel != 'nightly' | |
id: nim-compiler-cache | |
uses: actions/cache@v4 | |
with: | |
path: '${{ github.workspace }}/${{ steps.versions.outputs.installdir }}' | |
key: '${{ steps.versions.outputs.installdir }}' | |
- name: Setup Nim | |
if: steps.nim-compiler-cache.outputs.cache-hit != 'true' | |
shell: bash | |
run: | | |
bash constantine/.github/workflows/install_nim.sh \ | |
--nim-channel ${{ matrix.nim_channel }} \ | |
--nim-version ${{ matrix.nim_version }} \ | |
--os ${{ matrix.target.os }} \ | |
--arch ${{ matrix.target.cpu }} \ | |
--install-dir ${{ steps.versions.outputs.installdir }} | |
- name: Path to Nim | |
shell: bash | |
run: | | |
echo '${{ github.workspace }}'/"${{ steps.versions.outputs.installdir }}"/bin >> $GITHUB_PATH | |
echo '${{ github.workspace }}'"/.nimble/bin" >> $GITHUB_PATH | |
- name: Install test dependencies (Linux amd64) | |
if: runner.os == 'Linux' && matrix.target.cpu != 'i386' | |
run: | | |
sudo DEBIAN_FRONTEND='noninteractive' apt-get install \ | |
--no-install-recommends -yq \ | |
libgmp-dev \ | |
llvm | |
- name: Install test dependencies (Linux i386) | |
if: runner.os == 'Linux' && matrix.target.cpu == 'i386' | |
# We don't install LLVM as the Rust libraries that call Constantine are 64-bit only. | |
run: | | |
sudo dpkg --add-architecture i386 | |
sudo apt-get update -qq | |
# Try to fix "E: Unable to correct problems, you have held broken packages." | |
sudo apt-get clean | |
sudo DEBIAN_FRONTEND='noninteractive' apt-get install \ | |
--no-install-recommends -yq \ | |
gcc-multilib g++-multilib \ | |
libssl-dev:i386 libgmp-dev:i386 | |
mkdir -p external/bin | |
cat << EOF > external/bin/gcc | |
#!/bin/bash | |
exec $(which gcc) -m32 "\$@" | |
EOF | |
cat << EOF > external/bin/g++ | |
#!/bin/bash | |
exec $(which g++) -m32 "\$@" | |
EOF | |
chmod 755 external/bin/{gcc,g++} | |
echo '${{ github.workspace }}/external/bin' >> $GITHUB_PATH | |
- name: Install test dependencies (macOS) | |
if: runner.os == 'macOS' | |
run: | | |
brew install gmp | |
- name: Setup MSYS2 (Windows) | |
if: runner.os == 'Windows' | |
uses: msys2/setup-msys2@v2 | |
with: | |
path-type: inherit | |
update: false | |
install: base-devel git mingw-w64-x86_64-toolchain | |
- name: Install Go [${{ matrix.go_toolchain }}] | |
uses: actions/setup-go@v4 | |
with: | |
go-version: ${{ matrix.go_toolchain }} | |
- name: Install Rust [${{ matrix.rust_toolchain }}] | |
shell: bash | |
run: rustup default ${{ matrix.rust_toolchain }} | |
- name: Print Nim, Go Rust, LLVM versions and CPU specs. | |
shell: bash | |
# gcc is an alias to Apple Clang on MacOS | |
run: | | |
nim -v | |
nimble -v | |
gcc -v | |
clang -v | |
go version | |
rustup --version | |
if [[ '${{ matrix.target.cpu }}' != 'i386' && '${{ runner.os }}' == 'Linux' ]]; then | |
llvm-config --version | |
fi | |
if [[ '${{ runner.os }}' == 'Linux' ]]; then | |
cat /proc/cpuinfo | |
fi | |
if [[ '${{ runner.os }}' == 'macOS' ]]; then | |
sysctl -a | grep machdep.cpu | |
sysctl -a | grep hw | grep cpu | |
sysctl -a | grep hw.optional | |
fi | |
- name: Install test dependencies (Windows) | |
if: runner.os == 'Windows' | |
shell: msys2 {0} | |
run: | | |
pacman -S --needed --noconfirm mingw-w64-x86_64-gmp mingw-w64-x86_64-llvm | |
nimble refresh --verbose -y | |
nimble install --verbose -y gmp@#head jsony asynctools [email protected] cliche | |
cd constantine | |
go mod download -modfile=go_test.mod | |
- name: Install test dependencies | |
if: runner.os != 'Windows' | |
shell: bash | |
run: | | |
nimble refresh --verbose -y | |
nimble install --verbose -y gmp@#head jsony asynctools [email protected] cliche | |
cd constantine | |
go mod download -modfile=go_test.mod | |
- name: Run Constantine as C library tests (MacOS with Assembly) | |
# We manually do the tests due to Homebrew lib/headers not being in standard PATH | |
if: runner.os == 'macOS' && matrix.target.ctt_backend == 'ASM' | |
shell: bash | |
run: | | |
cd constantine | |
nimble make_lib --verbose | |
nimble make_headers --verbose | |
clang -Iinclude -I$(brew --prefix)/include \ | |
-Llib -L$(brew --prefix)/lib \ | |
-o build/test_lib/t_libctt_bls12_381_staticlink.exe \ | |
examples-c/t_libctt_bls12_381.c \ | |
lib/libconstantine.a \ | |
-lgmp | |
clang -Iinclude -I$(brew --prefix)/include \ | |
-Llib -L$(brew --prefix)/lib \ | |
-o build/test_lib/t_libctt_bls12_381_dynlink.exe \ | |
examples-c/t_libctt_bls12_381.c \ | |
-lconstantine \ | |
-lgmp | |
clang -Iinclude -I$(brew --prefix)/include \ | |
-Llib -L$(brew --prefix)/lib \ | |
-o build/test_lib/t_libctt_banderwagon_staticlink.exe \ | |
examples-c/t_libctt_banderwagon.c \ | |
lib/libconstantine.a \ | |
-lgmp | |
clang -Iinclude -I$(brew --prefix)/include \ | |
-Llib -L$(brew --prefix)/lib \ | |
-o build/test_lib/t_libctt_banderwagon_dynlink.exe \ | |
examples-c/t_libctt_banderwagon.c \ | |
-lconstantine \ | |
-lgmp | |
clang -Iinclude -I$(brew --prefix)/include \ | |
-Llib -L$(brew --prefix)/lib \ | |
-o build/test_lib/ethereum_bls_signatures_staticlink.exe \ | |
examples-c/ethereum_bls_signatures.c \ | |
lib/libconstantine.a | |
clang -Iinclude -I$(brew --prefix)/include \ | |
-Llib -L$(brew --prefix)/lib \ | |
-o build/test_lib/ethereum_bls_signatures_dynlink.exe \ | |
examples-c/ethereum_bls_signatures.c \ | |
-lconstantine | |
- name: Run Constantine as C library tests (Linux with Assembly) | |
if: runner.os == 'Linux' && matrix.target.ctt_backend == 'ASM' | |
shell: bash | |
run: | | |
cd constantine | |
nimble make_lib --verbose | |
nimble make_headers --verbose | |
nimble test_lib --verbose | |
- name: Run Constantine as C library tests (Linux no Assembly) | |
if: runner.os == 'Linux' && matrix.target.ctt_backend == 'NO_ASM' | |
shell: bash | |
run: | | |
cd constantine | |
CTT_ASM=0 nimble make_lib --verbose | |
nimble make_headers --verbose | |
nimble test_lib --verbose | |
- name: Run Constantine as C library tests (Windows with Assembly) | |
# So "test_lib" uses C and can find GMP | |
# but nim-gmp cannot find GMP on Windows CI | |
if: runner.os == 'Windows' && matrix.target.ctt_backend == 'ASM' | |
shell: msys2 {0} | |
run: | | |
cd constantine | |
nimble make_lib --verbose | |
nimble make_headers --verbose | |
nimble test_lib --verbose | |
- name: Run Constantine as Go library tests | |
# This reuses the static library built with `nimble make_lib` | |
if: matrix.target.cpu != 'i386' | |
shell: bash | |
run: | | |
cd constantine/constantine-go | |
go test -modfile=../go_test.mod | |
- name: Run Constantine as Rust library tests (with Assembly) | |
if: matrix.target.ctt_backend == 'ASM' && matrix.target.cpu != 'i386' | |
shell: bash | |
# We need to deactivate the assembly (used by default for benches) | |
run: | | |
cd constantine | |
cargo test -- --nocapture | |
- name: Run Constantine as Rust library tests (NO Assembly) | |
if: matrix.target.ctt_backend == 'NO_ASM' && matrix.target.cpu != 'i386' | |
shell: bash | |
# We need to deactivate the assembly (used by default for benches) | |
run: | | |
cd constantine | |
CTT_ASM=0 cargo test -- --nocapture | |
- name: Compile Constantine Zkalc benchmark (no assembly) | |
# Skip 32-bit as that would need clang-multilib or -m32 | |
# Skip Windows as clang throws fatal error LNK1107 | |
if: matrix.target.ctt_backend == 'NO_ASM' && matrix.target.cpu != 'i386' && runner.os != 'Windows' | |
shell: bash | |
run: | | |
cd constantine | |
CTT_ASM=0 nimble make_zkalc | |
- name: Compile Constantine Zkalc benchmark (with assembly) | |
# Skip 32-bit as that would need clang-multilib or -m32 | |
# Skip Windows as clang throws fatal error LNK1107 | |
if: matrix.target.ctt_backend == 'ASM' && matrix.target.cpu != 'i386' && runner.os != 'Windows' | |
shell: bash | |
run: | | |
cd constantine | |
nimble make_zkalc | |
- name: Run Constantine in-depth tests (Linux - with GMP, with Assembly) | |
if: runner.os == 'Linux' && matrix.target.ctt_backend == 'ASM' | |
shell: bash | |
run: | | |
cd constantine | |
nimble test_parallel --verbose | |
- name: Run Constantine in-depth tests (Unix - with GMP, no Assembly) | |
if: runner.os == 'Linux' && matrix.target.ctt_backend == 'NO_ASM' | |
shell: bash | |
run: | | |
cd constantine | |
CTT_ASM=0 nimble test_parallel --verbose | |
# On Windows | |
# So "test_bindings" uses C and can find GMP | |
# but nim-gmp cannot find GMP on Windows CI | |
# Also need to workaround asynctools not being able to create pipes https://github.com/nim-lang/Nim/issues/23118 | |
# And LTO impossible constraint in the deneb_kzg test (but not MSM for some reason) | |
# | |
# On mac | |
# Homebrew install is not in default PATH | |
# this can be workaround with LD_LIBRARY_PATH for libraries | |
# but headers would need a | |
# --passC:-I$(brew --prefix)/include (-I/opt/homebrew/include on latest MacOS versions) | |
- name: Run Constantine in-depth tests (MacOS/Windows - no GMP, with Assembly)= | |
if: runner.os != 'Linux' && matrix.target.ctt_backend == 'ASM' | |
shell: msys2 {0} | |
run: | | |
cd constantine | |
if [[ '${{ matrix.nim_version }}' != 'version-1-6' ]]; then | |
CTT_LTO=0 nimble test_no_gmp --verbose | |
else | |
nimble test_parallel_no_gmp --verbose | |
fi | |
- name: Run Constantine in-depth tests (MacOS/Windows - no GMP, no Assembly) | |
if: runner.os != 'Linux' && matrix.target.ctt_backend == 'NO_ASM' | |
shell: msys2 {0} | |
run: | | |
cd constantine | |
if [[ '${{ matrix.nim_version }}' != 'version-1-6' ]]; then | |
CTT_ASM=0 CTT_LTO=0 nimble test_no_gmp --verbose | |
else | |
CTT_ASM=0 nimble test_parallel_no_gmp --verbose | |
fi |