1 from buildbot
.plugins
import *
2 from buildbot_common
.build_helpers
import *
4 from buildbot
.util
import bytes2unicode
6 from functools
import partial
8 __all__
= [ "configure", "E" ]
12 BUILDBOT_URL
= "https://git.immae.eu/buildbot/{}/".format(PROJECT
)
13 SOCKET
= "unix:/run/buildbot/{}.sock".format(PROJECT
)
14 PB_SOCKET
= "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT
)
15 SSH_KEY_PATH
= "/var/lib/buildbot/buildbot_key"
16 SSH_HOST_PATH
= "/var/lib/buildbot/buildbot_hosts"
17 SSH_HOST_KEY
= "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
18 XMPP_RECIPIENTS
= os
.environ
["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
20 BIP39_GIT_URL
= "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/BIP39.git"
21 IMMAE_EU_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/Blog"
22 HISTORY_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/History"
23 RECETTES_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/Recettes"
24 COURS_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/Cours"
25 DOCS_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/Docs"
26 NORMALESUP_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Projets/Sites/Normalesup"
28 COURS_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/cours"
29 COURS_TARBALL_PATH
= "/var/lib/ftp/release.immae.eu/cours"
30 COURS_TARBALL_URL
= "https://release.immae.eu/cours"
31 BIP39_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/bip39"
32 HISTORY_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/history"
33 IMMAE_EU_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/blog"
34 DOCS_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/docs"
35 RECETTES_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/recettes"
36 NORMALESUP_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/recherche"
37 GSMCELLS_RELEASE_PATH
= "/var/lib/ftp/release.immae.eu/gsm_cells"
38 GSMCELLS_RELEASE_URL
= "https://release.immae.eu/gsm_cells"
41 SECRETS_FILE
= os
.getcwd() + "/secrets"
42 LDAP_URL
= "ldaps://ldap.immae.eu:636"
43 LDAP_ADMIN_USER
= "cn=buildbot,ou=services,dc=immae,dc=eu"
44 LDAP_BASE
= "dc=immae,dc=eu"
45 LDAP_PATTERN
= "(uid=%(username)s)"
46 LDAP_GROUP_PATTERN
= "(&(memberOf=cn=groups,ou=immaeEu,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
47 TITLE_URL
= "https://www.immae.eu"
48 TITLE
= "Immae website"
51 c
["buildbotURL"] = E
.BUILDBOT_URL
52 c
["www"]["port"] = E
.SOCKET
54 worker_name
= "generic-worker-immae-eu"
55 c
['workers'].append(worker
.LocalWorker(worker_name
))
60 withoutbranch
.append(configure_gsm_cells(c
, worker_name
))
62 withbranch
.append(_configure("immae_eu", immae_eu_build_factory
, c
, worker_name
))
63 withbranch
.append(_configure("normalesup", normalesup_build_factory
, c
, worker_name
))
64 withbranch
.append(_configure("cours", cours_build_factory
, c
, worker_name
))
65 withbranch
.append(_configure("recettes", recettes_build_factory
, c
, worker_name
))
66 withbranch
.append(_configure("docs", docs_build_factory
, c
, worker_name
))
67 withbranch
.append(_configure("history", history_build_factory
, c
, worker_name
))
68 withbranch
.append(_configure("bip39", bip39_build_factory
, c
, worker_name
))
70 withbranch
.append(_configure_symfony("Chloe", c
, worker_name
,
71 "gitolite@git.immae.eu:perso/Immae/Sites/Chloe/New"))
72 withbranch
.append(_configure_symfony("Florian", c
, worker_name
,
73 "gitolite@git.immae.eu:perso/florian_telles/stabilo"))
74 withbranch
.append(configure_symfony_isabelle_aten(c
, worker_name
))
75 withbranch
.append(_configure_symfony("Ludivine", c
, worker_name
,
76 "gitolite@git.immae.eu:perso/Immae/Sites/Ludivine"))
77 withbranch
.append(_configure_symfony("Connexionswing", c
, worker_name
,
78 "gitolite@git.immae.eu:perso/Immae/Projets/Connexionswing"))
79 withbranch
.append(_configure_symfony("Piedsjaloux", c
, worker_name
,
80 "gitolite@git.immae.eu:Pieds_jaloux/NewSite"))
82 c
['schedulers'].append(force_scheduler("force_immae_eu", withbranch
))
83 c
['schedulers'].append(force_scheduler("force_no_branch_immae_eu", withoutbranch
, nobranch
=True))
85 configure_apprise_push(c
, E
.SECRETS_FILE
, all_builder_names(c
))
86 configure_xmpp_push(c
, E
.SECRETS_FILE
, all_builder_names(c
), E
.XMPP_RECIPIENTS
)
88 BRANCH_TO_SYMFONY_ENV
= {
103 BRANCH_TO_SERVICE_NAME
= {
105 "test": "phpfpm-chloe_new_integration",
106 #"master": "phpfpm-chloe_production",
109 "stabilo_dev": "phpfpm-florian_app",
112 "test": "phpfpm-isabelle_aten_integration",
113 "master": "phpfpm-isabelle_aten_production",
116 "test": "phpfpm-ludivine_integration",
117 "master": "phpfpm-ludivine_production",
120 "test": "phpfpm-connexionswing_integration",
121 "master": "phpfpm-connexionswing_production",
124 "test": "phpfpm-piedsjaloux_integration",
125 "master": "phpfpm-piedsjaloux_production",
129 BRANCH_TO_POST_STEP
= {
131 "master": "SYMFONY_ENV=prod php ./bin/console assetic:dump --env=prod --no-debug"
135 def need_follow_systemd(name
, step
):
136 return step
.getProperty("branch") in BRANCH_TO_SERVICE_NAME
.get(name
, {})
138 def need_post_step(name
, step
):
139 return step
.getProperty("branch") in BRANCH_TO_POST_STEP
.get(name
, {})
142 def get_post_step_command(props
, name
):
143 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
144 post_step
= BRANCH_TO_POST_STEP
.get(name
, {}).get(props
["branch"])
145 if post_step
is not None:
149 def get_parameters_file(props
, name
):
150 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
151 env
= BRANCH_TO_SYMFONY_ENV
.get(name
, {}).get(props
["branch"], "dev")
154 return E
.SECRETS_FILE
+ "/symfony_{}_{}_parameters.yml".format(name
, env
)
157 def get_composer_install_command(props
, name
):
158 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
159 env
= BRANCH_TO_SYMFONY_ENV
.get(name
, {}).get(props
["branch"], "dev")
163 return "SYMFONY_ENV={} composer install".format(env
) + (" --no-dev" if env
== "prod" else "")
166 def get_systemd_service_invocation_command(props
, name
):
167 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
168 service
= BRANCH_TO_SERVICE_NAME
.get(name
, {}).get(props
["branch"])
169 if service
is not None:
170 return "ssh -o UserKnownHostsFile={0} -i {1} buildbot@eldiron systemctl show -p InvocationID --value {2}.service".format(E
.SSH_HOST_PATH
, E
.SSH_KEY_PATH
, service
)
173 def follow_systemd_command(props
, name
, invocation_id
):
174 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
175 service
= BRANCH_TO_SERVICE_NAME
.get(name
, {}).get(props
["branch"])
176 if service
is not None:
177 return ["follow-systemd-unit", service
, util
.Property("service_invocation_id")]
179 def configure_gsm_cells(c
, worker_name
):
180 builder_name
= "GSMCells_build"
181 c
['schedulers'].append(schedulers
.Nightly(name
="GSMCells-weekly",
182 builderNames
=[builder_name
], dayOfWeek
=6, hour
=3))
183 c
['builders'].append(util
.BuilderConfig(name
=builder_name
, workernames
=[worker_name
], factory
=gsm_cells_build_factory()))
187 def _configure(name
, factory
, c
, worker_name
):
189 capitalized
= "BIP39"
191 capitalized
= "".join([n
.capitalize() for n
in name
.split('_')])
192 builder_name
= "{}_build".format(capitalized
)
194 c
['schedulers'].append(git_hook_scheduler(capitalized
, [builder_name
]))
195 c
['builders'].append(util
.BuilderConfig(name
=builder_name
, workernames
=[worker_name
], factory
=factory()))
199 def configure_symfony_isabelle_aten(c
, worker_name
):
200 return _configure_symfony("IsabelleAten", c
, worker_name
,
201 "gitolite@git.immae.eu:perso/Immae/Sites/Aten", parameters_path
=None,
202 other_steps
=lambda path_env
: [
203 NixShellCommand(name
="Install yarn",
204 logEnviron
=False, haltOnFailure
=True,
205 env
=path_env
, command
="yarn install"),
206 NixShellCommand(name
="Build frontend",
207 logEnviron
=False, haltOnFailure
=True,
208 env
=path_env
, command
="yarn run encore production")
212 def _configure_symfony(name
, c
, worker_name
, *args
, **kwargs
):
213 builder_name
= "Symfony_{}_build".format(name
)
215 c
['schedulers'].append(git_hook_scheduler("Symfony_{}".format(name
), [builder_name
]))
216 c
['builders'].append(util
.BuilderConfig(name
=builder_name
, workernames
=[worker_name
], factory
=symfony_project_factory(name
, *args
, **kwargs
)))
220 def history_build_factory():
222 "PATH": "/run/current-system/sw/bin"
224 factory
= util
.BuildFactory()
225 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.HISTORY_GIT_URL
,
226 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
227 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
228 factory
.addStep(NixShellCommand(name
="build website",
229 logEnviron
=False, haltOnFailure
=True,
230 env
=path_env
, command
="jekyll build"))
231 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.HISTORY_RELEASE_PATH
)))
232 factory
.addStep(steps
.DirectoryUpload(workersrc
="_site",
233 masterdest
=E
.HISTORY_RELEASE_PATH
,
234 url
="https://www.immae.eu/history"))
235 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.HISTORY_RELEASE_PATH
)))
239 def docs_build_factory():
241 "PATH": "/run/current-system/sw/bin"
243 factory
= util
.BuildFactory()
244 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.DOCS_GIT_URL
,
245 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
246 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
247 factory
.addStep(NixShellCommand(name
="build website",
248 logEnviron
=False, haltOnFailure
=True,
249 env
=path_env
, command
="make html"))
250 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.DOCS_RELEASE_PATH
)))
251 factory
.addStep(steps
.DirectoryUpload(workersrc
="_build/html",
252 masterdest
=E
.DOCS_RELEASE_PATH
,
253 url
="https://www.immae.eu/docs"))
254 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.DOCS_RELEASE_PATH
)))
258 def recettes_build_factory():
260 "PATH": "/run/current-system/sw/bin"
262 factory
= util
.BuildFactory()
263 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.RECETTES_GIT_URL
,
264 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
265 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
266 factory
.addStep(NixShellCommand(name
="build website",
267 logEnviron
=False, haltOnFailure
=True,
268 env
=path_env
, command
="jekyll build --trace --baseurl /recettes"))
269 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.RECETTES_RELEASE_PATH
)))
270 factory
.addStep(steps
.DirectoryUpload(workersrc
="_site",
271 masterdest
=E
.RECETTES_RELEASE_PATH
,
272 url
="https://www.immae.eu/recettes"))
273 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.RECETTES_RELEASE_PATH
)))
277 def bip39_build_factory():
279 "PATH": "/run/current-system/sw/bin",
280 "NIX_PATH": "nixpkgs=channel:nixos-unstable",
282 factory
= util
.BuildFactory()
283 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.BIP39_GIT_URL
,
284 submodules
=True, mode
="full", method
="fresh"))
285 factory
.addStep(NixShellCommand(name
="build file", nixPackages
=["python3"],
286 logEnviron
=False, haltOnFailure
=True, env
=path_env
, command
="python compile.py"))
287 factory
.addStep(steps
.FileUpload(name
="upload file", workersrc
="bip39-standalone.html",
288 masterdest
=E
.BIP39_RELEASE_PATH
+ "/index.html",
289 url
="https://tools.immae.eu/BIP39", mode
=0o644))
290 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.BIP39_RELEASE_PATH
)))
294 def immae_eu_build_factory():
296 "PATH": "/run/current-system/sw/bin",
298 factory
= util
.BuildFactory()
299 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.IMMAE_EU_GIT_URL
,
300 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
301 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
302 factory
.addStep(NixShellCommand(name
="build website",
303 logEnviron
=False, haltOnFailure
=True, pure
=False,
304 env
=path_env
, command
="make html"))
305 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.IMMAE_EU_RELEASE_PATH
)))
306 factory
.addStep(steps
.DirectoryUpload(workersrc
="output",
307 masterdest
=E
.IMMAE_EU_RELEASE_PATH
,
308 url
="https://www.immae.eu"))
309 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.IMMAE_EU_RELEASE_PATH
)))
313 def cours_build_factory():
315 "PATH": "/run/current-system/sw/bin",
318 factory
= util
.BuildFactory()
319 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.COURS_GIT_URL
,
320 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
321 sshHostKey
=E
.SSH_HOST_KEY
, mode
="incremental"))
322 factory
.addStep(NixShellCommand(name
="build website",
323 logEnviron
=False, haltOnFailure
=True, pure
=True,
324 command
="make build", env
=path_env
))
325 factory
.addStep(NixShellCommand(name
="progress report",
326 logEnviron
=False, haltOnFailure
=True, pure
=True,
327 command
="make report", env
=path_env
))
328 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.COURS_RELEASE_PATH
)))
329 factory
.addStep(steps
.DirectoryUpload(workersrc
="build",
330 masterdest
=E
.COURS_RELEASE_PATH
,
331 url
="https://www.immae.eu/cours"))
332 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.COURS_RELEASE_PATH
)))
334 factory
.addStep(NixShellCommand(name
="build pdfs",
335 logEnviron
=False, haltOnFailure
=True, pure
=True,
336 command
="make pdfs", env
=path_env
))
338 package
= util
.Interpolate("cours_%(kw:clean_branch)s.tar.gz", clean_branch
=clean_branch
)
339 release_file
= "{0}/cours_%(kw:clean_branch)s.tar.gz"
340 package_dest
= util
.Interpolate(release_file
.format(E
.COURS_TARBALL_PATH
), clean_branch
=clean_branch
)
341 package_url
= util
.Interpolate(release_file
.format(E
.COURS_TARBALL_URL
), clean_branch
=clean_branch
)
342 factory
.addStep(steps
.ShellCommand(name
="build pdf tarball",
343 logEnviron
=False, haltOnFailure
=True,
344 command
=["tar", "-cvf", package
, "-C", "pdfs", "mp", "mpsi"], env
=path_env
))
345 factory
.addStep(steps
.FileUpload(name
="upload package", workersrc
=package
,
346 masterdest
=package_dest
, url
=package_url
, mode
=0o644))
350 def normalesup_build_factory():
352 "PATH": "/run/current-system/sw/bin",
353 "GIT_SSH_COMMAND": "ssh -i {0} -o UserKnownHostsFile={1}".format(E
.SSH_KEY_PATH
, E
.SSH_HOST_PATH
),
355 factory
= util
.BuildFactory()
356 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.NORMALESUP_GIT_URL
,
357 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
358 sshHostKey
=E
.SSH_HOST_KEY
, mode
="incremental"))
359 factory
.addStep(NixShellCommand(name
="build website",
360 logEnviron
=False, haltOnFailure
=True, pure
=False,
361 command
="make build", env
=path_env
))
362 factory
.addStep(steps
.ShellCommand(name
="give read access to all files",
363 logEnviron
=False, haltOnFailure
=True,
364 command
="chmod -R a+rX build", env
=path_env
))
365 factory
.addStep(steps
.ShellCommand(name
="synchronize with phare",
366 logEnviron
=False, haltOnFailure
=True,
367 env
=path_env
, command
=[
368 "rsync", "-av", "--delete",
369 "-e", "ssh -i {0} -o UserKnownHostsFile={1}".format(E
.SSH_KEY_PATH
, E
.SSH_HOST_PATH
),
371 os
.environ
["BUILDBOT_NORMALESUP_HOST"]
373 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.NORMALESUP_RELEASE_PATH
)))
374 factory
.addStep(steps
.DirectoryUpload(workersrc
="build", masterdest
=E
.NORMALESUP_RELEASE_PATH
,
375 url
="https://www.immae.eu/recherche"))
376 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.NORMALESUP_RELEASE_PATH
)))
380 def gsm_cells_build_factory():
382 "PATH": "/run/current-system/sw/bin",
383 "NIX_PATH": "nixpkgs=channel:nixos-unstable",
384 "IN_BUILDBOT": "yes",
388 Options +FollowSymLinks
392 for k
, v
in os
.environ
.items():
393 if k
.startswith("BUILDBOT_GSM_CELLS_"):
394 path_env
[k
[len("BUILDBOT_GSM_CELLS_"):]] = v
396 script
= os
.environ
["BUILDBOT_PROJECT_DIR"] + "/scripts/lacells_download"
397 factory
= util
.BuildFactory()
398 factory
.addStep(steps
.FileDownload(mastersrc
=script
, workerdest
="lacells_download", mode
=0o755))
399 factory
.addStep(NixShellCommand(name
="download files",
400 logEnviron
=False, haltOnFailure
=True, command
="./lacells_download",
401 nixPackages
=["sqlite", "wget", "gzip"], pure
=False, env
=path_env
))
402 factory
.addStep(steps
.ShellCommand(name
="give read access to all files",
403 logEnviron
=False, haltOnFailure
=True,
404 command
="chmod a+r lacells.db", env
=path_env
))
405 factory
.addStep(steps
.FileUpload(workersrc
="lacells.db",
406 masterdest
=(E
.GSMCELLS_RELEASE_PATH
+"/lacells.db"), url
=(E
.GSMCELLS_RELEASE_URL
+"/lacells.db")))
407 factory
.addStep(steps
.MasterShellCommand(command
="touch {}/.duplicity-ignore".format(E
.GSMCELLS_RELEASE_PATH
)))
408 factory
.addStep(steps
.MasterShellCommand(command
='echo "$HTACCESS" > {}/.htaccess'.format(E
.GSMCELLS_RELEASE_PATH
),
410 factory
.addStep(steps
.MasterShellCommand(command
="ln -sf lacells.db {}/lacells.db.new".format(E
.GSMCELLS_RELEASE_PATH
)))
411 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.GSMCELLS_RELEASE_PATH
)))
415 def symfony_project_factory(name
, repourl
, parameters_path
="app/config/parameters.yml", other_steps
=lambda a
: []):
417 "PATH": os
.environ
["BUILDBOT_SYMFONY_MASTER_PATH"] + ":${PATH}"
420 "PATH": "/run/current-system/sw/bin"
423 for k
, v
in os
.environ
.items():
424 if k
.startswith("BUILDBOT_SYMFONY_{}_".format(name
)):
425 path_env
[k
[len("BUILDBOT_SYMFONY_{}_".format(name
)):]] = v
427 factory
= util
.BuildFactory()
428 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=repourl
,
429 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
430 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
431 if parameters_path
is not None:
432 factory
.addStep(steps
.FileDownload(mastersrc
=get_parameters_file
.withArgs(name
),
433 workerdest
=parameters_path
))
434 factory
.addStep(NixShellCommand(name
="build website",
435 logEnviron
=False, haltOnFailure
=True,
436 env
=path_env
, command
=get_composer_install_command
.withArgs(name
)))
437 if name
in BRANCH_TO_POST_STEP
:
438 factory
.addStep(NixShellCommand(name
="build website post",
439 logEnviron
=False, haltOnFailure
=True, doStepIf
=partial(need_post_step
, name
),
440 env
=path_env
, command
=get_post_step_command
.withArgs(name
)))
441 if parameters_path
is not None:
442 factory
.addStep(steps
.ShellCommand(name
="Remove parameters.yml",
443 logEnviron
=False, haltOnFailure
=True,
444 command
="rm -f {}".format(parameters_path
)))
445 for step
in other_steps(path_env
):
446 factory
.addStep(step
)
447 package
= util
.Interpolate("{}_%(kw:clean_branch)s.tar.gz".format(name
), clean_branch
=clean_branch
)
448 release_file
= "{0}/{1}/%(kw:clean_branch)s.tar.gz"
449 package_dest
= util
.Interpolate(release_file
.format("/var/lib/ftp/release.immae.eu/buildbot", name
), clean_branch
=clean_branch
)
450 # Tar doesn’t like creating the tarball in the same directory
451 factory
.addStep(steps
.ShellCommand(name
="Make a tarball 1/2",
452 logEnviron
=False, haltOnFailure
=True, env
=path_env
,
453 command
=["touch", package
]))
454 factory
.addStep(steps
.ShellCommand(name
="Make a tarball 2/2",
455 logEnviron
=False, haltOnFailure
=True, env
=path_env
,
456 command
=["tar", "--exclude", package
, "-czf", package
, "."]))
457 factory
.addStep(steps
.SetPropertyFromCommand(command
=get_systemd_service_invocation_command
.withArgs(name
),
458 property="service_invocation_id", doStepIf
=partial(need_follow_systemd
, name
)))
459 factory
.addStep(steps
.FileUpload(name
="upload package",
460 workersrc
=package
, masterdest
=package_dest
, mode
=0o644))
461 factory
.addStep(steps
.MasterShellCommand(command
=follow_systemd_command
.withArgs(name
, util
.Property("service_invocation_id")), env
=master_path_env
, logEnviron
=False, doStepIf
=partial(need_follow_systemd
, name
)))