master.cfg 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. # -*- python -*-
  2. # ex: set syntax=python:
  3. from buildbot.plugins import *
  4. from buildbot.plugins import buildslave, util
  5. # This is a sample buildmaster config file. It must be installed as
  6. # 'master.cfg' in your buildmaster's base directory.
  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. quaggagit = 'git://git.sv.gnu.org/quagga.git'
  11. # password defs
  12. execfile("pass.cfg")
  13. # filter a given 'workers' entry into a property list
  14. # suitable for public display
  15. def workers2publicprops (worker):
  16. publicprops = [ "os", "version", "vm", "pkg", "texi", "cc",
  17. "latent", ]
  18. return { k:worker[k] for k in worker if k in publicprops }
  19. # vm: non-VM are assumed faster and used for initial build
  20. # pkg: rpm, sysv, dpkg - only do test rpm builds at moment
  21. # texi: True or "true" if we can use for doc building
  22. # cc: List of tuples of installed compilers, with:
  23. # (<tag>, <version>, <command>)
  24. # tag: gcc, clang, sunpro
  25. # latent: VM spun up on demand via LatentSlave, uses "session" for
  26. # the libvirt URI.
  27. # session: libvirt URI to use for latent workers. Default will be set on
  28. # latent VMs if not specified.
  29. # hd_image: libvirt image to use
  30. workers = {
  31. "fedora-24": {
  32. "os": "Fedora",
  33. "version": "24",
  34. "vm": False,
  35. "pkg": "rpm",
  36. "texi": True,
  37. "cc": [ ("gcc", "6.3.1"),
  38. ("clang", "3.8.1"),
  39. ("gcc", "3.4.6", "gcc34"),
  40. ],
  41. },
  42. "fedora-26": {
  43. "os": "Fedora",
  44. "version": "26",
  45. "vm": False,
  46. "pkg": "rpm",
  47. "cc": [ ("gcc", "7.0.1"),
  48. ("clang", "3.9.0"),
  49. ("gcc", "3.4.6", "gcc34"),
  50. ],
  51. },
  52. "centos-7": {
  53. "os": "CentOS",
  54. "version": "7",
  55. "vm": False,
  56. "pkg": "rpm",
  57. "cc": [ ("gcc", "4.8.5") ],
  58. },
  59. "debian-8": {
  60. "os": "Debian",
  61. "version": "8",
  62. "vm": True,
  63. "pkg": "dpkg",
  64. "latent": True,
  65. "cc": [ ("gcc", "4.9.2") ],
  66. "hd_image": "/var/lib/libvirt/images/debian8.qcow2",
  67. },
  68. "debian-9": {
  69. "os": "Debian",
  70. "version": "9",
  71. "vm": True,
  72. "pkg": "dpkg",
  73. "cc": [ ("gcc", "6.3.0") ],
  74. "latent": True,
  75. "hd_image": "/var/lib/libvirt/images/debian9.qcow2",
  76. },
  77. "freebsd-10": {
  78. "os": "FreeBSD",
  79. "version": "10",
  80. "vm": True,
  81. "pkg": "",
  82. "latent": True,
  83. "cc": [ ("clang", "3.4.1") ],
  84. "hd_image": "/var/lib/libvirt/images/freebsd103.qcow2",
  85. },
  86. "freebsd-11": {
  87. "os": "FreeBSD",
  88. "version": "11",
  89. "vm": True,
  90. "pkg": "",
  91. "cc": [ ("gcc", "4.9.4"), ("clang", "3.8.0"), ],
  92. "latent": True,
  93. "hd_image": "/var/lib/libvirt/images/freebsd110.qcow2",
  94. },
  95. "oi-hipster": {
  96. "os": "OpenIndiana",
  97. "version": "hipster",
  98. "vm": True,
  99. "pkg": "sysv",
  100. "latent": True,
  101. "cc": [ ("gcc", "6.3.0"), ("sunpro", "12.0"),
  102. ("gcc", "4.4.4")
  103. ],
  104. "hd_image": "/var/lib/libvirt/images/buildbot-oi-hipster.qcow2",
  105. },
  106. }
  107. # ensure "latent" is set to false, where not set.
  108. # add in the passwords
  109. for kw in workers:
  110. w = workers[kw]
  111. w["bot"] = "buildbot-" + kw
  112. if "latent" not in w:
  113. w["latent"] = False
  114. w["pass"] = workers_pass[kw]
  115. analyses_builders = [ "clang-analyzer" ]
  116. # default Libvirt session
  117. for w in (w for w in workers.values () if ("latent" in w and w["latent"])
  118. and ("session" not in w)):
  119. w["session"] = 'qemu+ssh://buildbot@sagan.jakma.org/system'
  120. osbuilders = ["build-" + kw for kw in workers]
  121. osfastbuilders = ["build-" + kw for kw in workers if workers[kw]["vm"] == False]
  122. osslowbuilders = ["build-" + kw for kw in workers if workers[kw]["vm"] == True]
  123. rpmbuilders = ["rpm-" + kw for kw in workers if workers[kw]["pkg"] == "rpm"]
  124. # compilers
  125. # not using yet
  126. # [kw for kw in workers if len([v for (c,v) in workers[kw]["cc"] if c == "gcc"]) > 0 ]
  127. allbuilders = []
  128. allbuilders += osbuilders
  129. allbuilders += rpmbuilders
  130. allbuilders += analyses_builders
  131. allbuilders += ["commit-builder"]
  132. allbuilders += ["build-distcheck"]
  133. allbuilders += ["build-docs" ]
  134. # Force merging of requests.
  135. # c['mergeRequests'] = lambda *args, **kwargs: True
  136. ####### BUILDSLAVES
  137. c['slaves'] = []
  138. # The 'slaves' list defines the set of recognized buildslaves. Each element is
  139. # a BuildSlave object, specifying a unique slave name and password. The same
  140. # slave name and password must be configured on the slave.
  141. for w in (w for w in workers.values() if ("latent" not in w)
  142. or (w["latent"] == False)):
  143. c['slaves'].append(buildslave.BuildSlave(w["bot"], w["pass"],
  144. properties=workers2publicprops (w),
  145. ))
  146. for w in (w for w in workers.values()
  147. if ("latent" in w)
  148. and w["latent"]
  149. and "hd_image" in w):
  150. c['slaves'].append(buildslave.LibVirtSlave(
  151. w["bot"],
  152. w["pass"],
  153. util.Connection(w["session"]),
  154. w["hd_image"],
  155. properties=workers2publicprops (w),
  156. ))
  157. # 'protocols' contains information about protocols which master will use for
  158. # communicating with slaves.
  159. # You must define at least 'port' option that slaves could connect to your master
  160. # with this protocol.
  161. # 'port' must match the value configured into the buildslaves (with their
  162. # --master option)
  163. c['protocols'] = {'pb': {'port': 9989}}
  164. ####### CHANGESOURCES
  165. # the 'change_source' setting tells the buildmaster how it should find out
  166. # about source code changes. Here we point to the buildbot clone of pyflakes.
  167. c['change_source'] = []
  168. c['change_source'].append(changes.GitPoller(
  169. quaggagit,
  170. workdir='gitpoller-workdir',
  171. branches=['master','volatile/next'],
  172. pollinterval=300))
  173. ####### REVISION LINKS
  174. # associate changesouce repositories to URI templates for code view
  175. #
  176. c['revlink'] = util.RevlinkMatch([quaggagit + r"(.*)"],
  177. r"http://git.savannah.gnu.org/cgit/quagga.git/commit/?id=%s")
  178. ####### SCHEDULERS
  179. # Configure the Schedulers, which decide how to react to incoming changes.
  180. # We want a first line of 'quick' builds, which then trigger further builds.
  181. #
  182. # A control-flow builder, "commit-builder", used to sequence the 'real'
  183. # sets of builders, via Triggers.
  184. c['schedulers'] = []
  185. c['schedulers'].append(schedulers.SingleBranchScheduler(
  186. name="master-change",
  187. change_filter=util.ChangeFilter(branch='master'),
  188. treeStableTimer=10,
  189. builderNames=[ "commit-builder" ]))
  190. c['schedulers'].append(schedulers.SingleBranchScheduler(
  191. name="next-change",
  192. change_filter=util.ChangeFilter(
  193. branch='volatile/next'),
  194. treeStableTimer=10,
  195. builderNames=[ "commit-builder" ] ))
  196. # Initial build checks on faster, non-VM
  197. c['schedulers'].append(schedulers.Triggerable(
  198. name="trigger-build-first",
  199. builderNames=osfastbuilders))
  200. # Build using remaining builders, after firstbuilders.
  201. c['schedulers'].append(schedulers.Triggerable(
  202. name="trigger-build-rest",
  203. builderNames=osslowbuilders))
  204. # Analyses tools, e.g. CLang Analyzer scan-build
  205. c['schedulers'].append(schedulers.Triggerable(
  206. name="trigger-build-analyses",
  207. builderNames=analyses_builders))
  208. # Dist check
  209. c['schedulers'].append(schedulers.Triggerable(
  210. name="trigger-distcheck",
  211. builderNames=["build-distcheck"]))
  212. # RPM check and build
  213. c['schedulers'].append(schedulers.Triggerable(
  214. name="trigger-rpm",
  215. builderNames=rpmbuilders))
  216. # Doc build check (non-nightly, so no upload)
  217. c['schedulers'].append(schedulers.Triggerable(
  218. name="trigger-build-docs",
  219. builderNames=["build-docs"]))
  220. # Try and force schedulers
  221. c['schedulers'].append(schedulers.ForceScheduler(
  222. name="force",
  223. builderNames=allbuilders))
  224. c['schedulers'].append(schedulers.Try_Userpass(
  225. name="try",
  226. builderNames=osbuilders
  227. + rpmbuilders
  228. + ["build-distcheck",
  229. "clang-analyzer",
  230. "build-docs" ],
  231. userpass=users,
  232. port=8031))
  233. ## nightly docs build
  234. c['schedulers'].append(schedulers.Nightly(
  235. name="nightly-docs",
  236. branch="master",
  237. builderNames=[ "build-docs" ],
  238. hour=3,
  239. minute=0,
  240. onlyIfChanged=True,
  241. properties = { "nightly": True },
  242. ))
  243. ####### BUILDERS
  244. c['builders'] = []
  245. # The 'builders' list defines the Builders, which tell Buildbot how to perform a build:
  246. # what steps, and which slaves can execute them. Note that any particular build will
  247. # only take place on one slave.
  248. common_setup = [
  249. steps.Git(repourl=quaggagit, mode='incremental'),
  250. steps.ShellCommand(command=["./update-autotools"],
  251. description="generating autoconf",
  252. descriptionDone="autoconf"),
  253. steps.Configure(command="../build/configure"),
  254. steps.ShellCommand(command=["make", "clean"],
  255. description="cleaning",
  256. descriptionDone="make clean"),
  257. ]
  258. ### Default 'check' build, builder instantiated for each OS
  259. factory = util.BuildFactory()
  260. # check out the source
  261. factory.addStep(steps.Git(repourl=quaggagit, mode='incremental'))
  262. factory.addStep(steps.ShellCommand(command=["./update-autotools"],
  263. description="generating autoconf",
  264. descriptionDone="autoconf"))
  265. factory.addStep(steps.Configure())
  266. factory.addStep(steps.ShellCommand(command=["make", "clean"],
  267. description="cleaning",
  268. descriptionDone="clean"))
  269. #factory.addSteps(common_setup)
  270. factory.addStep(steps.Compile(command=["make", "-j", "2", "all"]))
  271. factory.addStep(steps.ShellCommand(command=["make", "check"],
  272. description="checking",
  273. descriptionDone="make check"))
  274. # create builder for every OS, for every buildbot
  275. # XXX: at moment this assumes 1:1 OS<->bot
  276. for kw in workers:
  277. c['builders'].append(util.BuilderConfig(
  278. name="build-" + kw,
  279. slavenames=workers[kw]["bot"],
  280. factory=factory))
  281. ### distcheck Builder, executed on any available bot
  282. factory = util.BuildFactory()
  283. # check out the source
  284. factory.addStep(steps.Git(repourl=quaggagit, mode='incremental'))
  285. factory.addStep(steps.ShellCommand(command=["./update-autotools"],
  286. description="generating autoconf",
  287. descriptionDone="autoconf"))
  288. factory.addStep(steps.Configure())
  289. factory.addStep(steps.ShellCommand(command=["make", "clean"],
  290. description="cleaning",
  291. descriptionDone="make clean"))
  292. factory.addStep(steps.ShellCommand(command=["make", "distcheck"],
  293. description="run make distcheck",
  294. descriptionDone="make distcheck"))
  295. c['builders'].append(
  296. util.BuilderConfig(name="build-distcheck",
  297. slavenames=list(w["bot"] for w in workers.values()),
  298. factory=factory,
  299. ))
  300. ### LLVM clang-analyzer build, executed on any available non-VM bot
  301. f = util.BuildFactory()
  302. # check out the source
  303. f.addStep(steps.Git(repourl=quaggagit, mode='incremental',
  304. getDescription=True))
  305. f.addStep(steps.ShellCommand(command=["./update-autotools"],
  306. description="run autotools",
  307. descriptionDone="autoconf"))
  308. f.addStep(steps.Configure())
  309. f.addStep(steps.ShellCommand(command=["make", "clean"],
  310. description="cleaning",
  311. descriptionDone="make clean"))
  312. f.addStep(steps.SetProperty(property="clang-id",
  313. value=util.Interpolate("%(prop:commit-description)s-%(prop:buildnumber)s")))
  314. f.addStep(steps.SetProperty(property="clang-output-dir",
  315. value=util.Interpolate("../CLANG-%(prop:clang-id)s")))
  316. f.addStep(steps.SetProperty(property="clang-uri",
  317. value=util.Interpolate("/clang-analyzer/%(prop:clang-id)s")))
  318. # relative to buildbot master working directory
  319. f.addStep(steps.SetProperty(property="clang-upload-dir",
  320. value=util.Interpolate("public_html/clang-analyzer/%(prop:clang-id)s")))
  321. f.addStep(steps.Compile(command=["scan-build",
  322. "-analyze-headers",
  323. "-o",
  324. util.Interpolate("%(prop:clang-output-dir)s"),
  325. "make", "-j", "all"]))
  326. f.addStep(steps.DirectoryUpload(
  327. slavesrc=util.Interpolate("%(prop:clang-output-dir)s"),
  328. masterdest = util.Interpolate("%(prop:clang-upload-dir)s"),
  329. compress = 'bz2',
  330. name = "clang report",
  331. url = util.Interpolate("%(prop:clang-uri)s"),
  332. ))
  333. f.addStep(steps.RemoveDirectory(
  334. dir=util.Interpolate("%(prop:clang-output-dir)s")
  335. ))
  336. c['builders'].append(
  337. util.BuilderConfig(name="clang-analyzer",
  338. slavenames=list(w["bot"] for w in workers.values() if not w["vm"]),
  339. factory=f))
  340. ### RPM: check and build
  341. f = util.BuildFactory ()
  342. # check out the source
  343. f.addStep(steps.Git(repourl=quaggagit, mode='full'))
  344. f.addStep(steps.ShellCommand(command=["./update-autotools"],
  345. description="run autotools",
  346. descriptionDone="autotools"))
  347. f.addStep(steps.Configure())
  348. f.addStep(steps.ShellCommand(command=["make", "dist"],
  349. description="run make dist",
  350. descriptionDone="make dist"))
  351. # not imported somehow
  352. #f.addStep(steps.RpmLint(fileloc="redhat/quagga.spec"))
  353. f.addStep(steps.ShellCommand(command=["rpmlint", "-i", "redhat/quagga.spec"],
  354. description="run rpmlint",
  355. descriptionDone="rpmlint"))
  356. f.addStep(steps.RpmBuild(specfile="redhat/quagga.spec"))
  357. # rpmdir=util.Interpolate("%(prop:builddir)s/rpm")))
  358. # XXX: assuming 1:1 OS:buildbot mapping
  359. for kw in (kw for kw in workers if workers[kw]["pkg"] == "rpm"):
  360. c['builders'].append(
  361. util.BuilderConfig(name="rpm-" + kw,
  362. slavenames="buildbot-" + kw,
  363. factory=f
  364. )
  365. )
  366. ### Build documentation
  367. def build_is_nightly (step):
  368. n = step.getProperty("nightly")
  369. if n == True or n == "True" or n == "true":
  370. return True
  371. return False
  372. f = util.BuildFactory ()
  373. f.addStep(steps.Git(repourl=quaggagit, mode='full'))
  374. f.addStep(steps.ShellCommand(command=["./update-autotools"],
  375. description="run autotools",
  376. descriptionDone="autotools"))
  377. f.addStep(steps.Configure(command=["../build/configure"],
  378. workdir="docs"))
  379. f.addStep(steps.ShellCommand(command=["make", "V=99", "quagga.html"],
  380. description="making split HTML doc",
  381. descriptionDone="docs: split HTML",
  382. workdir="docs/doc",
  383. haltOnFailure=True,
  384. ))
  385. #f.addStep(steps.FileUpload(
  386. # slavesrc="build/doc/fig-normal-processing.png",
  387. # masterdest = "public_html/docs/nightly/quagga/",
  388. # name = "Upload Fig 1",
  389. # doStepIf=build_is_nightly,
  390. #))
  391. #f.addStep(steps.FileUpload(
  392. # slavesrc="build/doc/fig-rs-processing.png",
  393. # masterdest = "public_html/docs/nightly/quagga/",
  394. # name = "Upload Fig 2",
  395. # doStepIf=build_is_nightly,
  396. #))
  397. f.addStep(steps.MultipleFileUpload(
  398. slavesrcs=[ "doc/fig-rs-processing.png",
  399. "doc/fig-normal-processing.png" ],
  400. masterdest = "public_html/docs/nightly/quagga/",
  401. name = "Upload Figures",
  402. doStepIf=build_is_nightly,
  403. ))
  404. f.addStep(steps.DirectoryUpload(
  405. slavesrc="quagga.html",
  406. masterdest = "public_html/docs/nightly/quagga",
  407. compress = 'bz2',
  408. name = "Upload split HTML",
  409. url = "/docs/nightly/quagga/index.html",
  410. workdir="docs/doc",
  411. doStepIf=build_is_nightly,
  412. ))
  413. f.addStep(steps.RemoveDirectory(
  414. dir="docs/doc/quagga.html",
  415. ))
  416. f.addStep(steps.ShellCommand(command=["make", "V=99",
  417. "MAKEINFOFLAGS=--no-split",
  418. "quagga.html"],
  419. description="making one-page HTML doc",
  420. descriptionDone="docs: one-page HTML",
  421. workdir="docs/doc",
  422. haltOnFailure=True
  423. ))
  424. f.addStep(steps.FileUpload(
  425. slavesrc="quagga.html",
  426. masterdest = "public_html/docs/nightly/quagga/quagga.html",
  427. name = "Upload single HTML",
  428. url = "/docs/nightly/quagga/quagga.html",
  429. workdir="docs/doc",
  430. doStepIf=build_is_nightly,
  431. ))
  432. f.addStep(steps.ShellCommand(command=["make", "V=99", "quagga.pdf"],
  433. description="making PDF docs",
  434. descriptionDone="docs: PDF",
  435. workdir="docs/doc"
  436. ))
  437. f.addStep(steps.FileUpload(
  438. slavesrc="quagga.pdf",
  439. masterdest = "public_html/docs/nightly/quagga/quagga.pdf",
  440. name = "Upload PDF",
  441. url = "/docs/nightly/quagga/quagga.pdf",
  442. workdir="docs/doc",
  443. doStepIf=build_is_nightly,
  444. ))
  445. c['builders'].append(
  446. util.BuilderConfig(name="build-docs",
  447. slavenames=[w["bot"] for w in workers.values()
  448. if "texi" in w and w["texi"] == True ],
  449. factory=f
  450. ))
  451. ### Co-ordination builds used to sequence parallel builds via Triggerable
  452. # to understand this you have to read this list and the Triggered schedulers
  453. # to see what sets of builds are being sequenced. Bit clunky, but Buildbot
  454. # doesn't have a way to just specify a pipeline of groups of builders more
  455. # cleanly.
  456. f = util.BuildFactory()
  457. f.addStep(steps.Trigger (
  458. schedulerNames = [ "trigger-build-first" ],
  459. waitForFinish=True,
  460. updateSourceStamp=True
  461. ))
  462. f.addStep(steps.Trigger (
  463. schedulerNames = [ "trigger-build-rest" ],
  464. waitForFinish=True,
  465. updateSourceStamp=True
  466. ))
  467. f.addStep(steps.Trigger (
  468. schedulerNames = [ "trigger-build-analyses", "trigger-distcheck",
  469. "trigger-build-docs" ],
  470. waitForFinish=True,
  471. updateSourceStamp=True
  472. ))
  473. f.addStep(steps.Trigger (
  474. schedulerNames = [ "trigger-rpm" ],
  475. waitForFinish=True,
  476. updateSourceStamp=True
  477. ))
  478. c['builders'].append(
  479. util.BuilderConfig(name="commit-builder",
  480. slavenames=[w["bot"] for w in workers.values() if not w["vm"]],
  481. factory=f)
  482. )
  483. ####### STATUS TARGETS
  484. # 'status' is a list of Status Targets. The results of each build will be
  485. # pushed to these targets. buildbot/status/*.py has a variety to choose from,
  486. # including web pages, email senders, and IRC bots.
  487. c['status'] = []
  488. from buildbot.status import html
  489. from buildbot.status.web import authz, auth
  490. authz_cfg=authz.Authz(
  491. # change any of these to True to enable; see the manual for more
  492. # options
  493. #auth=auth.BasicAuth([("pyflakes","pyflakes")]),
  494. auth=util.BasicAuth(users),
  495. gracefulShutdown = False,
  496. forceBuild = 'auth', # use this to test your slave once it is set up
  497. forceAllBuilds = 'auth', # ..or this
  498. pingBuilder = 'auth',
  499. stopBuild = 'auth',
  500. stopAllBuilds = 'auth',
  501. cancelPendingBuild = 'auth',
  502. cancelAllPendingBuilds = 'auth',
  503. pauseSlave = 'auth',
  504. )
  505. c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))
  506. c['status'].append(status.MailNotifier(
  507. fromaddr="buildbot@quagga.net",
  508. extraRecipients=["paul@jakma.org"],
  509. sendToInterestedUsers=False,
  510. ))
  511. c['status'].append (status.IRC(
  512. "irc.freenode.net", "bb-quagga",
  513. useColors=True,
  514. channels=[{"channel": "#quagga"}],
  515. notify_events={
  516. 'exception': 1,
  517. 'successToFailure': 1,
  518. 'failureToSuccess': 1,
  519. },
  520. ))
  521. ####### PROJECT IDENTITY
  522. # the 'title' string will appear at the top of this buildbot
  523. # installation's html.WebStatus home page (linked to the
  524. # 'titleURL') and is embedded in the title of the waterfall HTML page.
  525. c['title'] = "Quagga"
  526. c['titleURL'] = "https://www.quagga.net/"
  527. # the 'buildbotURL' string should point to the location where the buildbot's
  528. # internal web server (usually the html.WebStatus page) is visible. This
  529. # typically uses the port number set in the Waterfall 'status' entry, but
  530. # with an externally-visible host name which the buildbot cannot figure out
  531. # without some help.
  532. c['buildbotURL'] = "http://buildbot.quagga.net/"
  533. ####### DB URL
  534. c['db'] = {
  535. # This specifies what database buildbot uses to store its state. You can leave
  536. # this at its default for all but the largest installations.
  537. 'db_url' : "sqlite:///state.sqlite",
  538. }
  539. #### debug
  540. c['debugPassword'] = debugPassword