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 JARDIN_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/Jardin"
25 COURS_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/Cours"
26 DOCS_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Sites/Docs"
27 NORMALESUP_GIT_URL
= "gitolite@git.immae.eu:perso/Immae/Projets/Sites/Normalesup"
29 COURS_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/cours"
30 COURS_TARBALL_PATH
= "/var/lib/ftp/release.immae.eu/cours"
31 COURS_TARBALL_URL
= "https://release.immae.eu/cours"
32 BIP39_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/bip39"
33 HISTORY_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/history"
34 IMMAE_EU_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/blog"
35 DOCS_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/docs"
36 RECETTES_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/recettes"
37 JARDIN_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/jardin"
38 NORMALESUP_RELEASE_PATH
= "/var/lib/buildbot/outputs/immae/recherche"
39 GSMCELLS_RELEASE_PATH
= "/var/lib/ftp/release.immae.eu/gsm_cells"
40 GSMCELLS_RELEASE_URL
= "https://release.immae.eu/gsm_cells"
43 SECRETS_FILE
= os
.getcwd() + "/secrets"
44 LDAP_URL
= "ldaps://ldap.immae.eu:636"
45 LDAP_ADMIN_USER
= "cn=buildbot,ou=services,dc=immae,dc=eu"
46 LDAP_BASE
= "dc=immae,dc=eu"
47 LDAP_PATTERN
= "(uid=%(username)s)"
48 LDAP_GROUP_PATTERN
= "(&(memberOf=cn=groups,ou=immaeEu,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
49 TITLE_URL
= "https://www.immae.eu"
50 TITLE
= "Immae website"
53 c
["buildbotURL"] = E
.BUILDBOT_URL
54 c
["www"]["port"] = E
.SOCKET
56 worker_name
= "generic-worker-immae-eu"
57 c
['workers'].append(worker
.LocalWorker(worker_name
))
62 withoutbranch
.append(configure_gsm_cells(c
, worker_name
))
64 withbranch
.append(_configure("immae_eu", immae_eu_build_factory
, c
, worker_name
))
65 withbranch
.append(_configure("normalesup", normalesup_build_factory
, c
, worker_name
))
66 withbranch
.append(_configure("cours", cours_build_factory
, c
, worker_name
))
67 withbranch
.append(_configure("recettes", recettes_build_factory
, c
, worker_name
))
68 withbranch
.append(_configure("jardin", jardin_build_factory
, c
, worker_name
))
69 withbranch
.append(_configure("docs", docs_build_factory
, c
, worker_name
))
70 withbranch
.append(_configure("history", history_build_factory
, c
, worker_name
))
71 withbranch
.append(_configure("bip39", bip39_build_factory
, c
, worker_name
))
73 withbranch
.append(_configure_symfony("Chloe", c
, worker_name
,
74 "gitolite@git.immae.eu:perso/Immae/Sites/Chloe/New"))
75 withbranch
.append(_configure_symfony("Florian", c
, worker_name
,
76 "gitolite@git.immae.eu:perso/florian_telles/stabilo"))
77 withbranch
.append(configure_symfony_isabelle_aten(c
, worker_name
))
78 withbranch
.append(_configure_symfony("Ludivine", c
, worker_name
,
79 "gitolite@git.immae.eu:perso/Immae/Sites/Ludivine"))
80 withbranch
.append(_configure_symfony("Connexionswing", c
, worker_name
,
81 "gitolite@git.immae.eu:perso/Immae/Projets/Connexionswing"))
82 withbranch
.append(_configure_symfony("Piedsjaloux", c
, worker_name
,
83 "gitolite@git.immae.eu:Pieds_jaloux/NewSite"))
85 c
['schedulers'].append(force_scheduler("force_immae_eu", withbranch
))
86 c
['schedulers'].append(force_scheduler("force_no_branch_immae_eu", withoutbranch
, nobranch
=True))
88 configure_apprise_push(c
, E
.SECRETS_FILE
, all_builder_names(c
))
89 configure_xmpp_push(c
, E
.SECRETS_FILE
, all_builder_names(c
), E
.XMPP_RECIPIENTS
)
91 BRANCH_TO_SYMFONY_ENV
= {
106 BRANCH_TO_SERVICE_NAME
= {
108 "test": "phpfpm-chloe_new_integration",
109 #"master": "phpfpm-chloe_production",
112 "stabilo_dev": "phpfpm-florian_app",
115 "test": "phpfpm-isabelle_aten_integration",
116 "master": "phpfpm-isabelle_aten_production",
119 "test": "phpfpm-ludivine_integration",
120 "master": "phpfpm-ludivine_production",
123 "test": "phpfpm-connexionswing_integration",
124 "master": "phpfpm-connexionswing_production",
127 "test": "phpfpm-piedsjaloux_integration",
128 "master": "phpfpm-piedsjaloux_production",
132 BRANCH_TO_POST_STEP
= {
134 "master": "SYMFONY_ENV=prod php ./bin/console assetic:dump --env=prod --no-debug"
138 def need_follow_systemd(name
, step
):
139 return step
.getProperty("branch") in BRANCH_TO_SERVICE_NAME
.get(name
, {})
141 def need_post_step(name
, step
):
142 return step
.getProperty("branch") in BRANCH_TO_POST_STEP
.get(name
, {})
145 def get_post_step_command(props
, name
):
146 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
147 post_step
= BRANCH_TO_POST_STEP
.get(name
, {}).get(props
["branch"])
148 if post_step
is not None:
152 def get_parameters_file(props
, name
):
153 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
154 env
= BRANCH_TO_SYMFONY_ENV
.get(name
, {}).get(props
["branch"], "dev")
157 return E
.SECRETS_FILE
+ "/symfony_{}_{}_parameters.yml".format(name
, env
)
160 def get_composer_install_command(props
, name
):
161 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
162 env
= BRANCH_TO_SYMFONY_ENV
.get(name
, {}).get(props
["branch"], "dev")
166 return "SYMFONY_ENV={} composer install".format(env
) + (" --no-dev" if env
== "prod" else "")
169 def get_systemd_service_invocation_command(props
, name
):
170 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
171 service
= BRANCH_TO_SERVICE_NAME
.get(name
, {}).get(props
["branch"])
172 if service
is not None:
173 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
)
176 def follow_systemd_command(props
, name
, invocation_id
):
177 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
178 service
= BRANCH_TO_SERVICE_NAME
.get(name
, {}).get(props
["branch"])
179 if service
is not None:
180 return ["follow-systemd-unit", service
, util
.Property("service_invocation_id")]
182 def configure_gsm_cells(c
, worker_name
):
183 builder_name
= "GSMCells_build"
184 c
['schedulers'].append(schedulers
.Nightly(name
="GSMCells-weekly",
185 builderNames
=[builder_name
], dayOfWeek
=6, hour
=3))
186 c
['builders'].append(util
.BuilderConfig(name
=builder_name
, workernames
=[worker_name
], factory
=gsm_cells_build_factory()))
190 def _configure(name
, factory
, c
, worker_name
):
192 capitalized
= "BIP39"
194 capitalized
= "".join([n
.capitalize() for n
in name
.split('_')])
195 builder_name
= "{}_build".format(capitalized
)
197 c
['schedulers'].append(git_hook_scheduler(capitalized
, [builder_name
]))
198 c
['builders'].append(util
.BuilderConfig(name
=builder_name
, workernames
=[worker_name
], factory
=factory()))
202 def configure_symfony_isabelle_aten(c
, worker_name
):
203 return _configure_symfony("IsabelleAten", c
, worker_name
,
204 "gitolite@git.immae.eu:perso/Immae/Sites/Aten", parameters_path
=None,
205 other_steps
=lambda path_env
: [
206 NixShellCommand(name
="Install yarn",
207 logEnviron
=False, haltOnFailure
=True,
208 env
=path_env
, command
="yarn install"),
209 NixShellCommand(name
="Build frontend",
210 logEnviron
=False, haltOnFailure
=True,
211 env
=path_env
, command
="yarn run encore production")
215 def _configure_symfony(name
, c
, worker_name
, *args
, **kwargs
):
216 builder_name
= "Symfony_{}_build".format(name
)
218 c
['schedulers'].append(git_hook_scheduler("Symfony_{}".format(name
), [builder_name
]))
219 c
['builders'].append(util
.BuilderConfig(name
=builder_name
, workernames
=[worker_name
], factory
=symfony_project_factory(name
, *args
, **kwargs
)))
223 def history_build_factory():
225 "PATH": "/run/current-system/sw/bin"
227 factory
= util
.BuildFactory()
228 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.HISTORY_GIT_URL
,
229 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
230 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
231 factory
.addStep(NixShellCommand(name
="build website",
232 logEnviron
=False, haltOnFailure
=True,
233 env
=path_env
, command
="jekyll build"))
234 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.HISTORY_RELEASE_PATH
)))
235 factory
.addStep(steps
.DirectoryUpload(workersrc
="_site",
236 masterdest
=E
.HISTORY_RELEASE_PATH
,
237 url
="https://www.immae.eu/history"))
238 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.HISTORY_RELEASE_PATH
)))
242 def docs_build_factory():
244 "PATH": "/run/current-system/sw/bin"
246 factory
= util
.BuildFactory()
247 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.DOCS_GIT_URL
,
248 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
249 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
250 factory
.addStep(NixShellCommand(name
="build website",
251 logEnviron
=False, haltOnFailure
=True,
252 env
=path_env
, command
="make html"))
253 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.DOCS_RELEASE_PATH
)))
254 factory
.addStep(steps
.DirectoryUpload(workersrc
="_build/html",
255 masterdest
=E
.DOCS_RELEASE_PATH
,
256 url
="https://www.immae.eu/docs"))
257 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.DOCS_RELEASE_PATH
)))
261 def recettes_build_factory():
263 "PATH": "/run/current-system/sw/bin"
265 factory
= util
.BuildFactory()
266 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.RECETTES_GIT_URL
,
267 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
268 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
269 factory
.addStep(NixShellCommand(name
="build website",
270 logEnviron
=False, haltOnFailure
=True,
271 env
=path_env
, command
="jekyll build --trace --baseurl /recettes"))
272 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.RECETTES_RELEASE_PATH
)))
273 factory
.addStep(steps
.DirectoryUpload(workersrc
="_site",
274 masterdest
=E
.RECETTES_RELEASE_PATH
,
275 url
="https://www.immae.eu/recettes"))
276 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.RECETTES_RELEASE_PATH
)))
280 def jardin_build_factory():
282 "PATH": "/run/current-system/sw/bin"
284 factory
= util
.BuildFactory()
285 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.JARDIN_GIT_URL
,
286 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
287 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
288 factory
.addStep(NixShellCommand(name
="build website",
289 logEnviron
=False, haltOnFailure
=True,
290 env
=path_env
, command
="jekyll build --trace --baseurl /jardin"))
291 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.JARDIN_RELEASE_PATH
)))
292 factory
.addStep(steps
.DirectoryUpload(workersrc
="_site",
293 masterdest
=E
.JARDIN_RELEASE_PATH
,
294 url
="https://www.immae.eu/jardin"))
295 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.JARDIN_RELEASE_PATH
)))
299 def bip39_build_factory():
301 "PATH": "/run/current-system/sw/bin",
302 "NIX_PATH": "nixpkgs=channel:nixos-unstable",
304 factory
= util
.BuildFactory()
305 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.BIP39_GIT_URL
,
306 submodules
=True, mode
="full", method
="fresh"))
307 factory
.addStep(NixShellCommand(name
="build file", nixPackages
=["python3"],
308 logEnviron
=False, haltOnFailure
=True, env
=path_env
, command
="python compile.py"))
309 factory
.addStep(steps
.FileUpload(name
="upload file", workersrc
="bip39-standalone.html",
310 masterdest
=E
.BIP39_RELEASE_PATH
+ "/index.html",
311 url
="https://tools.immae.eu/BIP39", mode
=0o644))
312 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.BIP39_RELEASE_PATH
)))
316 def immae_eu_build_factory():
318 "PATH": "/run/current-system/sw/bin",
320 factory
= util
.BuildFactory()
321 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.IMMAE_EU_GIT_URL
,
322 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
323 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
324 factory
.addStep(NixShellCommand(name
="build website",
325 logEnviron
=False, haltOnFailure
=True, pure
=False,
326 env
=path_env
, command
="make html"))
327 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.IMMAE_EU_RELEASE_PATH
)))
328 factory
.addStep(steps
.DirectoryUpload(workersrc
="output",
329 masterdest
=E
.IMMAE_EU_RELEASE_PATH
,
330 url
="https://www.immae.eu"))
331 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.IMMAE_EU_RELEASE_PATH
)))
335 def cours_build_factory():
337 "PATH": "/run/current-system/sw/bin",
340 factory
= util
.BuildFactory()
341 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.COURS_GIT_URL
,
342 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
343 sshHostKey
=E
.SSH_HOST_KEY
, mode
="incremental"))
344 factory
.addStep(NixShellCommand(name
="build website",
345 logEnviron
=False, haltOnFailure
=True, pure
=True,
346 command
="make build", env
=path_env
))
347 factory
.addStep(NixShellCommand(name
="progress report",
348 logEnviron
=False, haltOnFailure
=True, pure
=True,
349 command
="make report", env
=path_env
))
350 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.COURS_RELEASE_PATH
)))
351 factory
.addStep(steps
.DirectoryUpload(workersrc
="build",
352 masterdest
=E
.COURS_RELEASE_PATH
,
353 url
="https://www.immae.eu/cours"))
354 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.COURS_RELEASE_PATH
)))
356 factory
.addStep(NixShellCommand(name
="build pdfs",
357 logEnviron
=False, haltOnFailure
=True, pure
=True,
358 command
="make pdfs", env
=path_env
))
360 package
= util
.Interpolate("cours_%(kw:clean_branch)s.tar.gz", clean_branch
=clean_branch
)
361 release_file
= "{0}/cours_%(kw:clean_branch)s.tar.gz"
362 package_dest
= util
.Interpolate(release_file
.format(E
.COURS_TARBALL_PATH
), clean_branch
=clean_branch
)
363 package_url
= util
.Interpolate(release_file
.format(E
.COURS_TARBALL_URL
), clean_branch
=clean_branch
)
364 factory
.addStep(steps
.ShellCommand(name
="build pdf tarball",
365 logEnviron
=False, haltOnFailure
=True,
366 command
=["tar", "-cvf", package
, "-C", "pdfs", "mp", "mpsi"], env
=path_env
))
367 factory
.addStep(steps
.FileUpload(name
="upload package", workersrc
=package
,
368 masterdest
=package_dest
, url
=package_url
, mode
=0o644))
372 def normalesup_build_factory():
374 "PATH": "/run/current-system/sw/bin",
375 "GIT_SSH_COMMAND": "ssh -i {0} -o UserKnownHostsFile={1}".format(E
.SSH_KEY_PATH
, E
.SSH_HOST_PATH
),
377 factory
= util
.BuildFactory()
378 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=E
.NORMALESUP_GIT_URL
,
379 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
380 sshHostKey
=E
.SSH_HOST_KEY
, mode
="incremental"))
381 factory
.addStep(NixShellCommand(name
="build website",
382 logEnviron
=False, haltOnFailure
=True, pure
=False,
383 command
="make build", env
=path_env
))
384 factory
.addStep(steps
.ShellCommand(name
="give read access to all files",
385 logEnviron
=False, haltOnFailure
=True,
386 command
="chmod -R a+rX build", env
=path_env
))
387 factory
.addStep(steps
.ShellCommand(name
="synchronize with phare",
388 logEnviron
=False, haltOnFailure
=True,
389 env
=path_env
, command
=[
390 "rsync", "-av", "--delete",
391 "-e", "ssh -i {0} -o UserKnownHostsFile={1}".format(E
.SSH_KEY_PATH
, E
.SSH_HOST_PATH
),
393 os
.environ
["BUILDBOT_NORMALESUP_HOST"]
395 factory
.addStep(steps
.MasterShellCommand(command
="rm -rf {}".format(E
.NORMALESUP_RELEASE_PATH
)))
396 factory
.addStep(steps
.DirectoryUpload(workersrc
="build", masterdest
=E
.NORMALESUP_RELEASE_PATH
,
397 url
="https://www.immae.eu/recherche"))
398 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.NORMALESUP_RELEASE_PATH
)))
402 def gsm_cells_build_factory():
404 "PATH": "/run/current-system/sw/bin",
405 "NIX_PATH": "nixpkgs=channel:nixos-unstable",
406 "IN_BUILDBOT": "yes",
410 Options +FollowSymLinks
414 for k
, v
in os
.environ
.items():
415 if k
.startswith("BUILDBOT_GSM_CELLS_"):
416 path_env
[k
[len("BUILDBOT_GSM_CELLS_"):]] = v
418 script
= os
.environ
["BUILDBOT_PROJECT_DIR"] + "/scripts/lacells_download"
419 factory
= util
.BuildFactory()
420 factory
.addStep(steps
.FileDownload(mastersrc
=script
, workerdest
="lacells_download", mode
=0o755))
421 factory
.addStep(NixShellCommand(name
="download files",
422 logEnviron
=False, haltOnFailure
=True, command
="./lacells_download",
423 nixPackages
=["sqlite", "wget", "gzip"], pure
=False, env
=path_env
))
424 factory
.addStep(steps
.ShellCommand(name
="give read access to all files",
425 logEnviron
=False, haltOnFailure
=True,
426 command
="chmod a+r lacells.db", env
=path_env
))
427 factory
.addStep(steps
.FileUpload(workersrc
="lacells.db",
428 masterdest
=(E
.GSMCELLS_RELEASE_PATH
+"/lacells.db"), url
=(E
.GSMCELLS_RELEASE_URL
+"/lacells.db")))
429 factory
.addStep(steps
.MasterShellCommand(command
="touch {}/.duplicity-ignore".format(E
.GSMCELLS_RELEASE_PATH
)))
430 factory
.addStep(steps
.MasterShellCommand(command
='echo "$HTACCESS" > {}/.htaccess'.format(E
.GSMCELLS_RELEASE_PATH
),
432 factory
.addStep(steps
.MasterShellCommand(command
="ln -sf lacells.db {}/lacells.db.new".format(E
.GSMCELLS_RELEASE_PATH
)))
433 factory
.addStep(steps
.MasterShellCommand(command
="chmod -R a+rX {}".format(E
.GSMCELLS_RELEASE_PATH
)))
437 def symfony_project_factory(name
, repourl
, parameters_path
="app/config/parameters.yml", other_steps
=lambda a
: []):
439 "PATH": os
.environ
["BUILDBOT_SYMFONY_MASTER_PATH"] + ":${PATH}"
442 "PATH": "/run/current-system/sw/bin"
445 for k
, v
in os
.environ
.items():
446 if k
.startswith("BUILDBOT_SYMFONY_{}_".format(name
)):
447 path_env
[k
[len("BUILDBOT_SYMFONY_{}_".format(name
)):]] = v
449 factory
= util
.BuildFactory()
450 factory
.addStep(steps
.Git(logEnviron
=False, repourl
=repourl
,
451 submodules
=True, sshPrivateKey
=open(E
.SSH_KEY_PATH
).read().rstrip(),
452 sshHostKey
=E
.SSH_HOST_KEY
, mode
="full", method
="fresh"))
453 if parameters_path
is not None:
454 factory
.addStep(steps
.FileDownload(mastersrc
=get_parameters_file
.withArgs(name
),
455 workerdest
=parameters_path
))
456 factory
.addStep(NixShellCommand(name
="build website",
457 logEnviron
=False, haltOnFailure
=True,
458 env
=path_env
, command
=get_composer_install_command
.withArgs(name
)))
459 if name
in BRANCH_TO_POST_STEP
:
460 factory
.addStep(NixShellCommand(name
="build website post",
461 logEnviron
=False, haltOnFailure
=True, doStepIf
=partial(need_post_step
, name
),
462 env
=path_env
, command
=get_post_step_command
.withArgs(name
)))
463 if parameters_path
is not None:
464 factory
.addStep(steps
.ShellCommand(name
="Remove parameters.yml",
465 logEnviron
=False, haltOnFailure
=True,
466 command
="rm -f {}".format(parameters_path
)))
467 for step
in other_steps(path_env
):
468 factory
.addStep(step
)
469 package
= util
.Interpolate("{}_%(kw:clean_branch)s.tar.gz".format(name
), clean_branch
=clean_branch
)
470 release_file
= "{0}/{1}/%(kw:clean_branch)s.tar.gz"
471 package_dest
= util
.Interpolate(release_file
.format("/var/lib/ftp/release.immae.eu/buildbot", name
), clean_branch
=clean_branch
)
472 # Tar doesn’t like creating the tarball in the same directory
473 factory
.addStep(steps
.ShellCommand(name
="Make a tarball 1/2",
474 logEnviron
=False, haltOnFailure
=True, env
=path_env
,
475 command
=["touch", package
]))
476 factory
.addStep(steps
.ShellCommand(name
="Make a tarball 2/2",
477 logEnviron
=False, haltOnFailure
=True, env
=path_env
,
478 command
=["tar", "--exclude", package
, "-czf", package
, "."]))
479 factory
.addStep(steps
.SetPropertyFromCommand(command
=get_systemd_service_invocation_command
.withArgs(name
),
480 property="service_invocation_id", doStepIf
=partial(need_follow_systemd
, name
)))
481 factory
.addStep(steps
.FileUpload(name
="upload package",
482 workersrc
=package
, masterdest
=package_dest
, mode
=0o644))
483 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
)))