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