Compare commits

...

48 Commits

Author SHA1 Message Date
Peter Šurda fe9ea06316
Typos 2024-03-29 18:14:27 +08:00
Peter Šurda 9e28a6781d
Typos 2024-03-29 18:09:58 +08:00
Peter Šurda 4bfe5f2be8
Typos 2024-03-29 18:08:09 +08:00
Peter Šurda 1ac083f22d
Typo, missing commas 2024-03-29 17:58:45 +08:00
Peter Šurda b6cbbed64e
Typo 2024-03-29 17:01:37 +08:00
Peter Šurda ec69e113bf
Add signing and environment variables 2024-03-29 16:46:07 +08:00
Peter Šurda 970e2f1f0f
Update deps 2024-03-06 07:57:44 +08:00
Peter Šurda d0f4dcb584
Update bionic deps 2024-03-06 07:14:31 +08:00
Peter Šurda f0be34e191
Change deps versions
- pyopenssl, cryptography, buildbot worker
2024-03-06 00:16:05 +08:00
Peter Šurda 180854160f
Change cryptography and pyopenssl versions 2024-03-05 19:17:23 +08:00
Peter Šurda bba9168f28
Downgrade python cryptography package 2024-03-05 13:06:56 +08:00
Peter Šurda 4d613d1c83
Downgrade pyOpenSSL on old ubuntu 2024-03-05 09:16:43 +08:00
Peter Šurda 8b99da077a
Typo 2024-03-05 07:10:04 +08:00
Peter Šurda 51fde19747
Fix buildbot deps for old ubuntu 2024-03-04 07:55:46 +08:00
Peter Šurda d42e359732
Fix buildbot worker for older ubuntu 2024-03-04 07:09:22 +08:00
Peter Šurda cd431f1891
Missing user/group for old buildbot 2024-03-03 23:28:31 +08:00
Peter Šurda b62feb681e
Fix buildbot worker TLS for old ubuntu 2024-03-03 22:49:05 +08:00
Peter Šurda a4e2b4e249
Partially revert last commit
- looks like BUILDMASTER variable name is hard coded into buildbot
  docker worker code
2024-03-03 21:35:28 +08:00
Peter Šurda 97c191b8e8
Certificate for PB buildbot connections
- add buildbot.bitmessage.org cert
- change BUILDMASTER to CONNECTIONSTRING
2024-03-03 20:20:36 +08:00
Peter Šurda 3316e2e9da
Bump build timeout to 2 hours 2023-11-21 07:50:11 +08:00
Lee Miller 8eef0e0b5d
For xenial download buildbot_entrypoint.sh only if it's missing 2023-09-19 03:41:40 +03:00
Peter Šurda d0ac191f52
Don't throw exception if base dir missing 2022-11-16 11:45:41 +08:00
Peter Šurda 07b4aeafe0
Repurpose `project` for job name
- `codebase` isn't really working as expected, and `project` appears to
  be unused in multibuild
2022-10-19 21:12:56 +08:00
Peter Šurda 0920807624
Attempt to differentiate children with codebase 2022-10-19 20:39:19 +08:00
Peter Šurda 514c584609
Upload even if tests fail
- we still may want either the build artifact or a video of the tests
  even if tests fail
2022-08-09 23:09:15 +08:00
Peter Šurda 4bf6fb73b2
Fix upload 2022-08-08 16:20:14 +08:00
Peter Šurda f65acbc243
Typo 2022-08-08 11:40:59 +08:00
Peter Šurda fa213e5733
Add uploading 2022-08-08 11:28:57 +08:00
Peter Šurda 85908702c9
Sleep between calling webhooks
buildbot/multibuild_parent Build done. Details
buildbot/travis_bionic Build done. Details
2022-06-02 21:24:21 +08:00
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/multibuild_parent Build done. Details
buildbot/travis_bionic Build done. Details
2022-04-27 20:02:11 +05:30
Peter Šurda 9d8b6f41b4
Symlink support
buildbot/travis_bionic Build done. Details
buildbot/multibuild_parent 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
Peter Šurda b020325a08
Merge production changes
buildbot/travis_bionic Build done. Details
- bugfixes, code quality
2022-04-07 20:46:29 +08:00
Muzahid 83444728f3
add webhook password
buildbot/travis_bionic Build done. Details
2022-03-16 12:45:35 +05:30
Muzahid d847415a41
Split Worker and Master
buildbot/travis_bionic Build done. Details
2022-03-09 17:35:00 +05:30
Muzahid a337147f43
fixed join issue
buildbot/travis_bionic Build done. Details
2022-02-11 12:36:42 +05:30
Muzahid 52aec8a8e6
changes done for parent build
buildbot/travis_bionic Build done. Details
2022-02-07 15:39:33 +05:30
Muzahid b0feb4ea90
fixing configuration issues
buildbot/travis_bionic Build done. Details
2022-02-03 21:54:11 +05:30
Shashi 6039d3a39b
Removed parent hook
buildbot/travis_bionic Build done. Details
2021-12-26 13:00:48 +05:30
Shashi c9d1ffa117
Minor updates 2021-12-25 16:51:52 +05:30
Shashi bea032dc78
Updated multibuild and renderers 2021-12-25 12:27:44 +05:30
Shashi 9a55687ec6
Added functions to add more steps to a buildFactory 2021-12-25 10:19:17 +05:30
Shashi 1432e510a1
Add extra content in dockerfile based on OS 2021-12-24 09:36:25 +05:30
Shashi f38fd1c826
Updated-S 2021-12-23 16:56:44 +05:30
Shashi 27da79a92b
Added parent hook and some renderer 2021-12-23 13:31:52 +05:30
3 changed files with 466 additions and 16 deletions

79
lib/renderers.py Normal file
View File

@ -0,0 +1,79 @@
from buildbot.plugins import util
import re
def _is_build_script_available(props):
return props.getProperty("build_script_available", default=False)
@util.renderer
def is_build_script_available(props):
return _is_build_script_available(props)
@util.renderer
def isnt_build_script_available(props):
return not _is_build_script_available(props)
def _is_test_script_available(props):
return props.getProperty("test_script_available", default=False)
@util.renderer
def is_test_script_available(props):
return _is_test_script_available(props)
@util.renderer
def isnt_test_script_available(props):
return not _is_test_script_available(props)
def _files_to_upload(props):
try:
return ','.join(props.getProperty("files_to_upload", default="").rstrip().split("\n"))
except AttributeError:
return ""
@util.renderer
def files_to_upload(props):
return _files_to_upload(props)
@util.renderer
def has_files_to_upload(props):
return bool(_files_to_upload(props))
@util.renderer
def no_files_to_upload(props):
return not _files_to_upload(props)
def _should_build_sign(props):
if props.getProperty('branch') == 'v0.6' \
and props.getProperty('jobname') == 'android' \
and props.getProperty('repository') in (
'git@github.com:Bitmessage/PyBitmessage.git',
'https://github.com/Bitmessage/PyBitmessage'
):
return True
return False
@util.renderer
def should_build_sign(props):
return _is_build_script_available(props) and _should_build_sign(props)
@util.renderer
def shouldnt_build_sign(props):
return _is_build_script_available(props) and not _should_build_sign(props)
@util.renderer
def build_env(props):
default_envs = {
"BUILDBOT_REPOSITORY": props.getProperty("repository"),
"BUILDBOT_BRANCH": props.getProperty("branch"),
"BUILDBOT_JOBNAME": props.getProperty("jobname")
}
new_envs = {}
if props.getProperty("jobname", default="") == "android":
new_envs = {
"P4A_RELEASE_KEYSTORE": "/var/lib/buildbot/keystore",
"P4A_RELEASE_KEYSTORE_PASSWD": util.Secret("bitmessage-keystore"),
"P4A_RELEASE_KEYALIAS_PASSWD": util.Secret("bitmessage-keystore"),
"P4A_RELEASE_KEYALIAS": "bitmessagetest"
}
if _should_build_sign(props):
return {**default_envs, **new_envs}
return default_envs

268
lib/worker_multibuild.py Normal file
View File

@ -0,0 +1,268 @@
from os import getcwd, listdir
from os.path import exists, isfile, islink, join, realpath
import requests
import re
from subprocess import Popen, PIPE
from time import sleep
request_data = {
"project": "testproject",
"comments": "testcomment",
}
ty = "/change_hook/base"
path = ".buildbot"
dockerfile_extra_contents = {}
dockerfile_extra_contents['focal'] = """
# 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 wget -O /usr/local/share/ca-certificates/buildbot-ca.crt https://git.bitmessage.org/Bitmessage/buildbot-scripts/raw/branch/master/docker/bionic/buildbot-ca.crt
RUN update-ca-certificates
RUN echo 'buildbot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER buildbot
ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER:$BUILDMASTER_PORT" "$WORKERNAME" "$WORKERPASS"
"""
dockerfile_extra_contents['bionic'] = """
# Buildbot
RUN apt-get update -y && apt-get install -yq --no-install-suggests --no-install-recommends \
git subversion python3-dev libffi-dev python3-setuptools \
python3-pip dumb-init curl openssh-client wget python3-wheel \
pkg-config rustc cargo
RUN pip3 install setuptools_rust
RUN pip3 install 'buildbot-worker==3.1.1' \
'cryptography==2.1.4' \
'twisted==17.9.0' \
'pyopenssl==17.5.0'
RUN groupadd buildbot
RUN useradd -d /var/lib/buildbot -m -g buildbot buildbot
# 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 wget -O /usr/local/share/ca-certificates/buildbot-ca.crt https://git.bitmessage.org/Bitmessage/buildbot-scripts/raw/branch/master/docker/bionic/buildbot-ca.crt
RUN update-ca-certificates
RUN echo 'buildbot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER buildbot
ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER:$BUILDMASTER_PORT" "$WORKERNAME" "$WORKERPASS"
"""
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 wget -O /usr/local/share/ca-certificates/buildbot-ca.crt https://git.bitmessage.org/Bitmessage/buildbot-scripts/raw/branch/master/docker/bionic/buildbot-ca.crt
RUN update-ca-certificates
RUN echo 'buildbot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER buildbot
ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER:$BUILDMASTER_PORT" "$WORKERNAME" "$WORKERPASS"
"""
dockerfile_extra_contents['xenial'] = """
# Buildbot
RUN apt-get update -y && apt-get install -yq --no-install-suggests --no-install-recommends \
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 python3-wheel pkg-config rustc cargo \
python3-openssl
RUN pip3 install setuptools_rust
RUN pip3 install 'buildbot-worker<3.2.0' 'cryptography<35.0.0'
RUN groupadd buildbot
RUN useradd -d /var/lib/buildbot -m -g buildbot buildbot
# 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 [ -f /usr/local/bin/buildbot_entrypoint.sh ] || 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 wget -O /usr/local/share/ca-certificates/buildbot-ca.crt https://git.bitmessage.org/Bitmessage/buildbot-scripts/raw/branch/master/docker/bionic/buildbot-ca.crt
RUN update-ca-certificates
RUN echo 'buildbot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER buildbot
ENTRYPOINT /usr/local/bin/buildbot_entrypoint.sh "$BUILDMASTER:$BUILDMASTER_PORT" "$WORKERNAME" "$WORKERPASS"
"""
def get_secret():
with open("multibuild_parent_key.key", 'r') as f:
data = f.read()
return data
def list_jobs(directory=".buildbot"):
"""
list jobs found in a directory
"""
results = []
files = ["Dockerfile", "build.sh", "test.sh"]
if not exists(directory):
return results
for item in listdir(directory):
print("checking directory {}".format(item))
flag = False
for fname in files:
filepath = join(directory, item, fname)
# must exist
if not exists(filepath):
continue
# 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
break
if flag:
continue
if (exists(join(directory, item, 'Dockerfile'))
and exists(join(directory, item, 'build.sh'))) \
or exists(join(directory, item, 'test.sh')):
results.append(item)
return results
def get_revision(branch):
proc = Popen(["git", "rev-parse", branch], stdout=PIPE)
retval = proc.stdout.read().strip()
retval = retval.decode('utf-8')
return retval
def _get_dockerfile_contents(dockerfile):
"""
Read contents of a Dockerfile and add buildbot worker bootstrap
for a given os_codename
"""
os_codename = 'bionic'
res = ""
with open(dockerfile, "r") as file:
contents = file.readlines()
has_from = False
# accept any line containing FROM and RUN keywords
res = ""
inside_allowed_command = False
for line in contents:
m = re.match(r"(?m)^(FROM|RUN|ENV).*$", line)
if m:
inside_allowed_command = True
if m.group(1) == "FROM":
os_codename = m.group().split()[1].split(":")[1]
has_from = True
if inside_allowed_command:
res += line
ls = line.strip()
if not ls.endswith("\\"):
inside_allowed_command = False
if not has_from:
return None
try:
return res + dockerfile_extra_contents[os_codename]
except KeyError:
return None
def trigger_child_hooks(buildbotUrl: str, repository, branch, revision,
directory=".buildbot"):
request_url = buildbotUrl + ty
# List all jobs in the directory
jobs = list_jobs(directory)
request_headers = {
"Content-Type": "application/json",
"X-Multibuild-Trigger": get_secret(),
"Accept": "text/plain",
}
# revision = get_revision(branch)
# Check if build.sh or test.sh exists in each of the jobs
for job in jobs:
build_script_exists = False
test_script_exists = False
if exists(join(directory, job, "build.sh")):
build_script_exists = True
if exists(join(directory, job, "test.sh")):
test_script_exists = True
# make a post request
dockerfile = _get_dockerfile_contents(
join(directory, job, "Dockerfile")
)
if not dockerfile:
continue
request_data["branch"] = branch
request_data["revision"] = revision
request_data["properties"] = {
"dockerfile": dockerfile,
"build_script_available": build_script_exists,
"test_script_available": test_script_exists,
"jobname": job,
}
request_data["changes"] = {
"author": "buildbot_multibuild",
"repository": repository,
"project": job,
}
retval = requests.post(request_url, headers=request_headers,
json=request_data)
print("Triggered job for {} on {}: {}".format(job, request_url,
retval.text))
sleep(1)
if __name__ == "__main__":
# expect jobname, repository, branch, buildbotUrl from command line
import sys
if len(sys.argv) == 5:
buildbotUrl = sys.argv[1]
repository = sys.argv[2]
branch = sys.argv[3]
revision = sys.argv[4]
trigger_child_hooks(buildbotUrl, repository, branch, revision)
else:
sys.exit(
"Usage: python3 multibuild.py <buildbotUrl> <repository> <branch> <revision>"
)

View File

@ -10,23 +10,12 @@ Requires docker
# TODO: write hook job, maybe also a dockerfile?
# TODO: what to do about non-docker jobs
from os import walk
from os.path import exists, isfile, join, listdir
from os import listdir
from os.path import isfile, join
from buildbot.plugins import steps, util
from buildbot.process.results import SUCCESS
def list_jobs(directory=".buildbot"):
"""
list jobs found in a directory
"""
results = []
for _ in next(walk(directory))[1]:
if exists(join(directory, _, "Dockerfile")) \
and (exists(join(directory, _, "build.sh"))
or exists(join(directory, _, "test.sh"))
):
results.append(_)
return results
from .lib.renderers import *
def find_artifacts(directory="out"):
@ -37,3 +26,117 @@ def find_artifacts(directory="out"):
if not isfile(join(directory, _)):
continue
return join(directory, _)
def add_parent_step(build_factory):
"""
Add a step to the parent build factory that will trigger the child hooks
"""
build_factory.addStep(
steps.ShellCommand(
name="Execute worker script",
command=[
"python3",
'/usr/local/bin/worker_multibuild.py',
util.Property("buildboturl"),
util.Property('repository'),
util.Property('branch'),
util.Property('revision')
],
)
)
def add_child_sh_steps(build_factory, directory=".buildbot"):
"""
Add a step to the download, build and test factory
"""
build_factory.addStep(
steps.FileDownload(
name="Upload keystore",
workerdest="/var/lib/buildbot/keystore",
mastersrc=util.Interpolate("keystore/%(prop:jobname)s.keystore"),
doStepIf=should_build_sign,
hideStepIf=True,
mode=0o600
)
)
build_factory.addStep(
steps.ShellCommand(
name=util.Interpolate("build_%(prop:jobname)s"),
command=util.Interpolate("%(kw:directory)s/"
"%(prop:jobname)s/build.sh",
directory=directory),
env=build_env,
doStepIf=shouldnt_build_sign,
hideStepIf=isnt_build_script_available,
timeout=7200,
)
)
build_factory.addStep(
steps.ShellCommand(
name=util.Interpolate("build_and_sign_%(prop:jobname)s"),
command=util.Interpolate("%(kw:directory)s/"
"%(prop:jobname)s/build.sh",
directory=directory),
env=build_env,
doStepIf=should_build_sign,
hideStepIf=isnt_build_script_available,
timeout=7200,
)
)
build_factory.addStep(
steps.ShellCommand(
name="Delete keystore",
command="rm -f /var/lib/buildbot/keystore",
doStepIf=should_build_sign,
hideStepIf=True,
)
)
build_factory.addStep(
steps.ShellCommand(
name=util.Interpolate("test_%(prop:jobname)s"),
command=util.Interpolate("%(kw:directory)s/"
"%(prop:jobname)s/test.sh",
directory=directory),
haltOnFailure=False,
flunkOnFailure=True,
doStepIf=is_test_script_available,
hideStepIf=isnt_test_script_available,
)
)
build_factory.addStep(
steps.SetPropertyFromCommand(
name="Find files to upload",
command="find . -maxdepth 1 -mindepth 1 "
"-type f -printf '%P\n'",
workdir="out",
hideStepIf=True,
decodeRC={0: SUCCESS, 1: SUCCESS},
property="files_to_upload"
)
)
build_factory.addStep(
steps.ShellCommand(
name="Upload files",
workdir="out",
doStepIf=has_files_to_upload,
hideStepIf=no_files_to_upload,
command=util.Interpolate(
"curl -T {%s} -u buildbot:%s "
"https://artifacts.bitmessage.at/%s/%s/",
files_to_upload,
util.Secret('artifact_upload'),
util.Property('jobname'),
util.Property('buildnumber'),
)
)
)