]> git.evergreen-ils.org Git - OpenSRF.git/blob - examples/buildbot.cfg
Fix buildbot configuration
[OpenSRF.git] / examples / buildbot.cfg
1 # -*- python -*-
2 # vim: set syntax=python:et:ts=4:sw=4:
3
4 # This is a sample buildmaster config file. It must be installed as
5 # 'master.cfg' in your buildmaster's base directory.
6
7 # This is the dictionary that the buildmaster pays attention to. We also use
8 # a shorter alias to save typing.
9 c = BuildmasterConfig = {}
10
11 # WORKDIR must be an absolute path that is not volatile; systems
12 # like Ubuntu wipe /tmp/ on a reboot, for example, which is
13 # disastrous for build history, at least for gitpoller
14 WORKDIR = '/home/buildmaster/'
15
16 ####### BUILDSLAVES
17
18 # The 'slaves' list defines the set of recognized buildslaves. Each element is
19 # a BuildSlave object, specifying a username and password.  The same username and
20 # password must be configured on the slave.
21 from buildbot.buildslave import BuildSlave
22 c['slaves'] = [
23     BuildSlave("opensrf-slave", "XXX", max_builds=1),
24     BuildSlave("eg-slave", "XXX", max_builds=1),
25     BuildSlave("eg-u1004", "XXX", max_builds=1)
26 ]
27
28 # 'slavePortnum' defines the TCP port to listen on for connections from slaves.
29 # This must match the value configured into the buildslaves (with their
30 # --master option)
31 c['slavePortnum'] = XXX
32
33 # Branches and distros to build
34 OSRF_BRANCHES = ('master', 'rel_2_1', 'rel_2_0')
35 OSRF_DISTROS = [('ubuntu-10.04-x86_64', 'opensrf-slave')]
36 EG_BRANCHES = ('master', 'rel_2_2', 'rel_2_0', 'rel_2_1')
37 EG_DISTROS = [
38     ('debian-6.00-x86_64', 'eg-slave'), # UPEI
39     ('ubuntu-10.04-x86', 'eg-u1004')    # GPLS
40 ]
41
42 eg_git = 'git://git.evergreen-ils.org/Evergreen.git'
43 osrf_git = 'git://git.evergreen-ils.org/OpenSRF.git'
44
45 ####### CHANGESOURCES
46
47 # the 'change_source' setting tells the buildmaster how it should find out
48 # about source code changes
49
50 from buildbot.changes import gitpoller
51 c['change_source'] = []
52 for osrf_branch in OSRF_BRANCHES:
53     c['change_source'].append(gitpoller.GitPoller(
54         project='OpenSRF',
55         repourl=osrf_git,
56         workdir= WORKDIR + 'buildbot_osrf_' + osrf_branch,
57         branch=osrf_branch
58     ))
59
60 for eg_branch in EG_BRANCHES:
61     c['change_source'].append(gitpoller.GitPoller(
62         project='Evergreen',
63         repourl=eg_git,
64         workdir= WORKDIR + 'buildbot_eg_' + eg_branch,
65         branch=eg_branch
66     ))
67
68 ####### FILTERS
69 from buildbot.changes.filter import ChangeFilter
70 master_filter = ChangeFilter(project='OpenSRF', branch="master")
71 rel_2_0_filter = ChangeFilter(project='OpenSRF', branch="rel_2_0")
72 rel_2_1_filter = ChangeFilter(project='OpenSRF', branch="rel_2_1")
73 eg_rel_2_0_filter = ChangeFilter(project='Evergreen', branch="rel_2_0")
74 eg_rel_2_1_filter = ChangeFilter(project='Evergreen', branch="rel_2_1")
75 eg_rel_2_2_filter = ChangeFilter(project='Evergreen', branch="rel_2_2")
76 eg_master_filter = ChangeFilter(project='Evergreen', branch="master")
77
78 ####### SCHEDULERS
79
80 # Configure the Schedulers, which decide how to react to incoming changes.  In this
81 # case, just kick off a 'runtests' build
82
83 from buildbot.schedulers.basic import SingleBranchScheduler
84 c['schedulers'] = []
85 c['schedulers'].append(SingleBranchScheduler(name="osrf-master-full",
86             treeStableTimer=300,
87             change_filter=master_filter,
88             builderNames=["osrf-master-ubuntu-10.04-x86_64"]))
89
90 c['schedulers'].append(SingleBranchScheduler(name="osrf-rel_2_1",
91             treeStableTimer=300,
92             change_filter=rel_2_1_filter,
93             builderNames=["osrf-rel_2_1-ubuntu-10.04-x86_64"]))
94
95 c['schedulers'].append(SingleBranchScheduler(name="osrf-rel_2_0",
96             treeStableTimer=300,
97             change_filter=rel_2_0_filter,
98             builderNames=["osrf-rel_2_0-ubuntu-10.04-x86_64"]))
99
100 c['schedulers'].append(SingleBranchScheduler(name="evergreen-rel_2_2",
101             treeStableTimer=300,
102             change_filter=eg_rel_2_2_filter,
103             builderNames=[
104                 "evergreen-rel_2_2-debian-6.00-x86_64",
105                 "evergreen-rel_2_2-ubuntu-10.04-x86"
106             ]))
107
108 c['schedulers'].append(SingleBranchScheduler(name="evergreen-rel_2_0",
109             treeStableTimer=300,
110             change_filter=eg_rel_2_0_filter,
111             builderNames=[
112                 "evergreen-rel_2_0-debian-6.00-x86_64",
113                 "evergreen-rel_2_0-ubuntu-10.04-x86"
114             ]))
115
116 c['schedulers'].append(SingleBranchScheduler(name="evergreen-rel_2_1",
117             treeStableTimer=300,
118             change_filter=eg_rel_2_1_filter,
119             builderNames=[
120                 "evergreen-rel_2_1-debian-6.00-x86_64",
121                 "evergreen-rel_2_1-ubuntu-10.04-x86"
122             ]))
123
124 c['schedulers'].append(SingleBranchScheduler(name="evergreen-master",
125             treeStableTimer=300,
126             change_filter=eg_master_filter,
127             builderNames=[
128                 "evergreen-master-debian-6.00-x86_64",
129                 "evergreen-master-ubuntu-10.04-x86"
130             ]))
131
132 #### Build step tests
133 def eg_requires_autogen(step):
134     'Old versions of Evergreen require autogen.sh to bootstrap'
135     if (step.build.getProperty('branch') == 'rel_2_0' or
136         step.build.getProperty('branch') == 'rel_2_1'
137     ):
138         return True
139     return False
140
141 def eg_requires_autoreconf(step):
142     'Modern versions of Evergreen use autoreconf to bootstrap'
143     if eg_requires_autogen(step):
144         return False
145     return True
146
147 def has_perl_unit_tests(step):
148     'Only run Perl tests if there are tests'
149     if (step.build.getProperty('branch') == 'rel_2_0'):
150         return False
151     return True
152
153 def osrf_requires_autogen(step):
154     'Old versions of OpenSRF require autogen.sh to bootstrap'
155     if (step.build.getProperty('branch') == 'rel_2_0'):
156         return True
157     return False
158
159 def osrf_requires_autoreconf(step):
160     'Modern versions of OpenSRF use autoreconf to bootstrap'
161     if osrf_requires_autogen(step):
162         return False
163     return True
164
165 ####### BUILDERS
166
167 # The 'builders' list defines the Builders, which tell Buildbot how to perform a build:
168 # what steps, and which slaves can execute them.  Note that any particular build will
169 # only take place on one slave.
170
171 from buildbot.process.factory import BuildFactory
172 from buildbot.steps import source 
173 from buildbot.steps import shell
174 from buildbot.steps import python
175 from buildbot.steps import python_twisted
176
177 osrf_factory = BuildFactory()
178 # check out the source
179 osrf_factory.addStep(source.Git(
180         repourl=osrf_git
181     )
182 )
183
184 # bootstrap the code - old branches require autogen.sh
185 osrf_factory.addStep(
186     shell.ShellCommand(command=["./autogen.sh"],
187         doStepIf=osrf_requires_autogen
188     )
189 )
190
191 osrf_factory.addStep(
192     shell.ShellCommand(command=["autoreconf -f -i"],
193         doStepIf=osrf_requires_autoreconf
194     )
195 )
196
197 # configure (default args for now)
198 osrf_factory.addStep(shell.Configure())
199
200 # compile the code
201 osrf_factory.addStep(shell.Compile(command=["make"]))
202
203 # run the Perl unit tests
204 osrf_factory.addStep(shell.PerlModuleTest(workdir="build/src/perl"))
205
206 osrf_factory.addStep(python_twisted.Trial(
207     testpath="build",
208     tests="src/python/tests/json_test.py"))
209
210 # report on the Python code
211 osrf_factory.addStep(python.PyLint(
212     env={"PYTHONPATH": ["src/python"]},
213     flunkOnFailure=False,
214     command=["pylint", 
215         "--output-format=parseable",
216         "src/python/opensrf.py",
217         "src/python/osrf/app.py",
218         "src/python/osrf/cache.py",
219         "src/python/osrf/conf.py",
220         "src/python/osrf/const.py",
221         "src/python/osrf/ex.py",
222         "src/python/osrf/gateway.py",
223         "src/python/osrf/http_translator.py",
224         "src/python/osrf/json.py",
225         "src/python/osrf/log.py",
226         "src/python/osrf/net_obj.py",
227         "src/python/osrf/net.py",
228         "src/python/osrf/server.py",
229         "src/python/osrf/ses.py",
230         "src/python/osrf/set.py",
231         "src/python/osrf/stack.py",
232         "src/python/osrf/system.py",
233         "src/python/osrf/xml_obj.py",
234         "src/python/osrf/apps/example.py"]))
235
236 eg_factory = BuildFactory()
237 # check out the source
238 eg_factory.addStep(source.Git(
239         repourl=eg_git
240     )
241 )
242
243 # bootstrap the code - old branches require autogen.sh
244 eg_factory.addStep(
245     shell.ShellCommand(command=["./autogen.sh"],
246         doStepIf=eg_requires_autogen
247     )
248 )
249
250 eg_factory.addStep(
251     shell.ShellCommand(command=["autoreconf -f -i"],
252         doStepIf=eg_requires_autoreconf
253     )
254 )
255
256 # configure (default args for now)
257 eg_factory.addStep(shell.Configure())
258
259 # compile the code
260 eg_factory.addStep(shell.Compile(command=["make"]))
261
262 perldir = 'build/Open-ILS/src/perlmods'
263 class PerlModuleTestMFHDMadness(shell.PerlModuleTest):
264     'Override PerlModuleTest with nonstandard library location for testlib.pm'
265     command = ['prove', '--lib', 'lib', '-I', 'lib/OpenILS/Utils/MFHD/test', '-r', 't']
266     total = 0
267
268 # run the Perl unit tests
269 eg_factory.addStep(PerlModuleTestMFHDMadness(
270     doStepIf=has_perl_unit_tests,
271     workdir=perldir)
272 )
273
274 # report on the Python code
275 eg_factory.addStep(python.PyLint(
276     env={"PYTHONPATH": ["Open-ILS/src/python"]},
277     flunkOnFailure=False,
278     command=["pylint", 
279         "--output-format=parseable",
280         "Open-ILS/src/python/setup.py",
281         "Open-ILS/src/python/oils/const.py",
282         "Open-ILS/src/python/oils/event.py",
283         "Open-ILS/src/python/oils/__init__.py",
284         "Open-ILS/src/python/oils/org.py",
285         "Open-ILS/src/python/oils/srfsh.py",
286         "Open-ILS/src/python/oils/system.py",
287         "Open-ILS/src/python/oils/utils/csedit.py",
288         "Open-ILS/src/python/oils/utils/idl.py",
289         "Open-ILS/src/python/oils/utils/__init__.py",
290         "Open-ILS/src/python/oils/utils/utils.py"
291     ]
292 ))
293
294 from buildbot.config import BuilderConfig
295
296 c['builders'] = []
297
298 for branch in OSRF_BRANCHES:
299     for distro, slave in OSRF_DISTROS:
300         build = "osrf-%s-%s" % (branch, distro)
301         c['builders'].append(BuilderConfig(name=build, slavenames=slave, factory=osrf_factory))
302         
303 for branch in EG_BRANCHES:
304     for distro, slave in EG_DISTROS:
305         build = "evergreen-%s-%s" % (branch, distro)
306         c['builders'].append(BuilderConfig(name=build, slavenames=slave, factory=eg_factory))
307
308 ####### STATUS TARGETS
309
310 # 'status' is a list of Status Targets. The results of each build will be
311 # pushed to these targets. buildbot/status/*.py has a variety to choose from,
312 # including web pages, email senders, and IRC bots.
313
314 c['status'] = []
315
316 from buildbot.status import html
317 from buildbot.status.web import auth, authz
318
319 users = [('XXX', 'XXX'), ('XXX', 'XXX')]
320 authz_cfg = authz.Authz(
321     auth=auth.BasicAuth(users),
322     # change any of these to True to enable; see the manual for more
323     # options
324     gracefulShutdown = False,
325     forceBuild = 'auth', # use this to test your slave once it is set up
326     forceAllBuilds = False,
327     pingBuilder = False,
328     stopBuild = False,
329     stopAllBuilds = False,
330     cancelPendingBuild = False,
331 )
332 c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))
333
334 # Send mail when a build is broken
335 from buildbot.status.mail import MailNotifier
336 MN = MailNotifier(
337     fromaddr="buildbot@testing.evergreen-ils.org",
338     sendToInterestedUsers=True,
339     mode='problem'
340 #   , extraRecipients=["dan@coffeecode.net","open-ils-dev@list.georgialibraries.org"]
341 )
342
343 # Uncomment to actually send mail
344 c['status'].append(MN)
345
346 ### IRCBOT
347 from buildbot.status import words
348 IRC = words.IRC("chat.freenode.net", "egbuilder",
349     channels=["#evergreen"],
350     password="XXX",
351     allowForce=False,
352     notify_events={
353         'exception': 1,
354         'successToFailure': 1,
355         'failureToSuccess': 1,
356     })
357 c['status'].append(IRC)
358
359 ####### PROJECT IDENTITY
360
361 # the 'projectName' string will be used to describe the project that this
362 # buildbot is working on. For example, it is used as the title of the
363 # waterfall HTML page. The 'projectURL' string will be used to provide a link
364 # from buildbot HTML pages to your project's home page.
365
366 c['projectName'] = "Evergreen and OpenSRF"
367 c['projectURL'] = "http://evergreen-ils.org/"
368
369 # the 'buildbotURL' string should point to the location where the buildbot's
370 # internal web server (usually the html.WebStatus page) is visible. This
371 # typically uses the port number set in the Waterfall 'status' entry, but
372 # with an externally-visible host name which the buildbot cannot figure out
373 # without some help.
374
375 c['buildbotURL'] = "http://testing.evergreen-ils.org/buildbot/"
376
377 ####### DB URL
378
379 # This specifies what database buildbot uses to store change and scheduler
380 # state.  You can leave this at its default for all but the largest
381 # installations.
382 c['db_url'] = "sqlite:///state.sqlite"
383