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"]

Reply via email to