diff --git a/contrib/teamcity/build-configurations.json b/contrib/teamcity/build-configurations.json --- a/contrib/teamcity/build-configurations.json +++ b/contrib/teamcity/build-configurations.json @@ -1,71 +1,94 @@ { "build-asan": { - "script": "builds/build-asan.sh" + "script": "builds/build-asan.sh", + "timeout": 1800 }, "build-autotools": { - "script": "builds/build-autotools.sh" + "script": "builds/build-autotools.sh", + "timeout": 1200 }, "build-bench": { - "script": "builds/build-bench.sh" + "script": "builds/build-bench.sh", + "timeout": 1200 }, "build-clang-10": { - "script": "builds/build-clang-10.sh" + "script": "builds/build-clang-10.sh", + "timeout": 1200 }, "build-clang-tidy": { - "script": "builds/build-clang-tidy.sh" + "script": "builds/build-clang-tidy.sh", + "timeout": 600 }, "build-coverage": { - "script": "builds/build-coverage.sh" + "script": "builds/build-coverage.sh", + "timeout": 3600 }, "build-diff": { - "script": "builds/build-diff.sh" + "script": "builds/build-diff.sh", + "timeout": 1200 }, "build-ibd": { - "script": "builds/build-ibd.sh" + "script": "builds/build-ibd.sh", + "timeout": 14400 }, "build-ibd-no-assumevalid-checkpoint": { - "script": "builds/build-ibd-no-assumevalid-checkpoint.sh" + "script": "builds/build-ibd-no-assumevalid-checkpoint.sh", + "timeout": 21600 }, "build-linux64": { - "script": "builds/build-linux64.sh" + "script": "builds/build-linux64.sh", + "timeout": 1200 }, "build-linux-aarch64": { - "script": "builds/build-linux-aarch64.sh" + "script": "builds/build-linux-aarch64.sh", + "timeout": 1800 }, "build-linux-arm": { - "script": "builds/build-linux-arm.sh" + "script": "builds/build-linux-arm.sh", + "timeout": 1800 }, "build-make-generator": { - "script": "builds/build-make-generator.sh" + "script": "builds/build-make-generator.sh", + "timeout": 1200 }, "build-master": { - "script": "builds/build-master.sh" + "script": "builds/build-master.sh", + "timeout": 4800 }, "build-osx": { - "script": "builds/build-osx.sh" + "script": "builds/build-osx.sh", + "timeout": 600 }, "build-secp256k1": { - "script": "builds/build-secp256k1.sh" + "script": "builds/build-secp256k1.sh", + "timeout": 900 }, "build-tsan": { - "script": "builds/build-tsan.sh" + "script": "builds/build-tsan.sh", + "timeout": 1800 }, "build-ubsan": { - "script": "builds/build-ubsan.sh" + "script": "builds/build-ubsan.sh", + "timeout": 1800 }, "build-win64": { - "script": "builds/build-win64.sh" + "script": "builds/build-win64.sh", + "timeout": 1200 }, "build-without-cli": { - "script": "builds/build-without-cli.sh" + "script": "builds/build-without-cli.sh", + "timeout": 1200 }, "build-without-wallet": { - "script": "builds/build-without-wallet.sh" + "script": "builds/build-without-wallet.sh", + "timeout": 1200 }, "build-without-zmq": { - "script": "builds/build-without-zmq.sh" + "script": "builds/build-without-zmq.sh", + "timeout": 1800 }, "check-seeds": { - "script": "builds/check-seeds.sh" + "script": "builds/check-seeds.sh", + "timeout": 600 } } diff --git a/contrib/teamcity/build-configurations.py b/contrib/teamcity/build-configurations.py --- a/contrib/teamcity/build-configurations.py +++ b/contrib/teamcity/build-configurations.py @@ -7,9 +7,14 @@ import json import os from pathlib import Path, PurePath +import signal import subprocess import sys +# Default timeout value in seconds. Should be overridden by the +# configuration file. +DEFAULT_TIMEOUT = 1 * 60 * 60 + if sys.version_info < (3, 6): raise SystemError("This script requires python >= 3.6") @@ -107,9 +112,23 @@ check=True, cwd=build_directory, env={**os.environ, **environment_variables}, + timeout=build.get("timeout", DEFAULT_TIMEOUT), + ) + except subprocess.TimeoutExpired as e: + print( + "Build {} timed out after {:.1f}s".format( + args.build, round(e.timeout, 1) + ) ) + # Make sure to kill all the child processes, as subprocess only kills + # the one we started. It will also kill this python script ! + # The return code is 128 + 9 (SIGKILL) = 137. + os.killpg(os.getpgid(os.getpid()), signal.SIGKILL) except subprocess.CalledProcessError as e: - print("Build failed with exit code {}".format(e.returncode)) + print( + "Build {} failed with exit code {}".format( + args.build, + e.returncode)) sys.exit(e.returncode)