Compare commits

..

6 Commits

Author SHA1 Message Date
Peter Šurda 7929e6dd37
Xenial entrypoint
buildbot/multibuild_parent Build done. Details
buildbot/travis_bionic Build done. Details
2022-05-08 12:29:22 +08:00
Peter Šurda 37956d50af
Support dumb-init on xenial
buildbot/multibuild_parent Build done. Details
buildbot/travis_bionic Build done. Details
2022-05-08 11:21:54 +08:00
shekhar-cis ff87ae8ec5
Add xenial and jammy
buildbot/travis_bionic Build done. Details
buildbot/multibuild_parent Build done. Details
2022-04-27 20:02:11 +05:30
Peter Šurda 9d8b6f41b4
Symlink support
buildbot/multibuild_parent Build done. Details
buildbot/travis_bionic Build done. Details
- added some security checks so that symlinks can be supported
- also some code quality changes
2022-04-12 14:30:33 +08:00
Peter Šurda f2cb5fd8d3
Fix revision handling (should fix github/gitea reporting)
buildbot/multibuild_parent Build done. Details
buildbot/travis_bionic Build done. Details
2022-04-11 16:53:39 +08:00
Peter Šurda 53fcd7e7b9
Optimize steps
buildbot/travis_bionic Build done. Details
2022-04-08 11:20:50 +08:00
2 changed files with 82 additions and 38 deletions

View File

@ -1,5 +1,5 @@
from os import listdir from os import getcwd, listdir
from os.path import exists, isfile, join, islink from os.path import exists, isfile, islink, join, realpath
import requests import requests
import re import re
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
@ -16,8 +16,8 @@ dockerfile_extra_contents = {}
dockerfile_extra_contents['focal'] = """ dockerfile_extra_contents['focal'] = """
# Buildbot # Buildbot
RUN apt-get install -yq --no-install-suggests --no-install-recommends \ RUN apt-get update -y && apt-get install -yq --no-install-suggests --no-install-recommends \
buildbot-worker git subversion python3-dev libffi-dev python3-setuptools \ python3-buildbot-worker git subversion python3-dev libffi-dev python3-setuptools \
python3-pip dumb-init curl openssh-client wget python3-pip dumb-init curl openssh-client wget
# buildbot entrypoint # buildbot entrypoint
@ -35,7 +35,7 @@ ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER" "$WORKERNAME" "$
dockerfile_extra_contents['bionic'] = """ dockerfile_extra_contents['bionic'] = """
# Buildbot # Buildbot
RUN apt-get install -yq --no-install-suggests --no-install-recommends \ RUN apt-get update -y && apt-get install -yq --no-install-suggests --no-install-recommends \
buildbot-slave git subversion python3-dev libffi-dev python3-setuptools \ buildbot-slave git subversion python3-dev libffi-dev python3-setuptools \
python3-pip dumb-init curl openssh-client wget python3-pip dumb-init curl openssh-client wget
@ -51,6 +51,48 @@ ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER" "$WORKERNAME" "$
""" """
dockerfile_extra_contents['jammy'] = """
# Buildbot
RUN apt-get update -y && apt-get install -yq --no-install-suggests --no-install-recommends \
python3-buildbot-worker git subversion python3-dev libffi-dev python3-setuptools \
python3-pip dumb-init curl openssh-client wget
# buildbot entrypoint
RUN wget -O /usr/local/bin/buildbot_entrypoint.sh https://git.bitmessage.org/Bitmessage/buildbot-scripts/raw/branch/master/docker/bionic/entrypoint.sh
RUN chmod +x /usr/local/bin/buildbot_entrypoint.sh
RUN echo 'buildbot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER buildbot
ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER" "$WORKERNAME" "$WORKERPASS"
"""
dockerfile_extra_contents['xenial'] = """
# Buildbot
RUN apt-get update -y && apt-get install -yq --no-install-suggests --no-install-recommends \
buildbot-slave git subversion python3-dev libffi-dev python3-setuptools \
python3-pip curl openssh-client wget \
python-setuptools python-psutil libssl-dev python-dev libgmp-dev python-virtualenv
# dumb-init
RUN wget https://github.com/Yelp/dumb-init/releases/download/v1.2.5/dumb-init_1.2.5_amd64.deb
RUN dpkg -i dumb-init_*.deb && rm -f dumb-init_*.deb
# buildbot entrypoint
RUN wget -O /usr/local/bin/buildbot_entrypoint.sh https://git.bitmessage.org/Bitmessage/buildbot-scripts/raw/branch/master/docker/xenial/entrypoint.sh
RUN chmod +x /usr/local/bin/buildbot_entrypoint.sh
RUN echo 'buildbot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER buildbot
ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER" "$WORKERNAME" "$WORKERPASS"
"""
def get_secret(): def get_secret():
with open("multibuild_parent_key.key", 'r') as f: with open("multibuild_parent_key.key", 'r') as f:
@ -69,20 +111,29 @@ def list_jobs(directory=".buildbot"):
flag = False flag = False
for fname in files: for fname in files:
filepath = join(directory, item, fname) filepath = join(directory, item, fname)
# must exist
if not exists(filepath): if not exists(filepath):
continue continue
if islink(filepath) or not isfile(filepath): # must be a file
if not isfile(filepath):
flag = True
break
# symlink OK as long as it points to files within the repo
if islink(filepath) \
and not realpath(filepath).startswith(getcwd()):
flag = True flag = True
break break
if flag: if flag:
continue continue
if (exists(join(directory, item, 'Dockerfile')) and exists(join(directory, item, 'build.sh'))) or exists(join(directory, item, 'test.sh')): if (exists(join(directory, item, 'Dockerfile'))
and exists(join(directory, item, 'build.sh'))) \
or exists(join(directory, item, 'test.sh')):
results.append(item) results.append(item)
return results return results
def get_revision(): def get_revision(branch):
proc = Popen(["git", "rev-parse", "HEAD"], stdout=PIPE) proc = Popen(["git", "rev-parse", branch], stdout=PIPE)
retval = proc.stdout.read().strip() retval = proc.stdout.read().strip()
retval = retval.decode('utf-8') retval = retval.decode('utf-8')
return retval return retval
@ -90,7 +141,8 @@ def get_revision():
def _get_dockerfile_contents(dockerfile): def _get_dockerfile_contents(dockerfile):
""" """
Read contents of a Dockerfile and add extra contents for the given os_codename Read contents of a Dockerfile and add buildbot worker bootstrap
for a given os_codename
""" """
os_codename = 'bionic' os_codename = 'bionic'
res = "" res = ""
@ -105,6 +157,7 @@ def _get_dockerfile_contents(dockerfile):
if m: if m:
inside_allowed_command = True inside_allowed_command = True
if m.group(1) == "FROM": if m.group(1) == "FROM":
os_codename = m.group().split()[1].split(":")[1]
has_from = True has_from = True
if inside_allowed_command: if inside_allowed_command:
res += line res += line
@ -114,10 +167,15 @@ def _get_dockerfile_contents(dockerfile):
if not has_from: if not has_from:
return None return None
return res + dockerfile_extra_contents[os_codename]
try:
return res + dockerfile_extra_contents[os_codename]
except KeyError:
return None
def trigger_child_hooks(buildbotUrl: str, repository, branch, directory=".buildbot"): def trigger_child_hooks(buildbotUrl: str, repository, branch, revision,
directory=".buildbot"):
request_url = buildbotUrl + ty request_url = buildbotUrl + ty
# List all jobs in the directory # List all jobs in the directory
jobs = list_jobs(directory) jobs = list_jobs(directory)
@ -126,7 +184,7 @@ def trigger_child_hooks(buildbotUrl: str, repository, branch, directory=".buildb
"X-Multibuild-Trigger": get_secret(), "X-Multibuild-Trigger": get_secret(),
"Accept": "text/plain", "Accept": "text/plain",
} }
revision = get_revision() # revision = get_revision(branch)
# Check if build.sh or test.sh exists in each of the jobs # Check if build.sh or test.sh exists in each of the jobs
for job in jobs: for job in jobs:
@ -160,21 +218,24 @@ def trigger_child_hooks(buildbotUrl: str, repository, branch, directory=".buildb
"project": "/".join(repository.split("/")[-2:]), "project": "/".join(repository.split("/")[-2:]),
} }
retval = requests.post(request_url, headers=request_headers, json=request_data) retval = requests.post(request_url, headers=request_headers,
print("Triggered job for {} on {}: {}".format(job, request_url, retval.text)) json=request_data)
print("Triggered job for {} on {}: {}".format(job, request_url,
retval.text))
if __name__ == "__main__": if __name__ == "__main__":
# expect jobname, repository, branch, buildbotUrl from command line # expect jobname, repository, branch, buildbotUrl from command line
import sys import sys
if len(sys.argv) == 4: if len(sys.argv) == 5:
buildbotUrl = sys.argv[1] buildbotUrl = sys.argv[1]
repository = sys.argv[2] repository = sys.argv[2]
branch = sys.argv[3] branch = sys.argv[3]
revision = sys.argv[4]
trigger_child_hooks(buildbotUrl, repository, branch) trigger_child_hooks(buildbotUrl, repository, branch, revision)
else: else:
sys.exit( sys.exit(
"Usage: python3 multibuild.py <buildbotUrl> <repository> <branch>" "Usage: python3 multibuild.py <buildbotUrl> <repository> <branch> <revision>"
) )

View File

@ -32,33 +32,16 @@ def add_parent_step(build_factory):
Add a step to the parent build factory that will trigger the child hooks Add a step to the parent build factory that will trigger the child hooks
""" """
build_factory.addStep(steps.ShellCommand(
name="Update APT cache",
command=["sudo", "apt", "update"]
))
build_factory.addStep(steps.ShellCommand(
name="Install dependencies",
command=["sudo", "apt", "-y", "install", "python3-requests"]
))
build_factory.addStep(
steps.FileDownload(
workerdest="worker_multibuild.py",
mastersrc="buildbot_multibuild/lib/worker_multibuild.py",
mode=0o444
)
)
build_factory.addStep( build_factory.addStep(
steps.ShellCommand( steps.ShellCommand(
name="Execute worker script", name="Execute worker script",
command=[ command=[
"python3", "python3",
'worker_multibuild.py', '/usr/local/bin/worker_multibuild.py',
util.Property("buildboturl"), util.Property("buildboturl"),
util.Property('repository'), util.Property('repository'),
util.Property('branch') util.Property('branch'),
util.Property('revision')
], ],
) )
) )