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,100 +1,104 @@ { - "build-asan": { - "script": "builds/build-asan.sh", - "timeout": 1800 - }, - "build-autotools": { - "script": "builds/build-autotools.sh", - "timeout": 1200 - }, - "build-bench": { - "script": "builds/build-bench.sh", - "timeout": 1200 - }, - "build-clang-10": { - "script": "builds/build-clang-10.sh", - "timeout": 1200 - }, - "build-clang-tidy": { - "script": "builds/build-clang-tidy.sh", - "timeout": 600 - }, - "build-coverage": { - "script": "builds/build-coverage.sh", - "timeout": 3600 - }, - "build-diff": { - "script": "builds/build-diff.sh", - "timeout": 1200 - }, - "build-ibd": { - "script": "builds/build-ibd.sh", - "timeout": 14400 - }, - "build-ibd-no-assumevalid-checkpoint": { - "script": "builds/build-ibd-no-assumevalid-checkpoint.sh", - "timeout": 21600 - }, - "build-linux64": { - "script": "builds/build-linux64.sh", - "timeout": 1200 - }, - "build-linux-aarch64": { - "script": "builds/build-linux-aarch64.sh", - "timeout": 1800, - "environment": { - "QEMU_LD_PREFIX": "/usr/aarch64-linux-gnu" - } - }, - "build-linux-arm": { - "script": "builds/build-linux-arm.sh", - "timeout": 1800, - "environment": { - "QEMU_LD_PREFIX": "/usr/arm-linux-gnueabihf" + "templates": { + }, + "builds": { + "build-asan": { + "script": "builds/build-asan.sh", + "timeout": 1800 + }, + "build-autotools": { + "script": "builds/build-autotools.sh", + "timeout": 1200 + }, + "build-bench": { + "script": "builds/build-bench.sh", + "timeout": 1200 + }, + "build-clang-10": { + "script": "builds/build-clang-10.sh", + "timeout": 1200 + }, + "build-clang-tidy": { + "script": "builds/build-clang-tidy.sh", + "timeout": 600 + }, + "build-coverage": { + "script": "builds/build-coverage.sh", + "timeout": 3600 + }, + "build-diff": { + "script": "builds/build-diff.sh", + "timeout": 1200 + }, + "build-ibd": { + "script": "builds/build-ibd.sh", + "timeout": 14400 + }, + "build-ibd-no-assumevalid-checkpoint": { + "script": "builds/build-ibd-no-assumevalid-checkpoint.sh", + "timeout": 21600 + }, + "build-linux64": { + "script": "builds/build-linux64.sh", + "timeout": 1200 + }, + "build-linux-aarch64": { + "script": "builds/build-linux-aarch64.sh", + "timeout": 1800, + "environment": { + "QEMU_LD_PREFIX": "/usr/aarch64-linux-gnu" + } + }, + "build-linux-arm": { + "script": "builds/build-linux-arm.sh", + "timeout": 1800, + "environment": { + "QEMU_LD_PREFIX": "/usr/arm-linux-gnueabihf" + } + }, + "build-make-generator": { + "script": "builds/build-make-generator.sh", + "timeout": 1200 + }, + "build-master": { + "script": "builds/build-master.sh", + "timeout": 4800 + }, + "build-osx": { + "script": "builds/build-osx.sh", + "timeout": 600 + }, + "build-secp256k1": { + "script": "builds/build-secp256k1.sh", + "timeout": 900 + }, + "build-tsan": { + "script": "builds/build-tsan.sh", + "timeout": 1800 + }, + "build-ubsan": { + "script": "builds/build-ubsan.sh", + "timeout": 1800 + }, + "build-win64": { + "script": "builds/build-win64.sh", + "timeout": 1200 + }, + "build-without-cli": { + "script": "builds/build-without-cli.sh", + "timeout": 1200 + }, + "build-without-wallet": { + "script": "builds/build-without-wallet.sh", + "timeout": 1200 + }, + "build-without-zmq": { + "script": "builds/build-without-zmq.sh", + "timeout": 1800 + }, + "check-seeds": { + "script": "builds/check-seeds.sh", + "timeout": 600 } - }, - "build-make-generator": { - "script": "builds/build-make-generator.sh", - "timeout": 1200 - }, - "build-master": { - "script": "builds/build-master.sh", - "timeout": 4800 - }, - "build-osx": { - "script": "builds/build-osx.sh", - "timeout": 600 - }, - "build-secp256k1": { - "script": "builds/build-secp256k1.sh", - "timeout": 900 - }, - "build-tsan": { - "script": "builds/build-tsan.sh", - "timeout": 1800 - }, - "build-ubsan": { - "script": "builds/build-ubsan.sh", - "timeout": 1800 - }, - "build-win64": { - "script": "builds/build-win64.sh", - "timeout": 1200 - }, - "build-without-cli": { - "script": "builds/build-without-cli.sh", - "timeout": 1200 - }, - "build-without-wallet": { - "script": "builds/build-without-wallet.sh", - "timeout": 1200 - }, - "build-without-zmq": { - "script": "builds/build-without-zmq.sh", - "timeout": 1800 - }, - "check-seeds": { - "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 @@ -4,6 +4,7 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. import argparse +from deepmerge import always_merger import json import os from pathlib import Path, PurePath @@ -57,8 +58,17 @@ with open(config_path, encoding="utf-8") as f: config = json.load(f) + # The configuration root should contain a mandatory element "builds", and it + # should not be empty. + if not config.get("builds", None): + raise AssertionError( + "Invalid configuration file {}: the \"builds\" element is missing or empty".format( + str(config_path) + ) + ) + # Check the target build has an entry in the configuration file - build = config.get(args.build, None) + build = config["builds"].get(args.build, None) if not build: raise AssertionError( "{} is not a valid build identifier. Valid identifiers are {}".format( @@ -66,6 +76,25 @@ ) ) + # Get a list of the templates, if any + templates = config.get("templates", {}) + + # If the build references a template, merge the configurations + template_name = build.get("template", None) + if template_name: + # Raise an error if the template does not exist + if template_name not in templates: + raise AssertionError( + "Build {} configuration inherits from template {}, but the template does not exist.".format( + args.build, + template_name + ) + ) + + # The template exists, apply the build configuration on top of the + # template + build = always_merger.merge(templates.get(template_name, {}), build) + # Make sure there is a script file associated with the build... script = build.get("script", None) if script is None: diff --git a/contrib/teamcity/setup-debian-buster.sh b/contrib/teamcity/setup-debian-buster.sh --- a/contrib/teamcity/setup-debian-buster.sh +++ b/contrib/teamcity/setup-debian-buster.sh @@ -118,3 +118,5 @@ # Python library for interacting with teamcity pip3 install teamcity-messages +# Python library for merging nested structures +pip3 install deepmerge