Gentoo Archives: gentoo-commits

From: Magnus Granberg <zorry@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/tinderbox-cluster:master commit in: docker/, buildbot_gentoo_ci/steps/, buildbot_gentoo_ci/db/
Date: Wed, 01 Jun 2022 00:19:11
Message-Id: 1654042717.aa857a46bc666f780586ba62cebe7d6bb77fba2d.zorry@gentoo
1 commit: aa857a46bc666f780586ba62cebe7d6bb77fba2d
2 Author: Magnus Granberg <zorry <AT> gentoo <DOT> org>
3 AuthorDate: Wed Jun 1 00:18:37 2022 +0000
4 Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org>
5 CommitDate: Wed Jun 1 00:18:37 2022 +0000
6 URL: https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=aa857a46
7
8 Add support for Building Docker Buildbot worker images
9
10 Signed-off-by: Magnus Granberg <zorry <AT> gentoo.org>
11
12 buildbot_gentoo_ci/db/projects.py | 1 +
13 buildbot_gentoo_ci/steps/nodes.py | 82 ++++++++++++++++++----------------
14 docker/GentooBuildbotWorker.Dockerfile | 14 ++++++
15 3 files changed, 58 insertions(+), 39 deletions(-)
16
17 diff --git a/buildbot_gentoo_ci/db/projects.py b/buildbot_gentoo_ci/db/projects.py
18 index dc91ce1..936cd9d 100644
19 --- a/buildbot_gentoo_ci/db/projects.py
20 +++ b/buildbot_gentoo_ci/db/projects.py
21 @@ -220,6 +220,7 @@ class ProjectsConnectorComponent(base.DBConnectorComponent):
22 profile=row.profile,
23 profile_repository_uuid=row.profile_repository_uuid,
24 keyword_id=row.keyword_id,
25 + image=row.image,
26 status=row.status,
27 auto=row.auto,
28 enabled=row.enabled,
29
30 diff --git a/buildbot_gentoo_ci/steps/nodes.py b/buildbot_gentoo_ci/steps/nodes.py
31 index 37cf917..2a25562 100644
32 --- a/buildbot_gentoo_ci/steps/nodes.py
33 +++ b/buildbot_gentoo_ci/steps/nodes.py
34 @@ -42,7 +42,9 @@ class SetupPropertys(BuildStep):
35 self.setProperty('project_data', project_data, 'project_data')
36 #FIXME: set it in db node config
37 self.workerbase = yield os.path.join('/', 'srv', 'gentoo', 'stage4')
38 + self.workerdest = yield os.path.join(self.workerbase, self.getProperty('project_uuid'))
39 self.setProperty('workerbase', self.workerbase, 'workerbase')
40 + self.setProperty('workerdest', self.workerdest, 'workerdest')
41 self.setProperty('stage3', 'image', 'stage3')
42 # we only support docker for now
43 self.setProperty('type', 'docker', 'type')
44 @@ -97,7 +99,7 @@ class SetupStage4Steps(BuildStep):
45 aftersteps_list.append(
46 steps.StringDownload(locale_conf_string + separator,
47 workerdest="locale.gen",
48 - workdir=workerdest_etc
49 + workdir=self.getProperty("workerdest") + '/etc'
50 ))
51 yield log.addStdout('File: ' + 'locale.gen' + '\n')
52 for line in locale_conf:
53 @@ -105,7 +107,7 @@ class SetupStage4Steps(BuildStep):
54 aftersteps_list.append(
55 steps.StringDownload('LANG="en_US.utf8"' + separator,
56 workerdest="locale.conf",
57 - workdir=workerdest_etc
58 + workdir=self.getProperty("workerdest") + '/etc'
59 ))
60 yield log.addStdout('Setting LANG to: ' + 'en_US.utf8' + '\n')
61 aftersteps_list.append(SetSystemdNspawnConf())
62 @@ -117,16 +119,13 @@ class SetupStage4Steps(BuildStep):
63 workdir=self.getProperty("workerbase")
64 ))
65 # update timezone
66 - # install packages in world file config
67 - command_list = ['systemd-nspawn', '-D', self.getProperty('project_uuid'), 'emerge']
68 - for package in package_list:
69 - command_list.append(package)
70 - aftersteps_list.append(steps.ShellCommand(
71 - flunkOnFailure=True,
72 - name='Install programs on the chroot',
73 - command=command_list,
74 - workdir=self.getProperty("workerbase")
75 - ))
76 + # add the world file
77 + package_list_string = separator.join(package_list)
78 + aftersteps_list.append(
79 + steps.StringDownload(package_list_string + separator,
80 + workerdest="var/lib/portage/world",
81 + workdir=self.getProperty("workerdest")
82 + ))
83 # update container
84 aftersteps_list.append(steps.ShellCommand(
85 flunkOnFailure=True,
86 @@ -141,25 +140,6 @@ class SetupStage4Steps(BuildStep):
87 command=['systemd-nspawn', '-D', self.getProperty('project_uuid'), 'emerge', 'buildbot-worker'],
88 workdir=self.getProperty("workerbase")
89 ))
90 - #FIXME: move this to image build for chroot type part
91 - if self.getProperty("type") == 'chroot':
92 - # set hostname
93 - aftersteps_list.append(steps.StringDownload(
94 - self.getProperty("worker") + separator,
95 - workerdest="hostname",
96 - workdir=workerdest_etc
97 - ))
98 - yield log.addStdout('Setting hostname to: ' + self.getProperty("worker") + '\n')
99 - # config buildbot-worker
100 - # get password from db if set else generate one in uuid
101 - worker_passwd = 'test1234'
102 - aftersteps_list.append(steps.ShellCommand(
103 - flunkOnFailure=True,
104 - SecretString=[worker_passwd, '<WorkerPassword>'],
105 - name='Install buildbot worker on the chroot',
106 - 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],
107 - workdir=self.getProperty("workerbase")
108 - ))
109 if self.getProperty("type") == 'docker':
110 # copy docker_buildbot.tac to worker dir
111 buildbot_worker_config_file = yield os.path.join(self.master.basedir, 'files', 'docker_buildbot_worker.tac')
112 @@ -168,13 +148,12 @@ class SetupStage4Steps(BuildStep):
113 name='Upload buildbot worker config to the stage4',
114 mastersrc=buildbot_worker_config_file,
115 workerdest='var/lib/buildbot_worker/buildbot.tac',
116 - workdir=workerdest
117 + workdir=self.getProperty("workerdest")
118 ))
119 # add info to the buildbot worker
120 worker_info_list = []
121 worker_info_list.append(self.getProperty('project_data')['name'])
122 worker_info_list.append(self.getProperty("stage3"))
123 - worker_info_list.append(self.getProperty("type"))
124 #FIXME: worker name of self.getProperty('workername') from node table
125 worker_info_list.append('node1')
126 print(worker_info_list)
127 @@ -182,10 +161,9 @@ class SetupStage4Steps(BuildStep):
128 aftersteps_list.append(steps.StringDownload(
129 worker_info + separator,
130 workerdest='var/lib/buildbot_worker/info/host',
131 - workdir=workerdest
132 + workdir=self.getProperty("workerdest")
133 ))
134 - # if self.getProperty("type") == 'chroot' and 'systemd' in self.getProperty('project_data')['image']:
135 - # set buildbot worker to run
136 + #FIXME: add admin info
137 # depclean
138 aftersteps_list.append(steps.ShellCommand(
139 flunkOnFailure=True,
140 @@ -194,12 +172,18 @@ class SetupStage4Steps(BuildStep):
141 workdir=self.getProperty("workerbase")
142 ))
143 # remove the gentoo repo
144 + aftersteps_list.append(steps.ShellCommand(
145 + flunkOnFailure=True,
146 + name='Remove the repo dir',
147 + command=['rm', '-R', self.getProperty('project_uuid') + '/var/db/repos/gentoo'],
148 + workdir=self.getProperty("workerbase")
149 + ))
150 # compress it
151 aftersteps_list.append(steps.ShellCommand(
152 flunkOnFailure=True,
153 name='Compress the stage4',
154 - command=['tar', '-cf', '--numeric-owner', self.getProperty('project_uuid') + '.tar', self.getProperty('project_uuid')],
155 - workdir=self.getProperty("workerbase")
156 + command=['tar', '-cf', '../stage4-' + self.getProperty('project_uuid') + '.tar', '.'],
157 + workdir=self.getProperty("workerbase") + '/' + self.getProperty('project_uuid')
158 ))
159 # signing the stage4
160 # remove the dir
161 @@ -209,6 +193,23 @@ class SetupStage4Steps(BuildStep):
162 command=['rm', '-R', self.getProperty('project_uuid')],
163 workdir=self.getProperty("workerbase")
164 ))
165 + # build docker stage4 image and buildbot-worker image
166 + # FIXME: Use the python docker api
167 + # FIXME: add date tags
168 + if self.getProperty("type") == 'docker':
169 + aftersteps_list.append(steps.ShellCommand(
170 + flunkOnFailure=True,
171 + name='Build docker stage4 image',
172 + command=['docker', 'import', 'stage4-' + self.getProperty('project_uuid') + '.tar', 'stage4-' + self.getProperty('project_uuid') + ':latest'],
173 + workdir=self.getProperty("workerbase")
174 + ))
175 + # gentoo docker buildbot-worker image
176 + aftersteps_list.append(steps.ShellCommand(
177 + flunkOnFailure=True,
178 + name='Build docker buildbot-worker image',
179 + command=['docker', 'buildx', 'build', '--file', '../docker/GentooBuildbotWorker.Docker', '--build-arg', 'PROJECTUUID=' + self.getProperty('project_uuid'), '--tag', 'bb-worker-' + self.getProperty('project_uuid') + ':latest', '.'],
180 + workdir=self.getProperty("workerbase")
181 + ))
182 if aftersteps_list != []:
183 yield self.build.addStepsAfterCurrentStep(aftersteps_list)
184 return SUCCESS
185 @@ -305,7 +306,10 @@ class SetSystemdNspawnConf(BuildStep):
186 nspawn_conf.append('[Files]')
187 nspawn_conf.append('TemporaryFileSystem=/run/lock')
188 # db node config portage cache bind
189 - nspawn_conf.append('Bind=/srv/gentoo/portage/' + self.getProperty('project_uuid') + ':/var/cache/portage')
190 + src_dir = '/srv/gentoo/portage/' + self.getProperty('project_uuid')
191 + dest_dir = '/var/cache/portage'
192 + nspawn_conf.append('Bind=' + src_dir + '/distfiles' + ':' + dest_dir + '/distfiles')
193 + nspawn_conf.append('Bind=' + src_dir + '/packages' + ':' + dest_dir + '/packages')
194 nspawn_conf.append('[Exec]')
195 nspawn_conf.append('Capability=CAP_NET_ADMIN')
196 nspawn_conf.append('[Network]')
197
198 diff --git a/docker/GentooBuildbotWorker.Dockerfile b/docker/GentooBuildbotWorker.Dockerfile
199 new file mode 100644
200 index 0000000..db5e398
201 --- /dev/null
202 +++ b/docker/GentooBuildbotWorker.Dockerfile
203 @@ -0,0 +1,14 @@
204 +# This Dockerfile creates a gentoo buildbot worker container image
205 +# from a gentoo project stage4 docker image.
206 +
207 +ARG PROJECTUUID
208 +
209 +FROM stage4-${PROJECTUUID}
210 +RUN echo "Building Gentoo Buildbot worker Container image for ${PROJECTUUID}" \
211 + && ( sed -i -e 's/#rc_sys=""/rc_sys="docker"/g' etc/rc.conf 2>/dev/null || true ) \
212 + && echo 'UTC' > etc/timezone \
213 + && echo 'docker' >> /var/lib/buildbot_worker/info/host \
214 + && echo 'bb-worker-${PROJECTUUID}:latest' >> /var/lib/buildbot_worker/info/host
215 +WORKDIR /var/lib/buildbot_worker
216 +ENTRYPOINT ["/usr/bin/buildbot-worker"]
217 +CMD ["start", "--nodaemon"]