diff --git a/multibuild.py b/multibuild.py index 909ad57..94bf1b2 100644 --- a/multibuild.py +++ b/multibuild.py @@ -14,18 +14,19 @@ from os import walk from os.path import exists, isfile, join, listdir import requests import re +from buildbot.plugins import steps, util -ty = '/change_hook/base' +ty = "/change_hook/base" request_headers = { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'text/plain' + "Content-Type": "application/x-www-form-urlencoded", + "Accept": "text/plain", } request_data = { - 'project': 'testproject', - 'comments': 'testcomment', + "project": "testproject", + "comments": "testcomment", } -dockerfile_extra_contents_focal = ''' +dockerfile_extra_contents_focal = """ # Buildbot RUN apt-get install -yq --no-install-suggests --no-install-recommends \ @@ -38,9 +39,9 @@ USER buildbot ENTRYPOINT /entrypoint.sh "$BUILDMASTER" "$WORKERNAME" "$WORKERPASS" -''' +""" -dockerfile_extra_contents_bionic = ''' +dockerfile_extra_contents_bionic = """ # Buildbot RUN apt-get install -yq --no-install-suggests --no-install-recommends \ @@ -57,7 +58,8 @@ USER buildbot ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER" "$WORKERNAME" "$WORKERPASS" -''' +""" + def list_jobs(directory=".buildbot"): """ @@ -65,10 +67,10 @@ def list_jobs(directory=".buildbot"): """ results = [] for _ in next(walk(directory))[1]: - if exists(join(directory, _, "Dockerfile")) \ - and (exists(join(directory, _, "build.sh")) - or exists(join(directory, _, "test.sh")) - ): + if exists(join(directory, _, "Dockerfile")) and ( + exists(join(directory, _, "build.sh")) + or exists(join(directory, _, "test.sh")) + ): results.append(_) return results @@ -83,21 +85,23 @@ def find_artifacts(directory="out"): continue return join(directory, _) + def get_dockerfile_contents(path, os_codename): - ''' + """ Read contents of a Dockerfile and add extra contents for the given os_codename - ''' - with open(path, 'r') as file: + """ + with open(path, "r") as file: contents = file.read() # remove any line containing CMD or ENTRYFILE keywords - contents = re.sub(r'(?m)^CMD.*$', '', contents) - contents = re.sub(r'(?m)^ENTRYFILE.*$', '', contents) + contents = re.sub(r"(?m)^CMD.*$", "", contents) + contents = re.sub(r"(?m)^ENTRYFILE.*$", "", contents) return contents + eval("dockerfile_extra_contents_" + os_codename) -def trigger_child_hooks(buildbotUrl:str, os_codename:str, directory=".buildbot"): + +def trigger_child_hooks(buildbotUrl: str, os_codename: str, directory=".buildbot"): request_url = buildbotUrl + ty - + # List all jobs in the directory jobs = list_jobs(directory) @@ -109,16 +113,72 @@ def trigger_child_hooks(buildbotUrl:str, os_codename:str, directory=".buildbot") build_script_exists = True if exists(join(directory, job, "test.sh")): test_script_exists = True - + # make a post request - request_data['dockerfile'] = get_dockerfile_contents(join(directory, job, "Dockerfile"), os_codename) - request_data['build_script_available'] = str(build_script_exists) - request_data['test_script_available'] = str(test_script_exists) + request_data["dockerfile"] = get_dockerfile_contents( + join(directory, job, "Dockerfile"), os_codename + ) + request_data["build_script_available"] = str(build_script_exists) + request_data["test_script_available"] = str(test_script_exists) requests.post(request_url, headers=request_headers, data=request_data) + +def add_parent_step(build_factory, jobname, repository, branch): + """ + Add a step to the parent build factory that will trigger the child hooks + """ + build_factory.addStep( + steps.SetPropertyFromCommand( + name="Get OS codename", + command="grep ^VERSION_CODENAME= /etc/os-release | cut -d= -f2", + property="os_codename", + ) + ) + + build_factory.addStep( + steps.ShellCommand( + name="Execute multibuild script", + command=[ + "python", + "multibuild.py", + jobname, + repository, + branch, + "https://buildbot.bitmessage.org", + util.Interpolate("%(prop:os_codename)s"), + ], + ) + ) + + +def add_child_build_sh_step(build_factory, job, directory=".buildbot"): + """ + Add a step to the build factory + """ + build_factory.addStep( + steps.ShellCommand( + name="build_" + job, + command=["bash", "-c", "cd " + join(directory, job) + " && ./build.sh"], + ) + ) + + +def add_child_test_sh_step(build_factory, job, directory=".buildbot"): + """ + Add a step to the build factory + """ + build_factory.addStep( + steps.ShellCommand( + name="test_" + job, + command=["bash", "-c", "cd " + join(directory, job) + " && ./test.sh"], + ) + ) + + if __name__ == "__main__": # expect jobname, repository, branch, buildbotUrl, os_codename from command line args import sys + if len(sys.argv) == 6: jobname = sys.argv[1] repository = sys.argv[2] @@ -127,10 +187,12 @@ if __name__ == "__main__": os_codename = sys.argv[5] # add these into the request_data - request_data['jobname'] = jobname - request_data['repository'] = repository - request_data['branch'] = branch + request_data["jobname"] = jobname + request_data["repository"] = repository + request_data["branch"] = branch trigger_child_hooks(buildbotUrl, os_codename) else: - print("Usage: python3 multibuild.py ") \ No newline at end of file + print( + "Usage: python3 multibuild.py " + )