ci-test-each-commit-exec.py
1 #!/usr/bin/env python3 2 # Copyright (c) The Bitcoin Core developers 3 # Distributed under the MIT software license, see the accompanying 4 # file COPYING or https://opensource.org/license/mit/. 5 6 import subprocess 7 import sys 8 import shlex 9 10 11 def run(cmd, **kwargs): 12 print("+ " + shlex.join(cmd), flush=True) 13 kwargs.setdefault("check", True) 14 try: 15 return subprocess.run(cmd, **kwargs) 16 except Exception as e: 17 sys.exit(str(e)) 18 19 20 def main(): 21 print("Running tests on commit ...") 22 run(["git", "log", "-1"]) 23 24 num_procs = int(run(["nproc"], stdout=subprocess.PIPE).stdout) 25 build_dir = "ci_build" 26 27 run([ 28 "cmake", 29 "-B", 30 build_dir, 31 "-Werror=dev", 32 # Use clang++, because it is a bit faster and uses less memory than g++ 33 "-DCMAKE_C_COMPILER=clang", 34 "-DCMAKE_CXX_COMPILER=clang++", 35 # Use mold, because it is faster than the default linker 36 "-DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=mold", 37 # Use Debug build type for more debug checks, but enable optimizations 38 "-DAPPEND_CXXFLAGS='-O3 -g2'", 39 "-DAPPEND_CFLAGS='-O3 -g2'", 40 "-DCMAKE_BUILD_TYPE=Debug", 41 "-DCMAKE_COMPILE_WARNING_AS_ERROR=ON", 42 "--preset=dev-mode", 43 # Tolerate unused member functions in intermediate commits in a pull request 44 "-DCMAKE_CXX_FLAGS=-Wno-error=unused-member-function", 45 ]) 46 47 if run(["cmake", "--build", build_dir, "-j", str(num_procs)], check=False).returncode != 0: 48 print("Build failure. Verbose build follows.") 49 run(["cmake", "--build", build_dir, "-j1", "--verbose"]) 50 51 run([ 52 "ctest", 53 "--output-on-failure", 54 "--stop-on-failure", 55 "--test-dir", 56 build_dir, 57 "-j", 58 str(num_procs), 59 ]) 60 run([ 61 sys.executable, 62 f"./{build_dir}/test/functional/test_runner.py", 63 "-j", 64 str(num_procs * 2), 65 "--failfast", 66 "--combinedlogslen=99999999", 67 ]) 68 69 70 if __name__ == "__main__": 71 main()