/ .github / ci-test-each-commit-exec.py
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()