commit: aa857a46bc666f780586ba62cebe7d6bb77fba2d
Author: Magnus Granberg <zorry <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 1 00:18:37 2022 +0000
Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org>
CommitDate: Wed Jun 1 00:18:37 2022 +0000
URL:
https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=aa857a46
Add support for Building Docker Buildbot worker images
Signed-off-by: Magnus Granberg <zorry <AT> gentoo.org>
buildbot_gentoo_ci/db/projects.py | 1 +
buildbot_gentoo_ci/steps/nodes.py | 82 ++++++++++++++++++----------------
docker/GentooBuildbotWorker.Dockerfile | 14 ++++++
3 files changed, 58 insertions(+), 39 deletions(-)
diff --git a/buildbot_gentoo_ci/db/projects.py
b/buildbot_gentoo_ci/db/projects.py
index dc91ce1..936cd9d 100644
--- a/buildbot_gentoo_ci/db/projects.py
+++ b/buildbot_gentoo_ci/db/projects.py
@@ -220,6 +220,7 @@ class ProjectsConnectorComponent(base.DBConnectorComponent):
profile=row.profile,
profile_repository_uuid=row.profile_repository_uuid,
keyword_id=row.keyword_id,
+ image=row.image,
status=row.status,
auto=row.auto,
enabled=row.enabled,
diff --git a/buildbot_gentoo_ci/steps/nodes.py
b/buildbot_gentoo_ci/steps/nodes.py
index 37cf917..2a25562 100644
--- a/buildbot_gentoo_ci/steps/nodes.py
+++ b/buildbot_gentoo_ci/steps/nodes.py
@@ -42,7 +42,9 @@ class SetupPropertys(BuildStep):
self.setProperty('project_data', project_data, 'project_data')
#FIXME: set it in db node config
self.workerbase = yield os.path.join('/', 'srv', 'gentoo', 'stage4')
+ self.workerdest = yield os.path.join(self.workerbase,
self.getProperty('project_uuid'))
self.setProperty('workerbase', self.workerbase, 'workerbase')
+ self.setProperty('workerdest', self.workerdest, 'workerdest')
self.setProperty('stage3', 'image', 'stage3')
# we only support docker for now
self.setProperty('type', 'docker', 'type')
@@ -97,7 +99,7 @@ class SetupStage4Steps(BuildStep):
aftersteps_list.append(
steps.StringDownload(locale_conf_string + separator,
workerdest="locale.gen",
- workdir=workerdest_etc
+ workdir=self.getProperty("workerdest") + '/etc'
))
yield log.addStdout('File: ' + 'locale.gen' + '\n')
for line in locale_conf:
@@ -105,7 +107,7 @@ class SetupStage4Steps(BuildStep):
aftersteps_list.append(
steps.StringDownload('LANG="en_US.utf8"' + separator,
workerdest="locale.conf",
- workdir=workerdest_etc
+ workdir=self.getProperty("workerdest") + '/etc'
))
yield log.addStdout('Setting LANG to: ' + 'en_US.utf8' + '\n')
aftersteps_list.append(SetSystemdNspawnConf())
@@ -117,16 +119,13 @@ class SetupStage4Steps(BuildStep):
workdir=self.getProperty("workerbase")
))
# update timezone
- # install packages in world file config
- command_list = ['systemd-nspawn', '-D',
self.getProperty('project_uuid'), 'emerge']
- for package in package_list:
- command_list.append(package)
- aftersteps_list.append(steps.ShellCommand(
- flunkOnFailure=True,
- name='Install programs on the chroot',
- command=command_list,
- workdir=self.getProperty("workerbase")
- ))
+ # add the world file
+ package_list_string = separator.join(package_list)
+ aftersteps_list.append(
+ steps.StringDownload(package_list_string + separator,
+ workerdest="var/lib/portage/world",
+ workdir=self.getProperty("workerdest")
+ ))
# update container
aftersteps_list.append(steps.ShellCommand(
flunkOnFailure=True,
@@ -141,25 +140,6 @@ class SetupStage4Steps(BuildStep):
command=['systemd-nspawn', '-D',
self.getProperty('project_uuid'), 'emerge', 'buildbot-worker'],
workdir=self.getProperty("workerbase")
))
- #FIXME: move this to image build for chroot type part
- if self.getProperty("type") == 'chroot':
- # set hostname
- aftersteps_list.append(steps.StringDownload(
- self.getProperty("worker") + separator,
- workerdest="hostname",
- workdir=workerdest_etc
- ))
- yield log.addStdout('Setting hostname to: ' +
self.getProperty("worker") + '\n')
- # config buildbot-worker
- # get password from db if set else generate one in uuid
- worker_passwd = 'test1234'
- aftersteps_list.append(steps.ShellCommand(
- flunkOnFailure=True,
- SecretString=[worker_passwd, '<WorkerPassword>'],
- name='Install buildbot worker on the chroot',
- command=['systemd-nspawn', '-D',
self.getProperty('project_uuid'), 'buildbot-worker', 'create-worker',
'/var/lib/buildbot_worker', '192.168.1.5', self.getProperty("worker"),
worker_passwd],
- workdir=self.getProperty("workerbase")
- ))
if self.getProperty("type") == 'docker':
# copy docker_buildbot.tac to worker dir
buildbot_worker_config_file = yield
os.path.join(self.master.basedir, 'files', 'docker_buildbot_worker.tac')
@@ -168,13 +148,12 @@ class SetupStage4Steps(BuildStep):
name='Upload buildbot worker config to the stage4',
mastersrc=buildbot_worker_config_file,
workerdest='var/lib/buildbot_worker/buildbot.tac',
- workdir=workerdest
+ workdir=self.getProperty("workerdest")
))
# add info to the buildbot worker
worker_info_list = []
worker_info_list.append(self.getProperty('project_data')['name'])
worker_info_list.append(self.getProperty("stage3"))
- worker_info_list.append(self.getProperty("type"))
#FIXME: worker name of self.getProperty('workername') from
node table
worker_info_list.append('node1')
print(worker_info_list)
@@ -182,10 +161,9 @@ class SetupStage4Steps(BuildStep):
aftersteps_list.append(steps.StringDownload(
worker_info + separator,
workerdest='var/lib/buildbot_worker/info/host',
- workdir=workerdest
+ workdir=self.getProperty("workerdest")
))
- # if self.getProperty("type") == 'chroot' and 'systemd' in
self.getProperty('project_data')['image']:
- # set buildbot worker to run
+ #FIXME: add admin info
# depclean
aftersteps_list.append(steps.ShellCommand(
flunkOnFailure=True,
@@ -194,12 +172,18 @@ class SetupStage4Steps(BuildStep):
workdir=self.getProperty("workerbase")
))
# remove the gentoo repo
+ aftersteps_list.append(steps.ShellCommand(
+ flunkOnFailure=True,
+ name='Remove the repo dir',
+ command=['rm', '-R', self.getProperty('project_uuid') +
'/var/db/repos/gentoo'],
+ workdir=self.getProperty("workerbase")
+ ))
# compress it
aftersteps_list.append(steps.ShellCommand(
flunkOnFailure=True,
name='Compress the stage4',
- command=['tar', '-cf', '--numeric-owner',
self.getProperty('project_uuid') + '.tar', self.getProperty('project_uuid')],
- workdir=self.getProperty("workerbase")
+ command=['tar', '-cf', '../stage4-' +
self.getProperty('project_uuid') + '.tar', '.'],
+ workdir=self.getProperty("workerbase") + '/' +
self.getProperty('project_uuid')
))
# signing the stage4
# remove the dir
@@ -209,6 +193,23 @@ class SetupStage4Steps(BuildStep):
command=['rm', '-R', self.getProperty('project_uuid')],
workdir=self.getProperty("workerbase")
))
+ # build docker stage4 image and buildbot-worker image
+ # FIXME: Use the python docker api
+ # FIXME: add date tags
+ if self.getProperty("type") == 'docker':
+ aftersteps_list.append(steps.ShellCommand(
+ flunkOnFailure=True,
+ name='Build docker stage4 image',
+ command=['docker', 'import', 'stage4-' +
self.getProperty('project_uuid') + '.tar', 'stage4-' +
self.getProperty('project_uuid') + ':latest'],
+ workdir=self.getProperty("workerbase")
+ ))
+ # gentoo docker buildbot-worker image
+ aftersteps_list.append(steps.ShellCommand(
+ flunkOnFailure=True,
+ name='Build docker buildbot-worker image',
+ command=['docker', 'buildx', 'build', '--file',
'../docker/GentooBuildbotWorker.Docker', '--build-arg', 'PROJECTUUID=' +
self.getProperty('project_uuid'), '--tag', 'bb-worker-' +
self.getProperty('project_uuid') + ':latest', '.'],
+ workdir=self.getProperty("workerbase")
+ ))
if aftersteps_list != []:
yield self.build.addStepsAfterCurrentStep(aftersteps_list)
return SUCCESS
@@ -305,7 +306,10 @@ class SetSystemdNspawnConf(BuildStep):
nspawn_conf.append('[Files]')
nspawn_conf.append('TemporaryFileSystem=/run/lock')
# db node config portage cache bind
- nspawn_conf.append('Bind=/srv/gentoo/portage/' +
self.getProperty('project_uuid') + ':/var/cache/portage')
+ src_dir = '/srv/gentoo/portage/' + self.getProperty('project_uuid')
+ dest_dir = '/var/cache/portage'
+ nspawn_conf.append('Bind=' + src_dir + '/distfiles' + ':' + dest_dir +
'/distfiles')
+ nspawn_conf.append('Bind=' + src_dir + '/packages' + ':' + dest_dir +
'/packages')
nspawn_conf.append('[Exec]')
nspawn_conf.append('Capability=CAP_NET_ADMIN')
nspawn_conf.append('[Network]')
diff --git a/docker/GentooBuildbotWorker.Dockerfile
b/docker/GentooBuildbotWorker.Dockerfile
new file mode 100644
index 0000000..db5e398
--- /dev/null
+++ b/docker/GentooBuildbotWorker.Dockerfile
@@ -0,0 +1,14 @@
+# This Dockerfile creates a gentoo buildbot worker container image
+# from a gentoo project stage4 docker image.
+
+ARG PROJECTUUID
+
+FROM stage4-${PROJECTUUID}
+RUN echo "Building Gentoo Buildbot worker Container image for ${PROJECTUUID}" \
+ && ( sed -i -e 's/#rc_sys=""/rc_sys="docker"/g' etc/rc.conf 2>/dev/null ||
true ) \
+ && echo 'UTC' > etc/timezone \
+ && echo 'docker' >> /var/lib/buildbot_worker/info/host \
+ && echo 'bb-worker-${PROJECTUUID}:latest' >>
/var/lib/buildbot_worker/info/host
+WORKDIR /var/lib/buildbot_worker
+ENTRYPOINT ["/usr/bin/buildbot-worker"]
+CMD ["start", "--nodaemon"]