]>
git.immae.eu Git - perso/Immae/Config/Nix.git/blob - nixops/modules/buildbot/common/build_helpers.py
1 from buildbot
.plugins
import util
, steps
, schedulers
2 from buildbot_buildslist
import BuildsList
5 "force_scheduler", "deploy_scheduler", "hook_scheduler",
6 "clean_branch", "package_and_upload", "SlackStatusPush"
11 def clean_branch(props
):
12 if props
.hasProperty("branch") and len(props
["branch"]) > 0:
13 return props
["branch"].replace("/", "_")
17 def package_and_upload(package
, package_dest
, package_url
):
19 steps
.ShellCommand(name
="build package",
20 logEnviron
=False, haltOnFailure
=True, workdir
="source",
21 command
=["git", "archive", "HEAD", "-o", package
]),
23 steps
.FileUpload(name
="upload package", workersrc
=package
,
24 workdir
="source", masterdest
=package_dest
,
25 url
=package_url
, mode
=0o644),
27 steps
.ShellCommand(name
="cleanup package", logEnviron
=False,
28 haltOnFailure
=True, workdir
="source", alwaysRun
=True,
29 command
=["rm", "-f", package
]),
33 def force_scheduler(name
, builders
):
34 return schedulers
.ForceScheduler(name
=name
,
35 label
="Force build", buttonName
="Force build",
36 reason
=util
.StringParameter(name
="reason", label
="Reason", default
="Force build"),
38 util
.CodebaseParameter("",
39 branch
=util
.StringParameter(
40 name
="branch", label
="Git reference (tag, branch)", required
=True),
41 revision
=util
.FixedParameter(name
="revision", default
=""),
42 repository
=util
.FixedParameter(name
="repository", default
=""),
43 project
=util
.FixedParameter(name
="project", default
=""),
46 username
=util
.FixedParameter(name
="username", default
="Web button"),
47 builderNames
=builders
)
49 def deploy_scheduler(name
, builders
):
50 return schedulers
.ForceScheduler(name
=name
,
51 builderNames
=builders
,
52 label
="Deploy built package", buttonName
="Deploy",
53 username
=util
.FixedParameter(name
="username", default
="Web button"),
55 util
.CodebaseParameter(codebase
="",
56 branch
=util
.FixedParameter(name
="branch", default
=""),
57 revision
=util
.FixedParameter(name
="revision", default
=""),
58 repository
=util
.FixedParameter(name
="repository", default
=""),
59 project
=util
.FixedParameter(name
="project", default
=""))],
60 reason
=util
.FixedParameter(name
="reason", default
="Deploy"),
62 util
.ChoiceStringParameter(label
="Environment",
63 name
="environment", default
="integration",
64 choices
=["integration", "production"]),
65 BuildsList(label
="Build to deploy", name
="build"),
69 def hook_scheduler(project
, timer
=10):
70 return schedulers
.AnyBranchScheduler(
71 change_filter
=util
.ChangeFilter(category
="hooks", project
=project
),
72 name
=project
, treeStableTimer
=timer
, builderNames
=["{}_build".format(project
)])
75 from buildbot
.reporters
.http
import HttpStatusPushBase
76 from twisted
.internet
import defer
77 from twisted
.python
import log
78 from buildbot
.util
import httpclientservice
79 from buildbot
.reporters
import utils
80 from buildbot
.process
import results
82 class SlackStatusPush(HttpStatusPushBase
):
83 name
= "SlackStatusPush"
85 @defer.inlineCallbacks
86 def reconfigService(self
, serverUrl
, **kwargs
):
87 yield HttpStatusPushBase
.reconfigService(self
, **kwargs
)
88 self
._http
= yield httpclientservice
.HTTPClientService
.getService(
89 self
.master
, serverUrl
)
91 @defer.inlineCallbacks
92 def send(self
, build
):
93 yield utils
.getDetailsForBuild(self
.master
, build
, wantProperties
=True)
94 response
= yield self
._http
.post("", json
=self
.format(build
))
95 if response
.code
!= 200:
96 log
.msg("%s: unable to upload status: %s" %
97 (response
.code
, response
.content
))
99 def format(self
, build
):
102 "#F1E903", # warnings
105 "#000000", # exception
107 "#D02CA9", # cancelled
110 if "environment" in build
["properties"]:
111 msg
= "{} environment".format(build
["properties"]["environment"][0])
112 if "build" in build
["properties"]:
113 msg
= "of archive {} in ".format(build
["properties"]["build"][0]) + msg
114 elif len(build
["buildset"]["sourcestamps"][0]["branch"]) > 0:
115 msg
= "revision {}".format(build
["buildset"]["sourcestamps"][0]["branch"])
119 if build
["complete"]:
120 timedelta
= int((build
["complete_at"] - build
["started_at"]).total_seconds())
121 hours
, rest
= divmod(timedelta
, 3600)
122 minutes
, seconds
= divmod(rest
, 60)
124 duration
= "{}h {}min {}s".format(hours
, minutes
, seconds
)
126 duration
= "{}min {}s".format(minutes
, seconds
)
128 duration
= "{}s".format(seconds
)
130 text
= "Build <{}|{}> of {}'s {} was {} in {}.".format(
131 build
["url"], build
["buildid"],
132 build
["builder"]["name"],
134 results
.Results
[build
["results"]],
140 "value": "<{}|{}>".format(build
["url"], build
["buildid"]),
145 "value": build
["builder"]["name"],
149 "title": "Build status",
150 "value": results
.Results
[build
["results"]],
154 "title": "Build duration",
159 if "environment" in build
["properties"]:
161 "title": "Environment",
162 "value": build
["properties"]["environment"][0],
165 if "build" in build
["properties"]:
168 "value": build
["properties"]["build"][0],
173 "color": colors
[build
["results"]],
177 text
= "Build <{}|{}> of {}'s {} started.".format(
178 build
["url"], build
["buildid"],
179 build
["builder"]["name"],
185 "username": "Buildbot",
186 "icon_url": "http://docs.buildbot.net/current/_static/icon.png",
188 "attachments": attachments
,