buildbot.texinfo: move the changesource types up a level, removing the one-entry...
[buildbot.git] / docs / buildbot.texinfo
blob85af2b597932e2f85c74714a36943ced6f2dbf03
1 \input texinfo @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename buildbot.info
4 @settitle BuildBot Manual 0.7.5+
5 @defcodeindex cs
6 @defcodeindex sl
7 @defcodeindex bf
8 @defcodeindex bs
9 @defcodeindex st
10 @defcodeindex bc
11 @c %**end of header
13 @c these indices are for classes useful in a master.cfg config file
14 @c @csindex : Change Sources
15 @c @slindex : Schedulers and Locks
16 @c @bfindex : Build Factories
17 @c @bsindex : Build Steps
18 @c @stindex : Status Targets
20 @c @bcindex : keys that make up BuildmasterConfig
22 @copying
23 This is the BuildBot manual.
25 Copyright (C) 2005,2006 Brian Warner
27 Copying and distribution of this file, with or without
28 modification, are permitted in any medium without royalty
29 provided the copyright notice and this notice are preserved.
31 @end copying
33 @titlepage
34 @title BuildBot
35 @page
36 @vskip 0pt plus 1filll
37 @insertcopying
38 @end titlepage
40 @c Output the table of the contents at the beginning.
41 @contents
43 @ifnottex
44 @node Top, Introduction, (dir), (dir)
45 @top BuildBot
47 @insertcopying
48 @end ifnottex
50 @menu
51 * Introduction::                What the BuildBot does.
52 * Installation::                Creating a buildmaster and buildslaves,
53                                 running them.
54 * Concepts::                    What goes on in the buildbot's little mind.
55 * Configuration::               Controlling the buildbot.
56 * Getting Source Code Changes::  Discovering when to run a build.
57 * Build Process::               Controlling how each build is run.
58 * Status Delivery::             Telling the world about the build's results.
59 * Command-line tool::           
60 * Resources::                   Getting help.
61 * Developer's Appendix::        
62 * Index of Useful Classes::     
63 * Index of master.cfg keys::    
64 * Index::                       Complete index.
66 @detailmenu
67  --- The Detailed Node Listing ---
69 Introduction
71 * History and Philosophy::      
72 * System Architecture::         
73 * Control Flow::                
75 System Architecture
77 * BuildSlave Connections::      
78 * Buildmaster Architecture::    
79 * Status Delivery Architecture::  
81 Installation
83 * Requirements::                
84 * Installing the code::         
85 * Creating a buildmaster::      
86 * Creating a buildslave::       
87 * Launching the daemons::       
88 * Logfiles::                    
89 * Shutdown::                    
90 * Maintenance::                 
91 * Troubleshooting::             
93 Creating a buildslave
95 * Buildslave Options::          
97 Troubleshooting
99 * Starting the buildslave::     
100 * Connecting to the buildmaster::  
101 * Forcing Builds::              
103 Concepts
105 * Version Control Systems::     
106 * Schedulers::                  
107 * BuildSet::                    
108 * BuildRequest::                
109 * Builder::                     
110 * Users::                       
112 Version Control Systems
114 * Generalizing VC Systems::     
115 * Source Tree Specifications::  
116 * How Different VC Systems Specify Sources::  
117 * Attributes of Changes::       
119 Users
121 * Doing Things With Users::     
122 * Email Addresses::             
123 * IRC Nicknames::               
124 * Live Status Clients::         
126 Configuration
128 * Config File Format::          
129 * Loading the Config File::     
130 * Defining the Project::        
131 * Listing Change Sources and Schedulers::  
132 * Setting the slaveport::       
133 * Buildslave Specifiers::       
134 * Defining Builders::           
135 * Defining Status Targets::     
136 * Debug options::               
138 Listing Change Sources and Schedulers
140 * Scheduler Types::             
141 * Build Dependencies::          
143 Getting Source Code Changes
145 * Change Sources::              
146 * Choosing ChangeSources::      
147 * CVSToys - PBService::         
148 * CVSToys - mail notification::  
149 * Other mail notification ChangeSources::  
150 * PBChangeSource::              
151 * P4Source::                    
152 * BonsaiPoller::                
153 * SVNPoller::                   
154 * MercurialHook::               
156 Build Process
158 * Build Steps::                 
159 * Interlocks::                  
160 * Build Factories::             
162 Build Steps
164 * Common Parameters::           
165 * Source Checkout::             
166 * ShellCommand::                
167 * Simple ShellCommand Subclasses::  
168 * Python BuildSteps::           
169 * Transferring Files::          
170 * Writing New BuildSteps::      
172 Source Checkout
174 * CVS::                         
175 * SVN::                         
176 * Darcs::                       
177 * Mercurial::                   
178 * Arch::                        
179 * Bazaar::                      
180 * Bzr::                         
181 * P4::                          
183 Simple ShellCommand Subclasses
185 * Configure::                   
186 * Compile::                     
187 * Test::                        
188 * Build Properties::            
190 Python BuildSteps
192 * BuildEPYDoc::                 
193 * PyFlakes::                    
195 Writing New BuildSteps
197 * BuildStep LogFiles::          
198 * Reading Logfiles::            
199 * Adding LogObservers::         
200 * BuildStep URLs::              
202 Build Factories
204 * BuildStep Objects::           
205 * BuildFactory::                
206 * Process-Specific build factories::  
208 BuildStep Objects
210 * BuildFactory Attributes::     
211 * Quick builds::                
213 BuildFactory
215 * BuildFactory Attributes::     
216 * Quick builds::                
218 Process-Specific build factories
220 * GNUAutoconf::                 
221 * CPAN::                        
222 * Python distutils::            
223 * Python/Twisted/trial projects::  
225 Status Delivery
227 * HTML Waterfall::              
228 * IRC Bot::                     
229 * PBListener::                  
230 * Writing New Status Plugins::  
232 Command-line tool
234 * Administrator Tools::         
235 * Developer Tools::             
236 * Other Tools::                 
237 * .buildbot config directory::  
239 Developer Tools
241 * statuslog::                   
242 * statusgui::                   
243 * try::                         
245 waiting for results
247 * try --diff::                  
249 Other Tools
251 * sendchange::                  
252 * debugclient::                 
254 @end detailmenu
255 @end menu
257 @node Introduction, Installation, Top, Top
258 @chapter Introduction
260 @cindex introduction
262 The BuildBot is a system to automate the compile/test cycle required by most
263 software projects to validate code changes. By automatically rebuilding and
264 testing the tree each time something has changed, build problems are
265 pinpointed quickly, before other developers are inconvenienced by the
266 failure. The guilty developer can be identified and harassed without human
267 intervention. By running the builds on a variety of platforms, developers
268 who do not have the facilities to test their changes everywhere before
269 checkin will at least know shortly afterwards whether they have broken the
270 build or not. Warning counts, lint checks, image size, compile time, and
271 other build parameters can be tracked over time, are more visible, and
272 are therefore easier to improve.
274 The overall goal is to reduce tree breakage and provide a platform to
275 run tests or code-quality checks that are too annoying or pedantic for
276 any human to waste their time with. Developers get immediate (and
277 potentially public) feedback about their changes, encouraging them to
278 be more careful about testing before checkin.
280 Features:
282 @itemize @bullet
283 @item
284 run builds on a variety of slave platforms
285 @item
286 arbitrary build process: handles projects using C, Python, whatever
287 @item
288 minimal host requirements: python and Twisted
289 @item
290 slaves can be behind a firewall if they can still do checkout
291 @item
292 status delivery through web page, email, IRC, other protocols
293 @item
294 track builds in progress, provide estimated completion time
295 @item
296 flexible configuration by subclassing generic build process classes
297 @item
298 debug tools to force a new build, submit fake Changes, query slave status
299 @item
300 released under the GPL
301 @end itemize
303 @menu
304 * History and Philosophy::      
305 * System Architecture::         
306 * Control Flow::                
307 @end menu
310 @node History and Philosophy, System Architecture, Introduction, Introduction
311 @section History and Philosophy
313 @cindex Philosophy of operation
315 The Buildbot was inspired by a similar project built for a development
316 team writing a cross-platform embedded system. The various components
317 of the project were supposed to compile and run on several flavors of
318 unix (linux, solaris, BSD), but individual developers had their own
319 preferences and tended to stick to a single platform. From time to
320 time, incompatibilities would sneak in (some unix platforms want to
321 use @code{string.h}, some prefer @code{strings.h}), and then the tree
322 would compile for some developers but not others. The buildbot was
323 written to automate the human process of walking into the office,
324 updating a tree, compiling (and discovering the breakage), finding the
325 developer at fault, and complaining to them about the problem they had
326 introduced. With multiple platforms it was difficult for developers to
327 do the right thing (compile their potential change on all platforms);
328 the buildbot offered a way to help.
330 Another problem was when programmers would change the behavior of a
331 library without warning its users, or change internal aspects that
332 other code was (unfortunately) depending upon. Adding unit tests to
333 the codebase helps here: if an application's unit tests pass despite
334 changes in the libraries it uses, you can have more confidence that
335 the library changes haven't broken anything. Many developers
336 complained that the unit tests were inconvenient or took too long to
337 run: having the buildbot run them reduces the developer's workload to
338 a minimum.
340 In general, having more visibility into the project is always good,
341 and automation makes it easier for developers to do the right thing.
342 When everyone can see the status of the project, developers are
343 encouraged to keep the tree in good working order. Unit tests that
344 aren't run on a regular basis tend to suffer from bitrot just like
345 code does: exercising them on a regular basis helps to keep them
346 functioning and useful.
348 The current version of the Buildbot is additionally targeted at
349 distributed free-software projects, where resources and platforms are
350 only available when provided by interested volunteers. The buildslaves
351 are designed to require an absolute minimum of configuration, reducing
352 the effort a potential volunteer needs to expend to be able to
353 contribute a new test environment to the project. The goal is for
354 anyone who wishes that a given project would run on their favorite
355 platform should be able to offer that project a buildslave, running on
356 that platform, where they can verify that their portability code
357 works, and keeps working.
359 @node System Architecture, Control Flow, History and Philosophy, Introduction
360 @comment  node-name,  next,  previous,  up
361 @section System Architecture
363 The Buildbot consists of a single @code{buildmaster} and one or more
364 @code{buildslaves}, connected in a star topology. The buildmaster
365 makes all decisions about what, when, and how to build. It sends
366 commands to be run on the build slaves, which simply execute the
367 commands and return the results. (certain steps involve more local
368 decision making, where the overhead of sending a lot of commands back
369 and forth would be inappropriate, but in general the buildmaster is
370 responsible for everything).
372 The buildmaster is usually fed @code{Changes} by some sort of version
373 control system (@pxref{Change Sources}), which may cause builds to be
374 run. As the builds are performed, various status messages are
375 produced, which are then sent to any registered Status Targets
376 (@pxref{Status Delivery}).
378 @c @image{FILENAME, WIDTH, HEIGHT, ALTTEXT, EXTENSION}
379 @image{images/overview,,,Overview Diagram,}
381 The buildmaster is configured and maintained by the ``buildmaster
382 admin'', who is generally the project team member responsible for
383 build process issues. Each buildslave is maintained by a ``buildslave
384 admin'', who do not need to be quite as involved. Generally slaves are
385 run by anyone who has an interest in seeing the project work well on
386 their favorite platform.
388 @menu
389 * BuildSlave Connections::      
390 * Buildmaster Architecture::    
391 * Status Delivery Architecture::  
392 @end menu
394 @node BuildSlave Connections, Buildmaster Architecture, System Architecture, System Architecture
395 @subsection BuildSlave Connections
397 The buildslaves are typically run on a variety of separate machines,
398 at least one per platform of interest. These machines connect to the
399 buildmaster over a TCP connection to a publically-visible port. As a
400 result, the buildslaves can live behind a NAT box or similar
401 firewalls, as long as they can get to buildmaster. The TCP connections
402 are initiated by the buildslave and accepted by the buildmaster, but
403 commands and results travel both ways within this connection. The
404 buildmaster is always in charge, so all commands travel exclusively
405 from the buildmaster to the buildslave.
407 To perform builds, the buildslaves must typically obtain source code
408 from a CVS/SVN/etc repository. Therefore they must also be able to
409 reach the repository. The buildmaster provides instructions for
410 performing builds, but does not provide the source code itself.
412 @image{images/slaves,,,BuildSlave Connections,}
414 @node Buildmaster Architecture, Status Delivery Architecture, BuildSlave Connections, System Architecture
415 @subsection Buildmaster Architecture
417 The Buildmaster consists of several pieces:
419 @image{images/master,,,BuildMaster Architecture,}
421 @itemize @bullet
423 @item
424 Change Sources, which create a Change object each time something is
425 modified in the VC repository. Most ChangeSources listen for messages
426 from a hook script of some sort. Some sources actively poll the
427 repository on a regular basis. All Changes are fed to the Schedulers.
429 @item
430 Schedulers, which decide when builds should be performed. They collect
431 Changes into BuildRequests, which are then queued for delivery to
432 Builders until a buildslave is available.
434 @item
435 Builders, which control exactly @emph{how} each build is performed
436 (with a series of BuildSteps, configured in a BuildFactory). Each
437 Build is run on a single buildslave.
439 @item
440 Status plugins, which deliver information about the build results
441 through protocols like HTTP, mail, and IRC.
443 @end itemize
445 @image{images/slavebuilder,,,SlaveBuilders,}
447 Each Builder is configured with a list of BuildSlaves that it will use
448 for its builds. These buildslaves are expected to behave identically:
449 the only reason to use multiple BuildSlaves for a single Builder is to
450 provide a measure of load-balancing.
452 Within a single BuildSlave, each Builder creates its own SlaveBuilder
453 instance. These SlaveBuilders operate independently from each other.
454 Each gets its own base directory to work in. It is quite common to
455 have many Builders sharing the same buildslave. For example, there
456 might be two buildslaves: one for i386, and a second for PowerPC.
457 There may then be a pair of Builders that do a full compile/test run,
458 one for each architecture, and a lone Builder that creates snapshot
459 source tarballs if the full builders complete successfully. The full
460 builders would each run on a single buildslave, whereas the tarball
461 creation step might run on either buildslave (since the platform
462 doesn't matter when creating source tarballs). In this case, the
463 mapping would look like:
465 @example
466 Builder(full-i386)  ->  BuildSlaves(slave-i386)
467 Builder(full-ppc)   ->  BuildSlaves(slave-ppc)
468 Builder(source-tarball) -> BuildSlaves(slave-i386, slave-ppc)
469 @end example
471 and each BuildSlave would have two SlaveBuilders inside it, one for a
472 full builder, and a second for the source-tarball builder.
474 Once a SlaveBuilder is available, the Builder pulls one or more
475 BuildRequests off its incoming queue. (It may pull more than one if it
476 determines that it can merge the requests together; for example, there
477 may be multiple requests to build the current HEAD revision). These
478 requests are merged into a single Build instance, which includes the
479 SourceStamp that describes what exact version of the source code
480 should be used for the build. The Build is then randomly assigned to a
481 free SlaveBuilder and the build begins.
484 @node Status Delivery Architecture,  , Buildmaster Architecture, System Architecture
485 @subsection Status Delivery Architecture
487 The buildmaster maintains a central Status object, to which various
488 status plugins are connected. Through this Status object, a full
489 hierarchy of build status objects can be obtained.
491 @image{images/status,,,Status Delivery,}
493 The configuration file controls which status plugins are active. Each
494 status plugin gets a reference to the top-level Status object. From
495 there they can request information on each Builder, Build, Step, and
496 LogFile. This query-on-demand interface is used by the html.Waterfall
497 plugin to create the main status page each time a web browser hits the
498 main URL.
500 The status plugins can also subscribe to hear about new Builds as they
501 occur: this is used by the MailNotifier to create new email messages
502 for each recently-completed Build.
504 The Status object records the status of old builds on disk in the
505 buildmaster's base directory. This allows it to return information
506 about historical builds.
508 There are also status objects that correspond to Schedulers and
509 BuildSlaves. These allow status plugins to report information about
510 upcoming builds, and the online/offline status of each buildslave.
513 @node Control Flow,  , System Architecture, Introduction
514 @comment  node-name,  next,  previous,  up
515 @section Control Flow
517 A day in the life of the buildbot:
519 @itemize @bullet
521 @item
522 A developer commits some source code changes to the repository. A hook
523 script or commit trigger of some sort sends information about this
524 change to the buildmaster through one of its configured Change
525 Sources. This notification might arrive via email, or over a network
526 connection (either initiated by the buildmaster as it ``subscribes''
527 to changes, or by the commit trigger as it pushes Changes towards the
528 buildmaster). The Change contains information about who made the
529 change, what files were modified, which revision contains the change,
530 and any checkin comments.
532 @item
533 The buildmaster distributes this change to all of its configured
534 Schedulers. Any ``important'' changes cause the ``tree-stable-timer''
535 to be started, and the Change is added to a list of those that will go
536 into a new Build. When the timer expires, a Build is started on each
537 of a set of configured Builders, all compiling/testing the same source
538 code. Unless configured otherwise, all Builds run in parallel on the
539 various buildslaves.
541 @item
542 The Build consists of a series of Steps. Each Step causes some number
543 of commands to be invoked on the remote buildslave associated with
544 that Builder. The first step is almost always to perform a checkout of
545 the appropriate revision from the same VC system that produced the
546 Change. The rest generally perform a compile and run unit tests. As
547 each Step runs, the buildslave reports back command output and return
548 status to the buildmaster.
550 @item
551 As the Build runs, status messages like ``Build Started'', ``Step
552 Started'', ``Build Finished'', etc, are published to a collection of
553 Status Targets. One of these targets is usually the HTML ``Waterfall''
554 display, which shows a chronological list of events, and summarizes
555 the results of the most recent build at the top of each column.
556 Developers can periodically check this page to see how their changes
557 have fared. If they see red, they know that they've made a mistake and
558 need to fix it. If they see green, they know that they've done their
559 duty and don't need to worry about their change breaking anything.
561 @item
562 If a MailNotifier status target is active, the completion of a build
563 will cause email to be sent to any developers whose Changes were
564 incorporated into this Build. The MailNotifier can be configured to
565 only send mail upon failing builds, or for builds which have just
566 transitioned from passing to failing. Other status targets can provide
567 similar real-time notification via different communication channels,
568 like IRC.
570 @end itemize
573 @node Installation, Concepts, Introduction, Top
574 @chapter Installation
576 @menu
577 * Requirements::                
578 * Installing the code::         
579 * Creating a buildmaster::      
580 * Creating a buildslave::       
581 * Launching the daemons::       
582 * Logfiles::                    
583 * Shutdown::                    
584 * Maintenance::                 
585 * Troubleshooting::             
586 @end menu
588 @node Requirements, Installing the code, Installation, Installation
589 @section Requirements
591 At a bare minimum, you'll need the following (for both the buildmaster
592 and a buildslave):
594 @itemize @bullet
595 @item
596 Python: http://www.python.org
598 Buildbot requires python-2.3 or later, and is primarily developed
599 against python-2.4. It is also tested against python-2.5 .
601 @item
602 Twisted: http://twistedmatrix.com
604 Both the buildmaster and the buildslaves require Twisted-2.0.x or
605 later. It has been tested against all releases of Twisted up to
606 Twisted-2.5.0 (the most recent as of this writing). As always, the
607 most recent version is recommended.
609 Twisted is delivered as a collection of subpackages. You'll need at
610 least "Twisted" (the core package), and you'll also want TwistedMail,
611 TwistedWeb, and TwistedWords (for sending email, serving a web status
612 page, and delivering build status via IRC, respectively). You might
613 also want TwistedConch (for the encrypted Manhole debug port). Note
614 that Twisted requires ZopeInterface to be installed as well.
616 @end itemize
618 Certain other packages may be useful on the system running the
619 buildmaster:
621 @itemize @bullet
622 @item
623 CVSToys: http://purl.net/net/CVSToys
625 If your buildmaster uses FreshCVSSource to receive change notification
626 from a cvstoys daemon, it will require CVSToys be installed (tested
627 with CVSToys-1.0.10). If the it doesn't use that source (i.e. if you
628 only use a mail-parsing change source, or the SVN notification
629 script), you will not need CVSToys.
631 @end itemize
633 And of course, your project's build process will impose additional
634 requirements on the buildslaves. These hosts must have all the tools
635 necessary to compile and test your project's source code.
638 @node Installing the code, Creating a buildmaster, Requirements, Installation
639 @section Installing the code
641 @cindex installation
643 The Buildbot is installed using the standard python @code{distutils}
644 module. After unpacking the tarball, the process is:
646 @example
647 python setup.py build
648 python setup.py install
649 @end example
651 where the install step may need to be done as root. This will put the
652 bulk of the code in somewhere like
653 /usr/lib/python2.3/site-packages/buildbot . It will also install the
654 @code{buildbot} command-line tool in /usr/bin/buildbot.
656 To test this, shift to a different directory (like /tmp), and run:
658 @example
659 buildbot --version
660 @end example
662 If it shows you the versions of Buildbot and Twisted, the install went
663 ok. If it says @code{no such command} or it gets an @code{ImportError}
664 when it tries to load the libaries, then something went wrong.
665 @code{pydoc buildbot} is another useful diagnostic tool.
667 Windows users will find these files in other places. You will need to
668 make sure that python can find the libraries, and will probably find
669 it convenient to have @code{buildbot} on your PATH.
671 If you wish, you can run the buildbot unit test suite like this:
673 @example
674 PYTHONPATH=. trial buildbot.test
675 @end example
677 This should run up to 192 tests, depending upon what VC tools you have
678 installed. On my desktop machine it takes about five minutes to
679 complete. Nothing should fail, a few might be skipped. If any of the
680 tests fail, you should stop and investigate the cause before
681 continuing the installation process, as it will probably be easier to
682 track down the bug early.
684 If you cannot or do not wish to install the buildbot into a site-wide
685 location like @file{/usr} or @file{/usr/local}, you can also install
686 it into the account's home directory. Do the install command like
687 this:
689 @example
690 python setup.py install --home=~
691 @end example
693 That will populate @file{~/lib/python} and create
694 @file{~/bin/buildbot}. Make sure this lib directory is on your
695 @code{PYTHONPATH}.
698 @node Creating a buildmaster, Creating a buildslave, Installing the code, Installation
699 @section Creating a buildmaster
701 As you learned earlier (@pxref{System Architecture}), the buildmaster
702 runs on a central host (usually one that is publically visible, so
703 everybody can check on the status of the project), and controls all
704 aspects of the buildbot system. Let us call this host
705 @code{buildbot.example.org}.
707 You may wish to create a separate user account for the buildmaster,
708 perhaps named @code{buildmaster}. This can help keep your personal
709 configuration distinct from that of the buildmaster and is useful if
710 you have to use a mail-based notification system (@pxref{Change
711 Sources}). However, the Buildbot will work just fine with your regular
712 user account.
714 You need to choose a directory for the buildmaster, called the
715 @code{basedir}. This directory will be owned by the buildmaster, which
716 will use configuration files therein, and create status files as it
717 runs. @file{~/Buildbot} is a likely value. If you run multiple
718 buildmasters in the same account, or if you run both masters and
719 slaves, you may want a more distinctive name like
720 @file{~/Buildbot/master/gnomovision} or
721 @file{~/Buildmasters/fooproject}. If you are using a separate user
722 account, this might just be @file{~buildmaster/masters/fooproject}.
724 Once you've picked a directory, use the @command{buildbot
725 create-master} command to create the directory and populate it with
726 startup files:
728 @example
729 buildbot create-master @var{basedir}
730 @end example
732 You will need to create a configuration file (@pxref{Configuration})
733 before starting the buildmaster. Most of the rest of this manual is
734 dedicated to explaining how to do this. A sample configuration file is
735 placed in the working directory, named @file{master.cfg.sample}, which
736 can be copied to @file{master.cfg} and edited to suit your purposes.
738 (Internal details: This command creates a file named
739 @file{buildbot.tac} that contains all the state necessary to create
740 the buildmaster. Twisted has a tool called @code{twistd} which can use
741 this .tac file to create and launch a buildmaster instance. twistd
742 takes care of logging and daemonization (running the program in the
743 background). @file{/usr/bin/buildbot} is a front end which runs twistd
744 for you.)
746 In addition to @file{buildbot.tac}, a small @file{Makefile.sample} is
747 installed. This can be used as the basis for customized daemon startup,
748 @xref{Launching the daemons}.
751 @node Creating a buildslave, Launching the daemons, Creating a buildmaster, Installation
752 @section Creating a buildslave
754 Typically, you will be adding a buildslave to an existing buildmaster,
755 to provide additional architecture coverage. The buildbot
756 administrator will give you several pieces of information necessary to
757 connect to the buildmaster. You should also be somewhat familiar with
758 the project being tested, so you can troubleshoot build problems
759 locally.
761 The buildbot exists to make sure that the project's stated ``how to
762 build it'' process actually works. To this end, the buildslave should
763 run in an environment just like that of your regular developers.
764 Typically the project build process is documented somewhere
765 (@file{README}, @file{INSTALL}, etc), in a document that should
766 mention all library dependencies and contain a basic set of build
767 instructions. This document will be useful as you configure the host
768 and account in which the buildslave runs.
770 Here's a good checklist for setting up a buildslave:
772 @enumerate
773 @item
774 Set up the account
776 It is recommended (although not mandatory) to set up a separate user
777 account for the buildslave. This account is frequently named
778 @code{buildbot} or @code{buildslave}. This serves to isolate your
779 personal working environment from that of the slave's, and helps to
780 minimize the security threat posed by letting possibly-unknown
781 contributors run arbitrary code on your system. The account should
782 have a minimum of fancy init scripts.
784 @item
785 Install the buildbot code
787 Follow the instructions given earlier (@pxref{Installing the code}).
788 If you use a separate buildslave account, and you didn't install the
789 buildbot code to a shared location, then you will need to install it
790 with @code{--home=~} for each account that needs it.
792 @item
793 Set up the host
795 Make sure the host can actually reach the buildmaster. Usually the
796 buildmaster is running a status webserver on the same machine, so
797 simply point your web browser at it and see if you can get there.
798 Install whatever additional packages or libraries the project's
799 INSTALL document advises. (or not: if your buildslave is supposed to
800 make sure that building without optional libraries still works, then
801 don't install those libraries).
803 Again, these libraries don't necessarily have to be installed to a
804 site-wide shared location, but they must be available to your build
805 process. Accomplishing this is usually very specific to the build
806 process, so installing them to @file{/usr} or @file{/usr/local} is
807 usually the best approach.
809 @item
810 Test the build process
812 Follow the instructions in the INSTALL document, in the buildslave's
813 account. Perform a full CVS (or whatever) checkout, configure, make,
814 run tests, etc. Confirm that the build works without manual fussing.
815 If it doesn't work when you do it by hand, it will be unlikely to work
816 when the buildbot attempts to do it in an automated fashion.
818 @item
819 Choose a base directory
821 This should be somewhere in the buildslave's account, typically named
822 after the project which is being tested. The buildslave will not touch
823 any file outside of this directory. Something like @file{~/Buildbot}
824 or @file{~/Buildslaves/fooproject} is appropriate.
826 @item
827 Get the buildmaster host/port, botname, and password
829 When the buildbot admin configures the buildmaster to accept and use
830 your buildslave, they will provide you with the following pieces of
831 information:
833 @itemize @bullet
834 @item
835 your buildslave's name
836 @item
837 the password assigned to your buildslave
838 @item
839 the hostname and port number of the buildmaster, i.e. buildbot.example.org:8007
840 @end itemize
842 @item
843 Create the buildslave
845 Now run the 'buildbot' command as follows:
847 @example
848 buildbot create-slave @var{BASEDIR} @var{MASTERHOST}:@var{PORT} @var{SLAVENAME} @var{PASSWORD}
849 @end example
851 This will create the base directory and a collection of files inside,
852 including the @file{buildbot.tac} file that contains all the
853 information you passed to the @code{buildbot} command.
855 @item
856 Fill in the hostinfo files
858 When it first connects, the buildslave will send a few files up to the
859 buildmaster which describe the host that it is running on. These files
860 are presented on the web status display so that developers have more
861 information to reproduce any test failures that are witnessed by the
862 buildbot. There are sample files in the @file{info} subdirectory of
863 the buildbot's base directory. You should edit these to correctly
864 describe you and your host.
866 @file{BASEDIR/info/admin} should contain your name and email address.
867 This is the ``buildslave admin address'', and will be visible from the
868 build status page (so you may wish to munge it a bit if
869 address-harvesting spambots are a concern).
871 @file{BASEDIR/info/host} should be filled with a brief description of
872 the host: OS, version, memory size, CPU speed, versions of relevant
873 libraries installed, and finally the version of the buildbot code
874 which is running the buildslave.
876 If you run many buildslaves, you may want to create a single
877 @file{~buildslave/info} file and share it among all the buildslaves
878 with symlinks.
880 @end enumerate
882 @menu
883 * Buildslave Options::          
884 @end menu
886 @node Buildslave Options,  , Creating a buildslave, Creating a buildslave
887 @subsection Buildslave Options
889 There are a handful of options you might want to use when creating the
890 buildslave with the @command{buildbot create-slave <options> DIR <params>}
891 command. You can type @command{buildbot create-slave --help} for a summary.
892 To use these, just include them on the @command{buildbot create-slave}
893 command line, like this:
895 @example
896 buildbot create-slave --umask=022 ~/buildslave buildmaster.example.org:42012 myslavename mypasswd
897 @end example
899 @table @code
900 @item --usepty
901 This is a boolean flag that tells the buildslave whether to launch
902 child processes in a PTY (the default) or with regular pipes. The
903 advantage of using a PTY is that ``grandchild'' processes are more
904 likely to be cleaned up if the build is interrupted or times out
905 (since it enables the use of a ``process group'' in which all child
906 processes will be placed). The disadvantages: some forms of Unix have
907 problems with PTYs, some of your unit tests may behave differently
908 when run under a PTY (generally those which check to see if they are
909 being run interactively), and PTYs will merge the stdout and stderr
910 streams into a single output stream (which means the red-vs-black
911 coloring in the logfiles will be lost). If you encounter problems, you
912 can add @code{--usepty=0} to disable the use of PTYs. Note that
913 windows buildslaves never use PTYs.
915 @item --umask
916 This is a string (generally an octal representation of an integer)
917 which will cause the buildslave process' ``umask'' value to be set
918 shortly after initialization. The ``twistd'' daemonization utility
919 forces the umask to 077 at startup (which means that all files created
920 by the buildslave or its child processes will be unreadable by any
921 user other than the buildslave account). If you want build products to
922 be readable by other accounts, you can add @code{--umask=022} to tell
923 the buildslave to fix the umask after twistd clobbers it. If you want
924 build products to be @emph{writable} by other accounts too, use
925 @code{--umask=000}, but this is likely to be a security problem.
927 @item --keepalive
928 This is a number that indicates how frequently ``keepalive'' messages
929 should be sent from the buildslave to the buildmaster, expressed in
930 seconds. The default (600) causes a message to be sent to the
931 buildmaster at least once every 10 minutes. To set this to a lower
932 value, use e.g. @code{--keepalive=120}.
934 If the buildslave is behind a NAT box or stateful firewall, these
935 messages may help to keep the connection alive: some NAT boxes tend to
936 forget about a connection if it has not been used in a while. When
937 this happens, the buildmaster will think that the buildslave has
938 disappeared, and builds will time out. Meanwhile the buildslave will
939 not realize than anything is wrong.
941 @end table
944 @node Launching the daemons, Logfiles, Creating a buildslave, Installation
945 @section Launching the daemons
947 Both the buildmaster and the buildslave run as daemon programs. To
948 launch them, pass the working directory to the @code{buildbot}
949 command:
951 @example
952 buildbot start @var{BASEDIR}
953 @end example
955 This command will start the daemon and then return, so normally it
956 will not produce any output. To verify that the programs are indeed
957 running, look for a pair of files named @file{twistd.log} and
958 @file{twistd.pid} that should be created in the working directory.
959 @file{twistd.pid} contains the process ID of the newly-spawned daemon.
961 When the buildslave connects to the buildmaster, new directories will
962 start appearing in its base directory. The buildmaster tells the slave
963 to create a directory for each Builder which will be using that slave.
964 All build operations are performed within these directories: CVS
965 checkouts, compiles, and tests.
967 Once you get everything running, you will want to arrange for the
968 buildbot daemons to be started at boot time. One way is to use
969 @code{cron}, by putting them in a @@reboot crontab entry@footnote{this
970 @@reboot syntax is understood by Vixie cron, which is the flavor
971 usually provided with linux systems. Other unices may have a cron that
972 doesn't understand @@reboot}:
974 @example
975 @@reboot buildbot start @var{BASEDIR}
976 @end example
978 When you run @command{crontab} to set this up, remember to do it as
979 the buildmaster or buildslave account! If you add this to your crontab
980 when running as your regular account (or worse yet, root), then the
981 daemon will run as the wrong user, quite possibly as one with more
982 authority than you intended to provide.
984 It is important to remember that the environment provided to cron jobs
985 and init scripts can be quite different that your normal runtime.
986 There may be fewer environment variables specified, and the PATH may
987 be shorter than usual. It is a good idea to test out this method of
988 launching the buildslave by using a cron job with a time in the near
989 future, with the same command, and then check @file{twistd.log} to
990 make sure the slave actually started correctly. Common problems here
991 are for @file{/usr/local} or @file{~/bin} to not be on your
992 @code{PATH}, or for @code{PYTHONPATH} to not be set correctly.
993 Sometimes @code{HOME} is messed up too.
995 To modify the way the daemons are started (perhaps you want to set
996 some environment variables first, or perform some cleanup each time),
997 you can create a file named @file{Makefile.buildbot} in the base
998 directory. When the @file{buildbot} front-end tool is told to
999 @command{start} the daemon, and it sees this file (and
1000 @file{/usr/bin/make} exists), it will do @command{make -f
1001 Makefile.buildbot start} instead of its usual action (which involves
1002 running @command{twistd}). When the buildmaster or buildslave is
1003 installed, a @file{Makefile.sample} is created which implements the
1004 same behavior as the the @file{buildbot} tool uses, so if you want to
1005 customize the process, just copy @file{Makefile.sample} to
1006 @file{Makefile.buildbot} and edit it as necessary.
1008 @node Logfiles, Shutdown, Launching the daemons, Installation
1009 @section Logfiles
1011 @cindex logfiles
1013 While a buildbot daemon runs, it emits text to a logfile, named
1014 @file{twistd.log}. A command like @code{tail -f twistd.log} is useful
1015 to watch the command output as it runs.
1017 The buildmaster will announce any errors with its configuration file
1018 in the logfile, so it is a good idea to look at the log at startup
1019 time to check for any problems. Most buildmaster activities will cause
1020 lines to be added to the log.
1022 @node Shutdown, Maintenance, Logfiles, Installation
1023 @section Shutdown
1025 To stop a buildmaster or buildslave manually, use:
1027 @example
1028 buildbot stop @var{BASEDIR}
1029 @end example
1031 This simply looks for the @file{twistd.pid} file and kills whatever
1032 process is identified within.
1034 At system shutdown, all processes are sent a @code{SIGKILL}. The
1035 buildmaster and buildslave will respond to this by shutting down
1036 normally.
1038 The buildmaster will respond to a @code{SIGHUP} by re-reading its
1039 config file. The following shortcut is available:
1041 @example
1042 buildbot reconfig @var{BASEDIR}
1043 @end example
1045 When you update the Buildbot code to a new release, you will need to
1046 restart the buildmaster and/or buildslave before it can take advantage
1047 of the new code. You can do a @code{buildbot stop @var{BASEDIR}} and
1048 @code{buildbot start @var{BASEDIR}} in quick succession, or you can
1049 use the @code{restart} shortcut, which does both steps for you:
1051 @example
1052 buildbot restart @var{BASEDIR}
1053 @end example
1056 @node Maintenance, Troubleshooting, Shutdown, Installation
1057 @section Maintenance
1059 It is a good idea to check the buildmaster's status page every once in
1060 a while, to see if your buildslave is still online. Eventually the
1061 buildbot will probably be enhanced to send you email (via the
1062 @file{info/admin} email address) when the slave has been offline for
1063 more than a few hours.
1065 If you find you can no longer provide a buildslave to the project, please
1066 let the project admins know, so they can put out a call for a
1067 replacement.
1069 The Buildbot records status and logs output continually, each time a
1070 build is performed. The status tends to be small, but the build logs
1071 can become quite large. Each build and log are recorded in a separate
1072 file, arranged hierarchically under the buildmaster's base directory.
1073 To prevent these files from growing without bound, you should
1074 periodically delete old build logs. A simple cron job to delete
1075 anything older than, say, two weeks should do the job. The only trick
1076 is to leave the @file{buildbot.tac} and other support files alone, for
1077 which find's @code{-mindepth} argument helps skip everything in the
1078 top directory. You can use something like the following:
1080 @example
1081 @@weekly cd BASEDIR && find . -mindepth 2 -type f -mtime +14 -exec rm @{@} \;
1082 @@weekly cd BASEDIR && find twistd.log* -mtime +14 -exec rm @{@} \;
1083 @end example
1085 @node Troubleshooting,  , Maintenance, Installation
1086 @section Troubleshooting
1088 Here are a few hints on diagnosing common problems.
1090 @menu
1091 * Starting the buildslave::     
1092 * Connecting to the buildmaster::  
1093 * Forcing Builds::              
1094 @end menu
1096 @node Starting the buildslave, Connecting to the buildmaster, Troubleshooting, Troubleshooting
1097 @subsection Starting the buildslave
1099 Cron jobs are typically run with a minimal shell (@file{/bin/sh}, not
1100 @file{/bin/bash}), and tilde expansion is not always performed in such
1101 commands. You may want to use explicit paths, because the @code{PATH}
1102 is usually quite short and doesn't include anything set by your
1103 shell's startup scripts (@file{.profile}, @file{.bashrc}, etc). If
1104 you've installed buildbot (or other python libraries) to an unusual
1105 location, you may need to add a @code{PYTHONPATH} specification (note
1106 that python will do tilde-expansion on @code{PYTHONPATH} elements by
1107 itself). Sometimes it is safer to fully-specify everything:
1109 @example
1110 @@reboot PYTHONPATH=~/lib/python /usr/local/bin/buildbot start /usr/home/buildbot/basedir
1111 @end example
1113 Take the time to get the @@reboot job set up. Otherwise, things will work
1114 fine for a while, but the first power outage or system reboot you have will
1115 stop the buildslave with nothing but the cries of sorrowful developers to
1116 remind you that it has gone away.
1118 @node Connecting to the buildmaster, Forcing Builds, Starting the buildslave, Troubleshooting
1119 @subsection Connecting to the buildmaster
1121 If the buildslave cannot connect to the buildmaster, the reason should
1122 be described in the @file{twistd.log} logfile. Some common problems
1123 are an incorrect master hostname or port number, or a mistyped bot
1124 name or password. If the buildslave loses the connection to the
1125 master, it is supposed to attempt to reconnect with an
1126 exponentially-increasing backoff. Each attempt (and the time of the
1127 next attempt) will be logged. If you get impatient, just manually stop
1128 and re-start the buildslave.
1130 When the buildmaster is restarted, all slaves will be disconnected,
1131 and will attempt to reconnect as usual. The reconnect time will depend
1132 upon how long the buildmaster is offline (i.e. how far up the
1133 exponential backoff curve the slaves have travelled). Again,
1134 @code{buildbot stop @var{BASEDIR}; buildbot start @var{BASEDIR}} will
1135 speed up the process.
1137 @node Forcing Builds,  , Connecting to the buildmaster, Troubleshooting
1138 @subsection Forcing Builds
1140 From the buildmaster's main status web page, you can force a build to
1141 be run on your build slave. Figure out which column is for a builder
1142 that runs on your slave, click on that builder's name, and the page
1143 that comes up will have a ``Force Build'' button. Fill in the form,
1144 hit the button, and a moment later you should see your slave's
1145 @file{twistd.log} filling with commands being run. Using @code{pstree}
1146 or @code{top} should also reveal the cvs/make/gcc/etc processes being
1147 run by the buildslave. Note that the same web page should also show
1148 the @file{admin} and @file{host} information files that you configured
1149 earlier.
1151 @node Concepts, Configuration, Installation, Top
1152 @chapter Concepts
1154 This chapter defines some of the basic concepts that the Buildbot
1155 uses. You'll need to understand how the Buildbot sees the world to
1156 configure it properly.
1158 @menu
1159 * Version Control Systems::     
1160 * Schedulers::                  
1161 * BuildSet::                    
1162 * BuildRequest::                
1163 * Builder::                     
1164 * Users::                       
1165 @end menu
1167 @node Version Control Systems, Schedulers, Concepts, Concepts
1168 @section Version Control Systems
1170 @cindex Version Control
1172 These source trees come from a Version Control System of some kind.
1173 CVS and Subversion are two popular ones, but the Buildbot supports
1174 others. All VC systems have some notion of an upstream
1175 @code{repository} which acts as a server@footnote{except Darcs, but
1176 since the Buildbot never modifies its local source tree we can ignore
1177 the fact that Darcs uses a less centralized model}, from which clients
1178 can obtain source trees according to various parameters. The VC
1179 repository provides source trees of various projects, for different
1180 branches, and from various points in time. The first thing we have to
1181 do is to specify which source tree we want to get.
1183 @menu
1184 * Generalizing VC Systems::     
1185 * Source Tree Specifications::  
1186 * How Different VC Systems Specify Sources::  
1187 * Attributes of Changes::       
1188 @end menu
1190 @node Generalizing VC Systems, Source Tree Specifications, Version Control Systems, Version Control Systems
1191 @subsection Generalizing VC Systems
1193 For the purposes of the Buildbot, we will try to generalize all VC
1194 systems as having repositories that each provide sources for a variety
1195 of projects. Each project is defined as a directory tree with source
1196 files. The individual files may each have revisions, but we ignore
1197 that and treat the project as a whole as having a set of revisions
1198 (CVS is really the only VC system still in widespread use that has
1199 per-file revisions.. everything modern has moved to atomic tree-wide
1200 changesets). Each time someone commits a change to the project, a new
1201 revision becomes available. These revisions can be described by a
1202 tuple with two items: the first is a branch tag, and the second is
1203 some kind of revision stamp or timestamp. Complex projects may have
1204 multiple branch tags, but there is always a default branch. The
1205 timestamp may be an actual timestamp (such as the -D option to CVS),
1206 or it may be a monotonically-increasing transaction number (such as
1207 the change number used by SVN and P4, or the revision number used by
1208 Arch/Baz/Bazaar, or a labeled tag used in CVS)@footnote{many VC
1209 systems provide more complexity than this: in particular the local
1210 views that P4 and ClearCase can assemble out of various source
1211 directories are more complex than we're prepared to take advantage of
1212 here}. The SHA1 revision ID used by Monotone and Mercurial is also a
1213 kind of revision stamp, in that it specifies a unique copy of the
1214 source tree, as does a Darcs ``context'' file.
1216 When we aren't intending to make any changes to the sources we check out
1217 (at least not any that need to be committed back upstream), there are two
1218 basic ways to use a VC system:
1220 @itemize @bullet
1221 @item
1222 Retrieve a specific set of source revisions: some tag or key is used
1223 to index this set, which is fixed and cannot be changed by subsequent
1224 developers committing new changes to the tree. Releases are built from
1225 tagged revisions like this, so that they can be rebuilt again later
1226 (probably with controlled modifications).
1227 @item
1228 Retrieve the latest sources along a specific branch: some tag is used
1229 to indicate which branch is to be used, but within that constraint we want
1230 to get the latest revisions.
1231 @end itemize
1233 Build personnel or CM staff typically use the first approach: the
1234 build that results is (ideally) completely specified by the two
1235 parameters given to the VC system: repository and revision tag. This
1236 gives QA and end-users something concrete to point at when reporting
1237 bugs. Release engineers are also reportedly fond of shipping code that
1238 can be traced back to a concise revision tag of some sort.
1240 Developers are more likely to use the second approach: each morning
1241 the developer does an update to pull in the changes committed by the
1242 team over the last day. These builds are not easy to fully specify: it
1243 depends upon exactly when you did a checkout, and upon what local
1244 changes the developer has in their tree. Developers do not normally
1245 tag each build they produce, because there is usually significant
1246 overhead involved in creating these tags. Recreating the trees used by
1247 one of these builds can be a challenge. Some VC systems may provide
1248 implicit tags (like a revision number), while others may allow the use
1249 of timestamps to mean ``the state of the tree at time X'' as opposed
1250 to a tree-state that has been explicitly marked.
1252 The Buildbot is designed to help developers, so it usually works in
1253 terms of @emph{the latest} sources as opposed to specific tagged
1254 revisions. However, it would really prefer to build from reproducible
1255 source trees, so implicit revisions are used whenever possible.
1257 @node Source Tree Specifications, How Different VC Systems Specify Sources, Generalizing VC Systems, Version Control Systems
1258 @subsection Source Tree Specifications
1260 So for the Buildbot's purposes we treat each VC system as a server
1261 which can take a list of specifications as input and produce a source
1262 tree as output. Some of these specifications are static: they are
1263 attributes of the builder and do not change over time. Others are more
1264 variable: each build will have a different value. The repository is
1265 changed over time by a sequence of Changes, each of which represents a
1266 single developer making changes to some set of files. These Changes
1267 are cumulative@footnote{Monotone's @emph{multiple heads} feature
1268 violates this assumption of cumulative Changes, but in most situations
1269 the changes don't occur frequently enough for this to be a significant
1270 problem}.
1272 For normal builds, the Buildbot wants to get well-defined source trees
1273 that contain specific Changes, and exclude other Changes that may have
1274 occurred after the desired ones. We assume that the Changes arrive at
1275 the buildbot (through one of the mechanisms described in @pxref{Change
1276 Sources}) in the same order in which they are committed to the
1277 repository. The Buildbot waits for the tree to become ``stable''
1278 before initiating a build, for two reasons. The first is that
1279 developers frequently make multiple related commits in quick
1280 succession, even when the VC system provides ways to make atomic
1281 transactions involving multiple files at the same time. Running a
1282 build in the middle of these sets of changes would use an inconsistent
1283 set of source files, and is likely to fail (and is certain to be less
1284 useful than a build which uses the full set of changes). The
1285 tree-stable-timer is intended to avoid these useless builds that
1286 include some of the developer's changes but not all. The second reason
1287 is that some VC systems (i.e. CVS) do not provide repository-wide
1288 transaction numbers, so that timestamps are the only way to refer to
1289 a specific repository state. These timestamps may be somewhat
1290 ambiguous, due to processing and notification delays. By waiting until
1291 the tree has been stable for, say, 10 minutes, we can choose a
1292 timestamp from the middle of that period to use for our source
1293 checkout, and then be reasonably sure that any clock-skew errors will
1294 not cause the build to be performed on an inconsistent set of source
1295 files.
1297 The Schedulers always use the tree-stable-timer, with a timeout that
1298 is configured to reflect a reasonable tradeoff between build latency
1299 and change frequency. When the VC system provides coherent
1300 repository-wide revision markers (such as Subversion's revision
1301 numbers, or in fact anything other than CVS's timestamps), the
1302 resulting Build is simply performed against a source tree defined by
1303 that revision marker. When the VC system does not provide this, a
1304 timestamp from the middle of the tree-stable period is used to
1305 generate the source tree@footnote{this @code{checkoutDelay} defaults
1306 to half the tree-stable timer, but it can be overridden with an
1307 argument to the Source Step}.
1309 @node How Different VC Systems Specify Sources, Attributes of Changes, Source Tree Specifications, Version Control Systems
1310 @subsection How Different VC Systems Specify Sources
1312 For CVS, the static specifications are @code{repository} and
1313 @code{module}. In addition to those, each build uses a timestamp (or
1314 omits the timestamp to mean @code{the latest}) and @code{branch tag}
1315 (which defaults to HEAD). These parameters collectively specify a set
1316 of sources from which a build may be performed.
1318 @uref{http://subversion.tigris.org, Subversion} combines the
1319 repository, module, and branch into a single @code{Subversion URL}
1320 parameter. Within that scope, source checkouts can be specified by a
1321 numeric @code{revision number} (a repository-wide
1322 monotonically-increasing marker, such that each transaction that
1323 changes the repository is indexed by a different revision number), or
1324 a revision timestamp. When branches are used, the repository and
1325 module form a static @code{baseURL}, while each build has a
1326 @code{revision number} and a @code{branch} (which defaults to a
1327 statically-specified @code{defaultBranch}). The @code{baseURL} and
1328 @code{branch} are simply concatenated together to derive the
1329 @code{svnurl} to use for the checkout.
1331 @uref{http://www.perforce.com/, Perforce} is similar. The server
1332 is specified through a @code{P4PORT} parameter. Module and branch
1333 are specified in a single depot path, and revisions are
1334 depot-wide. When branches are used, the @code{p4base} and
1335 @code{defaultBranch} are concatenated together to produce the depot
1336 path.
1338 @uref{http://wiki.gnuarch.org/, Arch} and
1339 @uref{http://bazaar.canonical.com/, Bazaar} specify a repository by
1340 URL, as well as a @code{version} which is kind of like a branch name.
1341 Arch uses the word @code{archive} to represent the repository. Arch
1342 lets you push changes from one archive to another, removing the strict
1343 centralization required by CVS and SVN. It retains the distinction
1344 between repository and working directory that most other VC systems
1345 use. For complex multi-module directory structures, Arch has a
1346 built-in @code{build config} layer with which the checkout process has
1347 two steps. First, an initial bootstrap checkout is performed to
1348 retrieve a set of build-config files. Second, one of these files is
1349 used to figure out which archives/modules should be used to populate
1350 subdirectories of the initial checkout.
1352 Builders which use Arch and Bazaar therefore have a static archive
1353 @code{url}, and a default ``branch'' (which is a string that specifies
1354 a complete category--branch--version triple). Each build can have its
1355 own branch (the category--branch--version string) to override the
1356 default, as well as a revision number (which is turned into a
1357 --patch-NN suffix when performing the checkout).
1360 @uref{http://bazaar-vcs.org, Bzr} (which is a descendant of
1361 Arch/Bazaar, and is frequently referred to as ``Bazaar'') has the same
1362 sort of repository-vs-workspace model as Arch, but the repository data
1363 can either be stored inside the working directory or kept elsewhere
1364 (either on the same machine or on an entirely different machine). For
1365 the purposes of Buildbot (which never commits changes), the repository
1366 is specified with a URL and a revision number.
1368 The most common way to obtain read-only access to a bzr tree is via
1369 HTTP, simply by making the repository visible through a web server
1370 like Apache. Bzr can also use FTP and SFTP servers, if the buildslave
1371 process has sufficient privileges to access them. Higher performance
1372 can be obtained by running a special Bazaar-specific server. None of
1373 these matter to the buildbot: the repository URL just has to match the
1374 kind of server being used. The @code{repoURL} argument provides the
1375 location of the repository.
1377 Branches are expressed as subdirectories of the main central
1378 repository, which means that if branches are being used, the BZR step
1379 is given a @code{baseURL} and @code{defaultBranch} instead of getting
1380 the @code{repoURL} argument.
1383 @uref{http://abridgegame.org/darcs/, Darcs} doesn't really have the
1384 notion of a single master repository. Nor does it really have
1385 branches. In Darcs, each working directory is also a repository, and
1386 there are operations to push and pull patches from one of these
1387 @code{repositories} to another. For the Buildbot's purposes, all you
1388 need to do is specify the URL of a repository that you want to build
1389 from. The build slave will then pull the latest patches from that
1390 repository and build them. Multiple branches are implemented by using
1391 multiple repositories (possibly living on the same server).
1393 Builders which use Darcs therefore have a static @code{repourl} which
1394 specifies the location of the repository. If branches are being used,
1395 the source Step is instead configured with a @code{baseURL} and a
1396 @code{defaultBranch}, and the two strings are simply concatenated
1397 together to obtain the repository's URL. Each build then has a
1398 specific branch which replaces @code{defaultBranch}, or just uses the
1399 default one. Instead of a revision number, each build can have a
1400 ``context'', which is a string that records all the patches that are
1401 present in a given tree (this is the output of @command{darcs changes
1402 --context}, and is considerably less concise than, e.g. Subversion's
1403 revision number, but the patch-reordering flexibility of Darcs makes
1404 it impossible to provide a shorter useful specification).
1406 @uref{http://selenic.com/mercurial, Mercurial} is like Darcs, in that
1407 each branch is stored in a separate repository. The @code{repourl},
1408 @code{baseURL}, and @code{defaultBranch} arguments are all handled the
1409 same way as with Darcs. The ``revision'', however, is the hash
1410 identifier returned by @command{hg identify}.
1413 @node Attributes of Changes,  , How Different VC Systems Specify Sources, Version Control Systems
1414 @subsection Attributes of Changes
1416 @heading Who
1418 Each Change has a @code{who} attribute, which specifies which
1419 developer is responsible for the change. This is a string which comes
1420 from a namespace controlled by the VC repository. Frequently this
1421 means it is a username on the host which runs the repository, but not
1422 all VC systems require this (Arch, for example, uses a fully-qualified
1423 @code{Arch ID}, which looks like an email address, as does Darcs).
1424 Each StatusNotifier will map the @code{who} attribute into something
1425 appropriate for their particular means of communication: an email
1426 address, an IRC handle, etc.
1428 @heading Files
1430 It also has a list of @code{files}, which are just the tree-relative
1431 filenames of any files that were added, deleted, or modified for this
1432 Change. These filenames are used by the @code{isFileImportant}
1433 function (in the Scheduler) to decide whether it is worth triggering a
1434 new build or not, e.g. the function could use
1435 @code{filename.endswith(".c")} to only run a build if a C file were
1436 checked in. Certain BuildSteps can also use the list of changed files
1437 to run a more targeted series of tests, e.g. the
1438 @code{python_twisted.Trial} step can run just the unit tests that
1439 provide coverage for the modified .py files instead of running the
1440 full test suite.
1442 @heading Comments
1444 The Change also has a @code{comments} attribute, which is a string
1445 containing any checkin comments.
1447 @heading Revision
1449 Each Change can have a @code{revision} attribute, which describes how
1450 to get a tree with a specific state: a tree which includes this Change
1451 (and all that came before it) but none that come after it. If this
1452 information is unavailable, the @code{.revision} attribute will be
1453 @code{None}. These revisions are provided by the ChangeSource, and
1454 consumed by the @code{computeSourceRevision} method in the appropriate
1455 @code{step.Source} class.
1457 @table @samp
1458 @item CVS
1459 @code{revision} is an int, seconds since the epoch
1460 @item SVN
1461 @code{revision} is an int, a transation number (r%d)
1462 @item Darcs
1463 @code{revision} is a large string, the output of @code{darcs changes --context}
1464 @item Mercurial
1465 @code{revision} is a short string (a hash ID), the output of @code{hg identify}
1466 @item Arch/Bazaar
1467 @code{revision} is the full revision ID (ending in --patch-%d)
1468 @item P4
1469 @code{revision} is an int, the transaction number
1470 @end table
1472 @heading Branches
1474 The Change might also have a @code{branch} attribute. This indicates
1475 that all of the Change's files are in the same named branch. The
1476 Schedulers get to decide whether the branch should be built or not.
1478 For VC systems like CVS, Arch, and Monotone, the @code{branch} name is
1479 unrelated to the filename. (that is, the branch name and the filename
1480 inhabit unrelated namespaces). For SVN, branches are expressed as
1481 subdirectories of the repository, so the file's ``svnurl'' is a
1482 combination of some base URL, the branch name, and the filename within
1483 the branch. (In a sense, the branch name and the filename inhabit the
1484 same namespace). Darcs branches are subdirectories of a base URL just
1485 like SVN. Mercurial branches are the same as Darcs.
1487 @table @samp
1488 @item CVS
1489 branch='warner-newfeature', files=['src/foo.c']
1490 @item SVN
1491 branch='branches/warner-newfeature', files=['src/foo.c']
1492 @item Darcs
1493 branch='warner-newfeature', files=['src/foo.c']
1494 @item Mercurial
1495 branch='warner-newfeature', files=['src/foo.c']
1496 @item Arch/Bazaar
1497 branch='buildbot--usebranches--0', files=['buildbot/master.py']
1498 @end table
1500 @heading Links
1502 @c TODO: who is using 'links'? how is it being used?
1504 Finally, the Change might have a @code{links} list, which is intended
1505 to provide a list of URLs to a @emph{viewcvs}-style web page that
1506 provides more detail for this Change, perhaps including the full file
1507 diffs.
1510 @node Schedulers, BuildSet, Version Control Systems, Concepts
1511 @section Schedulers
1513 @cindex Scheduler
1515 Each Buildmaster has a set of @code{Scheduler} objects, each of which
1516 gets a copy of every incoming Change. The Schedulers are responsible
1517 for deciding when Builds should be run. Some Buildbot installations
1518 might have a single Scheduler, while others may have several, each for
1519 a different purpose.
1521 For example, a ``quick'' scheduler might exist to give immediate
1522 feedback to developers, hoping to catch obvious problems in the code
1523 that can be detected quickly. These typically do not run the full test
1524 suite, nor do they run on a wide variety of platforms. They also
1525 usually do a VC update rather than performing a brand-new checkout
1526 each time. You could have a ``quick'' scheduler which used a 30 second
1527 timeout, and feeds a single ``quick'' Builder that uses a VC
1528 @code{mode='update'} setting.
1530 A separate ``full'' scheduler would run more comprehensive tests a
1531 little while later, to catch more subtle problems. This scheduler
1532 would have a longer tree-stable-timer, maybe 30 minutes, and would
1533 feed multiple Builders (with a @code{mode=} of @code{'copy'},
1534 @code{'clobber'}, or @code{'export'}).
1536 The @code{tree-stable-timer} and @code{isFileImportant} decisions are
1537 made by the Scheduler. Dependencies are also implemented here.
1538 Periodic builds (those which are run every N seconds rather than after
1539 new Changes arrive) are triggered by a special @code{Periodic}
1540 Scheduler subclass. The default Scheduler class can also be told to
1541 watch for specific branches, ignoring Changes on other branches. This
1542 may be useful if you have a trunk and a few release branches which
1543 should be tracked, but when you don't want to have the Buildbot pay
1544 attention to several dozen private user branches.
1546 Some Schedulers may trigger builds for other reasons, other than
1547 recent Changes. For example, a Scheduler subclass could connect to a
1548 remote buildmaster and watch for builds of a library to succeed before
1549 triggering a local build that uses that library.
1551 Each Scheduler creates and submits @code{BuildSet} objects to the
1552 @code{BuildMaster}, which is then responsible for making sure the
1553 individual @code{BuildRequests} are delivered to the target
1554 @code{Builders}.
1556 @code{Scheduler} instances are activated by placing them in the
1557 @code{c['schedulers']} list in the buildmaster config file. Each
1558 Scheduler has a unique name.
1561 @node BuildSet, BuildRequest, Schedulers, Concepts
1562 @section BuildSet
1564 @cindex BuildSet
1566 A @code{BuildSet} is the name given to a set of Builds that all
1567 compile/test the same version of the tree on multiple Builders. In
1568 general, all these component Builds will perform the same sequence of
1569 Steps, using the same source code, but on different platforms or
1570 against a different set of libraries.
1572 The @code{BuildSet} is tracked as a single unit, which fails if any of
1573 the component Builds have failed, and therefore can succeed only if
1574 @emph{all} of the component Builds have succeeded. There are two kinds
1575 of status notification messages that can be emitted for a BuildSet:
1576 the @code{firstFailure} type (which fires as soon as we know the
1577 BuildSet will fail), and the @code{Finished} type (which fires once
1578 the BuildSet has completely finished, regardless of whether the
1579 overall set passed or failed).
1581 A @code{BuildSet} is created with a @emph{source stamp} tuple of
1582 (branch, revision, changes, patch), some of which may be None, and a
1583 list of Builders on which it is to be run. They are then given to the
1584 BuildMaster, which is responsible for creating a separate
1585 @code{BuildRequest} for each Builder.
1587 There are a couple of different likely values for the
1588 @code{SourceStamp}:
1590 @table @code
1591 @item (revision=None, changes=[CHANGES], patch=None)
1592 This is a @code{SourceStamp} used when a series of Changes have
1593 triggered a build. The VC step will attempt to check out a tree that
1594 contains CHANGES (and any changes that occurred before CHANGES, but
1595 not any that occurred after them).
1597 @item (revision=None, changes=None, patch=None)
1598 This builds the most recent code on the default branch. This is the
1599 sort of @code{SourceStamp} that would be used on a Build that was
1600 triggered by a user request, or a Periodic scheduler. It is also
1601 possible to configure the VC Source Step to always check out the
1602 latest sources rather than paying attention to the Changes in the
1603 SourceStamp, which will result in same behavior as this.
1605 @item (branch=BRANCH, revision=None, changes=None, patch=None)
1606 This builds the most recent code on the given BRANCH. Again, this is
1607 generally triggered by a user request or Periodic build.
1609 @item (revision=REV, changes=None, patch=(LEVEL, DIFF))
1610 This checks out the tree at the given revision REV, then applies a
1611 patch (using @code{diff -pLEVEL <DIFF}). The @ref{try} feature uses
1612 this kind of @code{SourceStamp}. If @code{patch} is None, the patching
1613 step is bypassed.
1615 @end table
1617 The buildmaster is responsible for turning the @code{BuildSet} into a
1618 set of @code{BuildRequest} objects and queueing them on the
1619 appropriate Builders.
1622 @node BuildRequest, Builder, BuildSet, Concepts
1623 @section BuildRequest
1625 @cindex BuildRequest
1627 A @code{BuildRequest} is a request to build a specific set of sources
1628 on a single specific Builder. Each Builder runs the
1629 @code{BuildRequest} as soon as it can (i.e. when an associated
1630 buildslave becomes free).
1632 The @code{BuildRequest} contains the @code{SourceStamp} specification.
1633 The actual process of running the build (the series of Steps that will
1634 be executed) is implemented by the @code{Build} object. In this future
1635 this might be changed, to have the @code{Build} define @emph{what}
1636 gets built, and a separate @code{BuildProcess} (provided by the
1637 Builder) to define @emph{how} it gets built.
1639 The @code{BuildRequest} may be mergeable with other compatible
1640 @code{BuildRequest}s. Builds that are triggered by incoming Changes
1641 will generally be mergeable. Builds that are triggered by user
1642 requests are generally not, unless they are multiple requests to build
1643 the @emph{latest sources} of the same branch.
1645 @node Builder, Users, BuildRequest, Concepts
1646 @section Builder
1648 @cindex Builder
1650 The @code{Builder} is a long-lived object which controls all Builds of
1651 a given type. Each one is created when the config file is first
1652 parsed, and lives forever (or rather until it is removed from the
1653 config file). It mediates the connections to the buildslaves that do
1654 all the work, and is responsible for creating the @code{Build} objects
1655 that decide @emph{how} a build is performed (i.e., which steps are
1656 executed in what order).
1658 Each @code{Builder} gets a unique name, and the path name of a
1659 directory where it gets to do all its work (there is a
1660 buildmaster-side directory for keeping status information, as well as
1661 a buildslave-side directory where the actual checkout/compile/test
1662 commands are executed). It also gets a @code{BuildFactory}, which is
1663 responsible for creating new @code{Build} instances: because the
1664 @code{Build} instance is what actually performs each build, choosing
1665 the @code{BuildFactory} is the way to specify what happens each time a
1666 build is done.
1668 Each @code{Builder} is associated with one of more @code{BuildSlaves}.
1669 A @code{Builder} which is used to perform OS-X builds (as opposed to
1670 Linux or Solaris builds) should naturally be associated with an
1671 OS-X-based buildslave.
1674 @node Users,  , Builder, Concepts
1675 @section Users
1677 @cindex Users
1679 Buildbot has a somewhat limited awareness of @emph{users}. It assumes
1680 the world consists of a set of developers, each of whom can be
1681 described by a couple of simple attributes. These developers make
1682 changes to the source code, causing builds which may succeed or fail.
1684 Each developer is primarily known through the source control system. Each
1685 Change object that arrives is tagged with a @code{who} field that
1686 typically gives the account name (on the repository machine) of the user
1687 responsible for that change. This string is the primary key by which the
1688 User is known, and is displayed on the HTML status pages and in each Build's
1689 ``blamelist''.
1691 To do more with the User than just refer to them, this username needs to
1692 be mapped into an address of some sort. The responsibility for this mapping
1693 is left up to the status module which needs the address. The core code knows
1694 nothing about email addresses or IRC nicknames, just user names.
1696 @menu
1697 * Doing Things With Users::     
1698 * Email Addresses::             
1699 * IRC Nicknames::               
1700 * Live Status Clients::         
1701 @end menu
1703 @node Doing Things With Users, Email Addresses, Users, Users
1704 @subsection Doing Things With Users
1706 Each Change has a single User who is responsible for that Change. Most
1707 Builds have a set of Changes: the Build represents the first time these
1708 Changes have been built and tested by the Buildbot. The build has a
1709 ``blamelist'' that consists of a simple union of the Users responsible
1710 for all the Build's Changes.
1712 The Build provides (through the IBuildStatus interface) a list of Users
1713 who are ``involved'' in the build. For now this is equal to the
1714 blamelist, but in the future it will be expanded to include a ``build
1715 sheriff'' (a person who is ``on duty'' at that time and responsible for
1716 watching over all builds that occur during their shift), as well as
1717 per-module owners who simply want to keep watch over their domain (chosen by
1718 subdirectory or a regexp matched against the filenames pulled out of the
1719 Changes). The Involved Users are those who probably have an interest in the
1720 results of any given build.
1722 In the future, Buildbot will acquire the concept of ``Problems'',
1723 which last longer than builds and have beginnings and ends. For example, a
1724 test case which passed in one build and then failed in the next is a
1725 Problem. The Problem lasts until the test case starts passing again, at
1726 which point the Problem is said to be ``resolved''.
1728 If there appears to be a code change that went into the tree at the
1729 same time as the test started failing, that Change is marked as being
1730 resposible for the Problem, and the user who made the change is added
1731 to the Problem's ``Guilty'' list. In addition to this user, there may
1732 be others who share responsibility for the Problem (module owners,
1733 sponsoring developers). In addition to the Responsible Users, there
1734 may be a set of Interested Users, who take an interest in the fate of
1735 the Problem.
1737 Problems therefore have sets of Users who may want to be kept aware of
1738 the condition of the problem as it changes over time. If configured, the
1739 Buildbot can pester everyone on the Responsible list with increasing
1740 harshness until the problem is resolved, with the most harshness reserved
1741 for the Guilty parties themselves. The Interested Users may merely be told
1742 when the problem starts and stops, as they are not actually responsible for
1743 fixing anything.
1745 @node Email Addresses, IRC Nicknames, Doing Things With Users, Users
1746 @subsection Email Addresses
1748 The @code{buildbot.status.mail.MailNotifier} class provides a
1749 status target which can send email about the results of each build. It
1750 accepts a static list of email addresses to which each message should be
1751 delivered, but it can also be configured to send mail to the Build's
1752 Interested Users. To do this, it needs a way to convert User names into
1753 email addresses.
1755 For many VC systems, the User Name is actually an account name on the
1756 system which hosts the repository. As such, turning the name into an
1757 email address is a simple matter of appending
1758 ``@@repositoryhost.com''. Some projects use other kinds of mappings
1759 (for example the preferred email address may be at ``project.org''
1760 despite the repository host being named ``cvs.project.org''), and some
1761 VC systems have full separation between the concept of a user and that
1762 of an account on the repository host (like Perforce). Some systems
1763 (like Arch) put a full contact email address in every change.
1765 To convert these names to addresses, the MailNotifier uses an EmailLookup
1766 object. This provides a .getAddress method which accepts a name and
1767 (eventually) returns an address. The default @code{MailNotifier}
1768 module provides an EmailLookup which simply appends a static string,
1769 configurable when the notifier is created. To create more complex behaviors
1770 (perhaps using an LDAP lookup, or using ``finger'' on a central host to
1771 determine a preferred address for the developer), provide a different object
1772 as the @code{lookup} argument.
1774 In the future, when the Problem mechanism has been set up, the Buildbot
1775 will need to send mail to arbitrary Users. It will do this by locating a
1776 MailNotifier-like object among all the buildmaster's status targets, and
1777 asking it to send messages to various Users. This means the User-to-address
1778 mapping only has to be set up once, in your MailNotifier, and every email
1779 message the buildbot emits will take advantage of it.
1781 @node IRC Nicknames, Live Status Clients, Email Addresses, Users
1782 @subsection IRC Nicknames
1784 Like MailNotifier, the @code{buildbot.status.words.IRC} class
1785 provides a status target which can announce the results of each build. It
1786 also provides an interactive interface by responding to online queries
1787 posted in the channel or sent as private messages.
1789 In the future, the buildbot can be configured map User names to IRC
1790 nicknames, to watch for the recent presence of these nicknames, and to
1791 deliver build status messages to the interested parties. Like
1792 @code{MailNotifier} does for email addresses, the @code{IRC} object
1793 will have an @code{IRCLookup} which is responsible for nicknames. The
1794 mapping can be set up statically, or it can be updated by online users
1795 themselves (by claiming a username with some kind of ``buildbot: i am
1796 user warner'' commands).
1798 Once the mapping is established, the rest of the buildbot can ask the
1799 @code{IRC} object to send messages to various users. It can report on
1800 the likelihood that the user saw the given message (based upon how long the
1801 user has been inactive on the channel), which might prompt the Problem
1802 Hassler logic to send them an email message instead.
1804 @node Live Status Clients,  , IRC Nicknames, Users
1805 @subsection Live Status Clients
1807 The Buildbot also offers a PB-based status client interface which can
1808 display real-time build status in a GUI panel on the developer's desktop.
1809 This interface is normally anonymous, but it could be configured to let the
1810 buildmaster know @emph{which} developer is using the status client. The
1811 status client could then be used as a message-delivery service, providing an
1812 alternative way to deliver low-latency high-interruption messages to the
1813 developer (like ``hey, you broke the build'').
1816 @node Configuration, Getting Source Code Changes, Concepts, Top
1817 @chapter Configuration
1819 @cindex Configuration
1821 The buildbot's behavior is defined by the ``config file'', which
1822 normally lives in the @file{master.cfg} file in the buildmaster's base
1823 directory (but this can be changed with an option to the
1824 @code{buildbot create-master} command). This file completely specifies
1825 which Builders are to be run, which slaves they should use, how
1826 Changes should be tracked, and where the status information is to be
1827 sent. The buildmaster's @file{buildbot.tac} file names the base
1828 directory; everything else comes from the config file.
1830 A sample config file was installed for you when you created the
1831 buildmaster, but you will need to edit it before your buildbot will do
1832 anything useful.
1834 This chapter gives an overview of the format of this file and the
1835 various sections in it. You will need to read the later chapters to
1836 understand how to fill in each section properly.
1838 @menu
1839 * Config File Format::          
1840 * Loading the Config File::     
1841 * Defining the Project::        
1842 * Listing Change Sources and Schedulers::  
1843 * Setting the slaveport::       
1844 * Buildslave Specifiers::       
1845 * Defining Builders::           
1846 * Defining Status Targets::     
1847 * Debug options::               
1848 @end menu
1850 @node Config File Format, Loading the Config File, Configuration, Configuration
1851 @section Config File Format
1853 The config file is, fundamentally, just a piece of Python code which
1854 defines a dictionary named @code{BuildmasterConfig}, with a number of
1855 keys that are treated specially. You don't need to know Python to do
1856 basic configuration, though, you can just copy the syntax of the
1857 sample file. If you @emph{are} comfortable writing Python code,
1858 however, you can use all the power of a full programming language to
1859 achieve more complicated configurations.
1861 The @code{BuildmasterConfig} name is the only one which matters: all
1862 other names defined during the execution of the file are discarded.
1863 When parsing the config file, the Buildmaster generally compares the
1864 old configuration with the new one and performs the minimum set of
1865 actions necessary to bring the buildbot up to date: Builders which are
1866 not changed are left untouched, and Builders which are modified get to
1867 keep their old event history.
1869 Basic Python syntax: comments start with a hash character (``#''),
1870 tuples are defined with @code{(parenthesis, pairs)}, arrays are
1871 defined with @code{[square, brackets]}, tuples and arrays are mostly
1872 interchangeable. Dictionaries (data structures which map ``keys'' to
1873 ``values'') are defined with curly braces: @code{@{'key1': 'value1',
1874 'key2': 'value2'@} }. Function calls (and object instantiation) can use
1875 named parameters, like @code{w = html.Waterfall(http_port=8010)}.
1877 The config file starts with a series of @code{import} statements,
1878 which make various kinds of Steps and Status targets available for
1879 later use. The main @code{BuildmasterConfig} dictionary is created,
1880 then it is populated with a variety of keys. These keys are broken
1881 roughly into the following sections, each of which is documented in
1882 the rest of this chapter:
1884 @itemize @bullet
1885 @item
1886 Project Definitions
1887 @item
1888 Change Sources / Schedulers
1889 @item
1890 Slaveport
1891 @item
1892 Buildslave Configuration
1893 @item
1894 Builders / Interlocks
1895 @item
1896 Status Targets
1897 @item
1898 Debug options
1899 @end itemize
1901 The config file can use a few names which are placed into its namespace:
1903 @table @code
1904 @item basedir
1905 the base directory for the buildmaster. This string has not been
1906 expanded, so it may start with a tilde. It needs to be expanded before
1907 use. The config file is located in
1908 @code{os.path.expanduser(os.path.join(basedir, 'master.cfg'))}
1910 @end table
1913 @node Loading the Config File, Defining the Project, Config File Format, Configuration
1914 @section Loading the Config File
1916 The config file is only read at specific points in time. It is first
1917 read when the buildmaster is launched. Once it is running, there are
1918 various ways to ask it to reload the config file. If you are on the
1919 system hosting the buildmaster, you can send a @code{SIGHUP} signal to
1920 it: the @command{buildbot} tool has a shortcut for this:
1922 @example
1923 buildbot reconfig @var{BASEDIR}
1924 @end example
1926 This command will show you all of the lines from @file{twistd.log}
1927 that relate to the reconfiguration. If there are any problems during
1928 the config-file reload, they will be displayed in these lines.
1930 The debug tool (@code{buildbot debugclient --master HOST:PORT}) has a
1931 ``Reload .cfg'' button which will also trigger a reload. In the
1932 future, there will be other ways to accomplish this step (probably a
1933 password-protected button on the web page, as well as a privileged IRC
1934 command).
1936 When reloading the config file, the buildmaster will endeavor to
1937 change as little as possible about the running system. For example,
1938 although old status targets may be shut down and new ones started up,
1939 any status targets that were not changed since the last time the
1940 config file was read will be left running and untouched. Likewise any
1941 Builders which have not been changed will be left running. If a
1942 Builder is modified (say, the build process is changed) while a Build
1943 is currently running, that Build will keep running with the old
1944 process until it completes. Any previously queued Builds (or Builds
1945 which get queued after the reconfig) will use the new process.
1947 @node Defining the Project, Listing Change Sources and Schedulers, Loading the Config File, Configuration
1948 @section Defining the Project
1950 There are a couple of basic settings that you use to tell the buildbot
1951 what project it is working on. This information is used by status
1952 reporters to let users find out more about the codebase being
1953 exercised by this particular Buildbot installation.
1955 @example
1956 c['projectName'] = "Buildbot"
1957 c['projectURL'] = "http://buildbot.sourceforge.net/"
1958 c['buildbotURL'] = "http://localhost:8010/"
1959 @end example
1961 @bcindex c['projectName']
1962 @code{projectName} is a short string will be used to describe the
1963 project that this buildbot is working on. For example, it is used as
1964 the title of the waterfall HTML page. 
1966 @bcindex c['projectURL']
1967 @code{projectURL} is a string that gives a URL for the project as a
1968 whole. HTML status displays will show @code{projectName} as a link to
1969 @code{projectURL}, to provide a link from buildbot HTML pages to your
1970 project's home page.
1972 @bcindex c['buildbotURL']
1973 The @code{buildbotURL} string should point to the location where the
1974 buildbot's internal web server (usually the @code{html.Waterfall}
1975 page) is visible. This typically uses the port number set when you
1976 create the @code{Waterfall} object: the buildbot needs your help to
1977 figure out a suitable externally-visible host name.
1979 When status notices are sent to users (either by email or over IRC),
1980 @code{buildbotURL} will be used to create a URL to the specific build
1981 or problem that they are being notified about. It will also be made
1982 available to queriers (over IRC) who want to find out where to get
1983 more information about this buildbot.
1986 @node Listing Change Sources and Schedulers, Setting the slaveport, Defining the Project, Configuration
1987 @section Listing Change Sources and Schedulers
1989 @bcindex c['sources']
1990 The @code{c['sources']} key is a list of ChangeSource
1991 instances@footnote{To be precise, it is a list of objects which all
1992 implement the @code{buildbot.interfaces.IChangeSource} Interface}.
1993 This defines how the buildmaster learns about source code changes.
1994 More information about what goes here is available in @xref{Getting
1995 Source Code Changes}.
1997 @example
1998 import buildbot.changes.pb
1999 c['sources'] = [buildbot.changes.pb.PBChangeSource()]
2000 @end example
2002 @bcindex c['schedulers']
2003 @code{c['schedulers']} is a list of Scheduler instances, each of which
2004 causes builds to be started on a particular set of Builders. The two
2005 basic Scheduler classes you are likely to start with are
2006 @code{Scheduler} and @code{Periodic}, but you can write a customized
2007 subclass to implement more complicated build scheduling.
2009 The docstring for @code{buildbot.scheduler.Scheduler} is the best
2010 place to see all the options that can be used. Type @code{pydoc
2011 buildbot.scheduler.Scheduler} to see it, or look in
2012 @file{buildbot/scheduler.py} directly.
2014 The basic Scheduler takes four arguments:
2016 @table @code
2017 @item name
2018 Each Scheduler must have a unique name. This is only used in status
2019 displays.
2021 @item branch
2022 This Scheduler will pay attention to a single branch, ignoring Changes
2023 that occur on other branches. Setting @code{branch} equal to the
2024 special value of @code{None} means it should only pay attention to the
2025 default branch. Note that @code{None} is a keyword, not a string, so
2026 you want to use @code{None} and not @code{"None"}.
2028 @item treeStableTimer
2029 The Scheduler will wait for this many seconds before starting the
2030 build. If new changes are made during this interval, the timer will be
2031 restarted, so really the build will be started after a change and then
2032 after this many seconds of inactivity.
2034 @item builderNames
2035 When the tree-stable-timer finally expires, builds will be started on
2036 these Builders. Each Builder gets a unique name: these strings must
2037 match.
2039 @end table
2041 @example
2042 from buildbot import scheduler
2043 quick = scheduler.Scheduler("quick", None, 60,
2044                             ["quick-linux", "quick-netbsd"])
2045 full = scheduler.Scheduler("full", None, 5*60,
2046                            ["full-linux", "full-netbsd", "full-OSX"])
2047 nightly = scheduler.Periodic("nightly", ["full-solaris"], 24*60*60)
2048 c['schedulers'] = [quick, full, nightly]
2049 @end example
2051 In this example, the two ``quick'' builds are triggered 60 seconds
2052 after the tree has been changed. The ``full'' builds do not run quite
2053 so quickly (they wait 5 minutes), so hopefully if the quick builds
2054 fail due to a missing file or really simple typo, the developer can
2055 discover and fix the problem before the full builds are started. Both
2056 Schedulers only pay attention to the default branch: any changes on
2057 other branches are ignored by these Schedulers. Each Scheduler
2058 triggers a different set of Builders, referenced by name.
2060 The third Scheduler in this example just runs the full solaris build
2061 once per day. (note that this Scheduler only lets you control the time
2062 between builds, not the absolute time-of-day of each Build, so this
2063 could easily wind up a ``daily'' or ``every afternoon'' scheduler
2064 depending upon when it was first activated).
2066 @menu
2067 * Scheduler Types::             
2068 * Build Dependencies::          
2069 @end menu
2071 @node Scheduler Types, Build Dependencies, Listing Change Sources and Schedulers, Listing Change Sources and Schedulers
2072 @subsection Scheduler Types
2074 @slindex buildbot.scheduler.Scheduler
2075 @slindex buildbot.scheduler.AnyBranchScheduler
2076 @slindex buildbot.scheduler.Periodic
2077 @slindex buildbot.scheduler.Nightly
2079 Here is a brief catalog of the available Scheduler types. All these
2080 Schedulers are classes in @code{buildbot.scheduler}, and the
2081 docstrings there are the best source of documentation on the arguments
2082 taken by each one.
2084 @table @code
2085 @item Scheduler
2086 This is the default Scheduler class. It follows exactly one branch,
2087 and starts a configurable tree-stable-timer after each change on that
2088 branch. When the timer expires, it starts a build on some set of
2089 Builders. The Scheduler accepts a @code{fileIsImportant} function
2090 which can be used to ignore some Changes if they do not affect any
2091 ``important'' files.
2093 @item AnyBranchScheduler
2094 This scheduler uses a tree-stable-timer like the default one, but
2095 follows multiple branches at once. Each branch gets a separate timer.
2097 @item Dependent
2098 This scheduler watches an ``upstream'' Scheduler. When all the
2099 Builders launched by that Scheduler successfully finish, the Dependent
2100 scheduler is triggered. The next section (@pxref{Build Dependencies})
2101 describes this scheduler in more detail.
2103 @item Periodic
2104 This simple scheduler just triggers a build every N seconds.
2106 @item Nightly
2107 This is highly configurable periodic build scheduler, which triggers a
2108 build at particular times of day, week, month, or year. The
2109 configuration syntax is very similar to the well-known @code{crontab}
2110 format, in which you provide values for minute, hour, day, and month
2111 (some of which can be wildcards), and a build is triggered whenever
2112 the current time matches the given constraints. This can run a build
2113 every night, every morning, every weekend, alternate Thursdays, on
2114 your boss's birthday, etc.
2116 @item Try_Jobdir / Try_Userpass
2117 This scheduler allows developers to use the @code{buildbot try}
2118 command to trigger builds of code they have not yet committed. See
2119 @ref{try} for complete details.
2121 @end table
2123 @node Build Dependencies,  , Scheduler Types, Listing Change Sources and Schedulers
2124 @subsection Build Dependencies
2126 @cindex Dependent
2127 @cindex Dependencies
2128 @slindex buildbot.scheduler.Dependent
2130 It is common to wind up with one kind of build which should only be
2131 performed if the same source code was successfully handled by some
2132 other kind of build first. An example might be a packaging step: you
2133 might only want to produce .deb or RPM packages from a tree that was
2134 known to compile successfully and pass all unit tests. You could put
2135 the packaging step in the same Build as the compile and testing steps,
2136 but there might be other reasons to not do this (in particular you
2137 might have several Builders worth of compiles/tests, but only wish to
2138 do the packaging once). Another example is if you want to skip the
2139 ``full'' builds after a failing ``quick'' build of the same source
2140 code. Or, if one Build creates a product (like a compiled library)
2141 that is used by some other Builder, you'd want to make sure the
2142 consuming Build is run @emph{after} the producing one.
2144 You can use @code{Dependencies} to express this relationship to the
2145 Buildbot. There is a special kind of Scheduler named
2146 @code{scheduler.Dependent} that will watch an ``upstream'' Scheduler
2147 for builds to complete successfully (on all of its Builders). Each
2148 time that happens, the same source code (i.e. the same
2149 @code{SourceStamp}) will be used to start a new set of builds, on a
2150 different set of Builders. This ``downstream'' scheduler doesn't pay
2151 attention to Changes at all, it only pays attention to the upstream
2152 scheduler.
2154 If the SourceStamp fails on any of the Builders in the upstream set,
2155 the downstream builds will not fire.
2157 @example
2158 from buildbot import scheduler
2159 tests = scheduler.Scheduler("tests", None, 5*60,
2160                             ["full-linux", "full-netbsd", "full-OSX"])
2161 package = scheduler.Dependent("package",
2162                               tests, # upstream scheduler
2163                               ["make-tarball", "make-deb", "make-rpm"])
2164 c['schedulers'] = [tests, package]
2165 @end example
2167 Note that @code{Dependent}'s upstream scheduler argument is given as a
2168 @code{Scheduler} @emph{instance}, not a name. This makes it impossible
2169 to create circular dependencies in the config file.
2172 @node Setting the slaveport, Buildslave Specifiers, Listing Change Sources and Schedulers, Configuration
2173 @section Setting the slaveport
2175 @bcindex c['slavePortnum']
2177 The buildmaster will listen on a TCP port of your choosing for
2178 connections from buildslaves. It can also use this port for
2179 connections from remote Change Sources, status clients, and debug
2180 tools. This port should be visible to the outside world, and you'll
2181 need to tell your buildslave admins about your choice.
2183 It does not matter which port you pick, as long it is externally
2184 visible, however you should probably use something larger than 1024,
2185 since most operating systems don't allow non-root processes to bind to
2186 low-numbered ports. If your buildmaster is behind a firewall or a NAT
2187 box of some sort, you may have to configure your firewall to permit
2188 inbound connections to this port.
2190 @example
2191 c['slavePortnum'] = 10000
2192 @end example
2194 @code{c['slavePortnum']} is a @emph{strports} specification string,
2195 defined in the @code{twisted.application.strports} module (try
2196 @command{pydoc twisted.application.strports} to get documentation on
2197 the format). This means that you can have the buildmaster listen on a
2198 localhost-only port by doing:
2200 @example
2201 c['slavePortnum'] = "tcp:10000:interface=127.0.0.1"
2202 @end example
2204 This might be useful if you only run buildslaves on the same machine,
2205 and they are all configured to contact the buildmaster at
2206 @code{localhost:10000}.
2209 @node Buildslave Specifiers, Defining Builders, Setting the slaveport, Configuration
2210 @section Buildslave Specifiers
2212 @bcindex c['slaves']
2214 The @code{c['slaves']} key is a list of known buildslaves. Each
2215 buildslave is defined by an instance of the BuildSlave class, created
2216 with two values: (slavename, slavepassword). These are the same two
2217 values that need to be provided to the buildslave administrator when
2218 they create the buildslave.
2220 @example
2221 from buildbot.slave import BuildSlave
2222 c['slaves'] = [BuildSlave('bot-solaris', 'solarispasswd'),
2223                BuildSlave('bot-bsd', 'bsdpasswd'),
2224               ]
2225 @end example
2227 The slavenames must be unique, of course. The password exists to
2228 prevent evildoers from interfering with the buildbot by inserting
2229 their own (broken) buildslaves into the system and thus displacing the
2230 real ones.
2232 Buildslaves with an unrecognized slavename or a non-matching password
2233 will be rejected when they attempt to connect, and a message
2234 describing the problem will be put in the log file (see @ref{Logfiles}).
2236 Historical note: in buildbot-0.7.5 and earlier, the @code{c['bots']}
2237 key was used instead, and it took a list of (name, password) tuples.
2238 This key is accepted for backwards compatibility, but is deprecated as
2239 of 0.7.6 and will go away in some future release.
2242 @node Defining Builders, Defining Status Targets, Buildslave Specifiers, Configuration
2243 @section Defining Builders
2245 @bcindex c['builders']
2247 The @code{c['builders']} key is a list of dictionaries which specify
2248 the Builders. The Buildmaster runs a collection of Builders, each of
2249 which handles a single type of build (e.g. full versus quick), on a
2250 single build slave. A Buildbot which makes sure that the latest code
2251 (``HEAD'') compiles correctly across four separate architecture will
2252 have four Builders, each performing the same build but on different
2253 slaves (one per platform).
2255 Each Builder gets a separate column in the waterfall display. In
2256 general, each Builder runs independently (although various kinds of
2257 interlocks can cause one Builder to have an effect on another).
2259 Each Builder specification dictionary has several required keys:
2261 @table @code
2262 @item name
2263 This specifies the Builder's name, which is used in status
2264 reports.
2266 @item slavename
2267 This specifies which buildslave will be used by this Builder.
2268 @code{slavename} must appear in the @code{c['slaves']} list. Each
2269 buildslave can accomodate multiple Builders.
2271 @item slavenames
2272 If you provide @code{slavenames} instead of @code{slavename}, you can
2273 give a list of buildslaves which are capable of running this Builder.
2274 If multiple buildslaves are available for any given Builder, you will
2275 have some measure of redundancy: in case one slave goes offline, the
2276 others can still keep the Builder working. In addition, multiple
2277 buildslaves will allow multiple simultaneous builds for the same
2278 Builder, which might be useful if you have a lot of forced or ``try''
2279 builds taking place.
2281 If you use this feature, it is important to make sure that the
2282 buildslaves are all, in fact, capable of running the given build. The
2283 slave hosts should be configured similarly, otherwise you will spend a
2284 lot of time trying (unsuccessfully) to reproduce a failure that only
2285 occurs on some of the buildslaves and not the others. Different
2286 platforms, operating systems, versions of major programs or libraries,
2287 all these things mean you should use separate Builders.
2289 @item builddir
2290 This specifies the name of a subdirectory (under the base directory)
2291 in which everything related to this builder will be placed. On the
2292 buildmaster, this holds build status information. On the buildslave,
2293 this is where checkouts, compiles, and tests are run.
2295 @item factory
2296 This is a @code{buildbot.process.factory.BuildFactory} instance which
2297 controls how the build is performed. Full details appear in their own
2298 chapter, @xref{Build Process}. Parameters like the location of the CVS
2299 repository and the compile-time options used for the build are
2300 generally provided as arguments to the factory's constructor.
2302 @end table
2304 Other optional keys may be set on each Builder:
2306 @table @code
2308 @item category
2309 If provided, this is a string that identifies a category for the
2310 builder to be a part of. Status clients can limit themselves to a
2311 subset of the available categories. A common use for this is to add
2312 new builders to your setup (for a new module, or for a new buildslave)
2313 that do not work correctly yet and allow you to integrate them with
2314 the active builders. You can put these new builders in a test
2315 category, make your main status clients ignore them, and have only
2316 private status clients pick them up. As soon as they work, you can
2317 move them over to the active category.
2319 @end table
2322 @node Defining Status Targets, Debug options, Defining Builders, Configuration
2323 @section Defining Status Targets
2325 The Buildmaster has a variety of ways to present build status to
2326 various users. Each such delivery method is a ``Status Target'' object
2327 in the configuration's @code{status} list. To add status targets, you
2328 just append more objects to this list:
2330 @bcindex c['status']
2332 @example
2333 c['status'] = []
2335 from buildbot.status import html
2336 c['status'].append(html.Waterfall(http_port=8010))
2338 from buildbot.status import mail
2339 m = mail.MailNotifier(fromaddr="buildbot@@localhost",
2340                       extraRecipients=["builds@@lists.example.com"],
2341                       sendToInterestedUsers=False)
2342 c['status'].append(m)
2344 from buildbot.status import words
2345 c['status'].append(words.IRC(host="irc.example.com", nick="bb",
2346                              channels=["#example"]))
2347 @end example
2349 Status delivery has its own chapter, @xref{Status Delivery}, in which
2350 all the built-in status targets are documented.
2353 @node Debug options,  , Defining Status Targets, Configuration
2354 @section Debug options
2357 @bcindex c['debugPassword']
2358 If you set @code{c['debugPassword']}, then you can connect to the
2359 buildmaster with the diagnostic tool launched by @code{buildbot
2360 debugclient MASTER:PORT}. From this tool, you can reload the config
2361 file, manually force builds, and inject changes, which may be useful
2362 for testing your buildmaster without actually commiting changes to
2363 your repository (or before you have the Change Sources set up). The
2364 debug tool uses the same port number as the slaves do:
2365 @code{c['slavePortnum']}, and is authenticated with this password.
2367 @example
2368 c['debugPassword'] = "debugpassword"
2369 @end example
2371 @bcindex c['manhole']
2372 If you set @code{c['manhole']} to an instance of one of the classes in
2373 @code{buildbot.manhole}, you can telnet or ssh into the buildmaster
2374 and get an interactive Python shell, which may be useful for debugging
2375 buildbot internals. It is probably only useful for buildbot
2376 developers. It exposes full access to the buildmaster's account
2377 (including the ability to modify and delete files), so it should not
2378 be enabled with a weak or easily guessable password.
2380 There are three separate @code{Manhole} classes. Two of them use SSH,
2381 one uses unencrypted telnet. Two of them use a username+password
2382 combination to grant access, one of them uses an SSH-style
2383 @file{authorized_keys} file which contains a list of ssh public keys.
2385 @table @code
2386 @item manhole.AuthorizedKeysManhole
2387 You construct this with the name of a file that contains one SSH
2388 public key per line, just like @file{~/.ssh/authorized_keys}. If you
2389 provide a non-absolute filename, it will be interpreted relative to
2390 the buildmaster's base directory.
2392 @item manhole.PasswordManhole
2393 This one accepts SSH connections but asks for a username and password
2394 when authenticating. It accepts only one such pair.
2397 @item manhole.TelnetManhole
2398 This accepts regular unencrypted telnet connections, and asks for a
2399 username/password pair before providing access. Because this
2400 username/password is transmitted in the clear, and because Manhole
2401 access to the buildmaster is equivalent to granting full shell
2402 privileges to both the buildmaster and all the buildslaves (and to all
2403 accounts which then run code produced by the buildslaves), it is
2404 highly recommended that you use one of the SSH manholes instead.
2406 @end table
2408 @example
2409 # some examples:
2410 from buildbot import manhole
2411 c['manhole'] = manhole.AuthorizedKeysManhole(1234, "authorized_keys")
2412 c['manhole'] = manhole.PasswordManhole(1234, "alice", "mysecretpassword")
2413 c['manhole'] = manhole.TelnetManhole(1234, "bob", "snoop_my_password_please")
2414 @end example
2416 The @code{Manhole} instance can be configured to listen on a specific
2417 port. You may wish to have this listening port bind to the loopback
2418 interface (sometimes known as ``lo0'', ``localhost'', or 127.0.0.1) to
2419 restrict access to clients which are running on the same host.
2421 @example
2422 from buildbot.manhole import PasswordManhole
2423 c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")
2424 @end example
2426 To have the @code{Manhole} listen on all interfaces, use
2427 @code{"tcp:9999"} or simply 9999. This port specification uses
2428 @code{twisted.application.strports}, so you can make it listen on SSL
2429 or even UNIX-domain sockets if you want.
2431 Note that using any Manhole requires that the TwistedConch package be
2432 installed, and that you be using Twisted version 2.0 or later.
2434 The buildmaster's SSH server will use a different host key than the
2435 normal sshd running on a typical unix host. This will cause the ssh
2436 client to complain about a ``host key mismatch'', because it does not
2437 realize there are two separate servers running on the same host. To
2438 avoid this, use a clause like the following in your @file{.ssh/config}
2439 file:
2441 @example
2442 Host remotehost-buildbot
2443  HostName remotehost
2444  HostKeyAlias remotehost-buildbot
2445  Port 9999
2446  # use 'user' if you use PasswordManhole and your name is not 'admin'.
2447  # if you use AuthorizedKeysManhole, this probably doesn't matter.
2448  User admin
2449 @end example
2452 @node Getting Source Code Changes, Build Process, Configuration, Top
2453 @chapter Getting Source Code Changes
2455 The most common way to use the Buildbot is centered around the idea of
2456 @code{Source Trees}: a directory tree filled with source code of some form
2457 which can be compiled and/or tested. Some projects use languages that don't
2458 involve any compilation step: nevertheless there may be a @code{build} phase
2459 where files are copied or rearranged into a form that is suitable for
2460 installation. Some projects do not have unit tests, and the Buildbot is
2461 merely helping to make sure that the sources can compile correctly. But in
2462 all of these cases, the thing-being-tested is a single source tree.
2464 A Version Control System mantains a source tree, and tells the
2465 buildmaster when it changes. The first step of each Build is typically
2466 to acquire a copy of some version of this tree.
2468 This chapter describes how the Buildbot learns about what Changes have
2469 occurred. For more information on VC systems and Changes, see
2470 @ref{Version Control Systems}.
2473 @menu
2474 * Change Sources::              
2475 * Choosing ChangeSources::      
2476 * CVSToys - PBService::         
2477 * CVSToys - mail notification::  
2478 * Other mail notification ChangeSources::  
2479 * PBChangeSource::              
2480 * P4Source::                    
2481 * BonsaiPoller::                
2482 * SVNPoller::                   
2483 * MercurialHook::               
2484 @end menu
2488 @node Change Sources, Choosing ChangeSources, Getting Source Code Changes, Getting Source Code Changes
2489 @section Change Sources
2491 @c TODO: rework this, the one-buildmaster-one-tree thing isn't quite
2492 @c so narrow-minded anymore
2494 Each Buildmaster watches a single source tree. Changes can be provided
2495 by a variety of ChangeSource types, however any given project will
2496 typically have only a single ChangeSource active. This section
2497 provides a description of all available ChangeSource types and
2498 explains how to set up each of them.
2500 There are a variety of ChangeSources available, some of which are
2501 meant to be used in conjunction with other tools to deliver Change
2502 events from the VC repository to the buildmaster.
2504 @itemize @bullet
2506 @item CVSToys
2507 This ChangeSource opens a TCP connection from the buildmaster to a
2508 waiting FreshCVS daemon that lives on the repository machine, and
2509 subscribes to hear about Changes.
2511 @item MaildirSource
2512 This one watches a local maildir-format inbox for email sent out by
2513 the repository when a change is made. When a message arrives, it is
2514 parsed to create the Change object. A variety of parsing functions are
2515 available to accomodate different email-sending tools.
2517 @item PBChangeSource
2518 This ChangeSource listens on a local TCP socket for inbound
2519 connections from a separate tool. Usually, this tool would be run on
2520 the VC repository machine in a commit hook. It is expected to connect
2521 to the TCP socket and send a Change message over the network
2522 connection. The @command{buildbot sendchange} command is one example
2523 of a tool that knows how to send these messages, so you can write a
2524 commit script for your VC system that calls it to deliver the Change.
2525 There are other tools in the contrib/ directory that use the same
2526 protocol.
2528 @end itemize
2530 As a quick guide, here is a list of VC systems and the ChangeSources
2531 that might be useful with them. All of these ChangeSources are in the
2532 @code{buildbot.changes} module.
2534 @table @code
2535 @item CVS
2537 @itemize @bullet
2538 @item freshcvs.FreshCVSSource (connected via TCP to the freshcvs daemon)
2539 @item mail.FCMaildirSource (watching for email sent by a freshcvs daemon)
2540 @item mail.BonsaiMaildirSource (watching for email sent by Bonsai)
2541 @item mail.SyncmailMaildirSource (watching for email sent by syncmail)
2542 @item pb.PBChangeSource (listening for connections from @code{buildbot
2543 sendchange} run in a loginfo script)
2544 @item pb.PBChangeSource (listening for connections from a long-running
2545 @code{contrib/viewcvspoll.py} polling process which examines the ViewCVS
2546 database directly
2547 @end itemize
2549 @item SVN
2550 @itemize @bullet
2551 @item pb.PBChangeSource (listening for connections from
2552 @code{contrib/svn_buildbot.py} run in a postcommit script)
2553 @item pb.PBChangeSource (listening for connections from a long-running
2554 @code{contrib/svn_watcher.py} or @code{contrib/svnpoller.py} polling
2555 process
2556 @item svnpoller.SVNPoller (polling the SVN repository)
2557 @end itemize
2559 @item Darcs
2560 @itemize @bullet
2561 @item pb.PBChangeSource (listening for connections from
2562 @code{contrib/darcs_buildbot.py} in a commit script
2563 @end itemize
2565 @item Mercurial
2566 @itemize @bullet
2567 @item pb.PBChangeSource (listening for connections from
2568 @code{contrib/hg_buildbot.py} run in an 'incoming' hook)
2569 @item pb.PBChangeSource (listening for connections from
2570 @code{buildbot/changes/hgbuildbot.py} run as an in-process 'changegroup'
2571 hook)
2572 @end itemize
2574 @item Arch/Bazaar
2575 @itemize @bullet
2576 @item pb.PBChangeSource (listening for connections from
2577 @code{contrib/arch_buildbot.py} run in a commit hook)
2578 @end itemize
2580 @end table
2582 All VC systems can be driven by a PBChangeSource and the
2583 @code{buildbot sendchange} tool run from some form of commit script.
2584 If you write an email parsing function, they can also all be driven by
2585 a suitable @code{MaildirSource}.
2588 @node Choosing ChangeSources, CVSToys - PBService, Change Sources, Getting Source Code Changes
2589 @section Choosing ChangeSources
2591 The @code{master.cfg} configuration file has a dictionary key named
2592 @code{BuildmasterConfig['sources']}, which holds a list of
2593 @code{IChangeSource} objects. The config file will typically create an
2594 object from one of the classes described below and stuff it into the
2595 list.
2597 @example
2598 s = FreshCVSSourceNewcred(host="host", port=4519,
2599                           user="alice", passwd="secret",
2600                           prefix="Twisted")
2601 BuildmasterConfig['sources'] = [s]
2602 @end example
2604 Each source tree has a nominal @code{top}. Each Change has a list of
2605 filenames, which are all relative to this top location. The
2606 ChangeSource is responsible for doing whatever is necessary to
2607 accomplish this. Most sources have a @code{prefix} argument: a partial
2608 pathname which is stripped from the front of all filenames provided to
2609 that @code{ChangeSource}. Files which are outside this sub-tree are
2610 ignored by the changesource: it does not generate Changes for those
2611 files.
2614 @node CVSToys - PBService, CVSToys - mail notification, Choosing ChangeSources, Getting Source Code Changes
2615 @section CVSToys - PBService
2617 @csindex buildbot.changes.freshcvs.FreshCVSSource
2619 The @uref{http://purl.net/net/CVSToys, CVSToys} package provides a
2620 server which runs on the machine that hosts the CVS repository it
2621 watches. It has a variety of ways to distribute commit notifications,
2622 and offers a flexible regexp-based way to filter out uninteresting
2623 changes. One of the notification options is named @code{PBService} and
2624 works by listening on a TCP port for clients. These clients subscribe
2625 to hear about commit notifications.
2627 The buildmaster has a CVSToys-compatible @code{PBService} client built
2628 in. There are two versions of it, one for old versions of CVSToys
2629 (1.0.9 and earlier) which used the @code{oldcred} authentication
2630 framework, and one for newer versions (1.0.10 and later) which use
2631 @code{newcred}. Both are classes in the
2632 @code{buildbot.changes.freshcvs} package.
2634 @code{FreshCVSSourceNewcred} objects are created with the following
2635 parameters:
2637 @table @samp
2639 @item @code{host} and @code{port}
2640 these specify where the CVSToys server can be reached
2642 @item @code{user} and @code{passwd}
2643 these specify the login information for the CVSToys server
2644 (@code{freshcvs}). These must match the server's values, which are
2645 defined in the @code{freshCfg} configuration file (which lives in the
2646 CVSROOT directory of the repository).
2648 @item @code{prefix}
2649 this is the prefix to be found and stripped from filenames delivered
2650 by the CVSToys server. Most projects live in sub-directories of the
2651 main repository, as siblings of the CVSROOT sub-directory, so
2652 typically this prefix is set to that top sub-directory name.
2654 @end table
2656 @heading Example
2658 To set up the freshCVS server, add a statement like the following to
2659 your @file{freshCfg} file:
2661 @example
2662 pb = ConfigurationSet([
2663     (None, None, None, PBService(userpass=('foo', 'bar'), port=4519)),
2664     ])
2665 @end example
2667 This will announce all changes to a client which connects to port 4519
2668 using a username of 'foo' and a password of 'bar'.
2670 Then add a clause like this to your buildmaster's @file{master.cfg}:
2672 @example
2673 BuildmasterConfig['sources'] = [FreshCVSSource("cvs.example.com", 4519,
2674                                 "foo", "bar",
2675                                 prefix="glib/")]
2676 @end example
2678 where "cvs.example.com" is the host that is running the FreshCVS daemon, and
2679 "glib" is the top-level directory (relative to the repository's root) where
2680 all your source code lives. Most projects keep one or more projects in the
2681 same repository (along with CVSROOT/ to hold admin files like loginfo and
2682 freshCfg); the prefix= argument tells the buildmaster to ignore everything
2683 outside that directory, and to strip that common prefix from all pathnames
2684 it handles.
2688 @node CVSToys - mail notification, Other mail notification ChangeSources, CVSToys - PBService, Getting Source Code Changes
2689 @section CVSToys - mail notification
2691 @csindex buildbot.changes.mail.FCMaildirSource
2693 CVSToys also provides a @code{MailNotification} action which will send
2694 email to a list of recipients for each commit. This tends to work
2695 better than using @code{/bin/mail} from within the CVSROOT/loginfo
2696 file directly, as CVSToys will batch together all files changed during
2697 the same CVS invocation, and can provide more information (like
2698 creating a ViewCVS URL for each file changed).
2700 The Buildbot's @code{FCMaildirSource} is a ChangeSource which knows
2701 how to parse these CVSToys messages and turn them into Change objects.
2702 It watches a Maildir for new messages. The usually installation
2703 process looks like:
2705 @enumerate
2706 @item
2707 Create a mailing list, @code{projectname-commits}.
2708 @item
2709 In CVSToys' freshCfg file, use a @code{MailNotification} action to
2710 send commit mail to this mailing list.
2711 @item
2712 Subscribe the buildbot user to the mailing list.
2713 @item
2714 Configure your .qmail or .forward file to deliver these messages into
2715 a maildir.
2716 @item
2717 In the Buildbot's master.cfg file, use a @code{FCMaildirSource} to
2718 watch the maildir for commit messages.
2719 @end enumerate
2721 The @code{FCMaildirSource} is created with two parameters: the
2722 directory name of the maildir root, and the prefix to strip.
2724 @node Other mail notification ChangeSources, PBChangeSource, CVSToys - mail notification, Getting Source Code Changes
2725 @section Other mail notification ChangeSources
2727 @csindex buildbot.changes.mail.SyncmailMaildirSource
2728 @csindex buildbot.changes.mail.BonsaiMaildirSource
2730 There are other types of maildir-watching ChangeSources, which only
2731 differ in the function used to parse the message body.
2733 @code{SyncmailMaildirSource} knows how to parse the message format
2734 used in mail sent by Syncmail.
2736 @code{BonsaiMaildirSource} parses messages sent out by Bonsai.
2738 @node PBChangeSource, P4Source, Other mail notification ChangeSources, Getting Source Code Changes
2739 @section PBChangeSource
2741 @csindex buildbot.changes.pb.PBChangeSource
2743 The last kind of ChangeSource actually listens on a TCP port for
2744 clients to connect and push change notices @emph{into} the
2745 Buildmaster. This is used by the built-in @code{buildbot sendchange}
2746 notification tool, as well as the VC-specific
2747 @file{contrib/svn_buildbot.py}, @file{contrib/arch_buildbot.py},
2748 @file{contrib/hg_buildbot.py} tools, and the
2749 @code{buildbot.changes.hgbuildbot} hook. These tools are run by the
2750 repository (in a commit hook script), and connect to the buildmaster
2751 directly each time a file is comitted. This is also useful for
2752 creating new kinds of change sources that work on a @code{push} model
2753 instead of some kind of subscription scheme, for example a script
2754 which is run out of an email .forward file.
2756 This ChangeSource can be configured to listen on its own TCP port, or
2757 it can share the port that the buildmaster is already using for the
2758 buildslaves to connect. (This is possible because the
2759 @code{PBChangeSource} uses the same protocol as the buildslaves, and
2760 they can be distinguished by the @code{username} attribute used when
2761 the initial connection is established). It might be useful to have it
2762 listen on a different port if, for example, you wanted to establish
2763 different firewall rules for that port. You could allow only the SVN
2764 repository machine access to the @code{PBChangeSource} port, while
2765 allowing only the buildslave machines access to the slave port. Or you
2766 could just expose one port and run everything over it. @emph{Note:
2767 this feature is not yet implemented, the PBChangeSource will always
2768 share the slave port and will always have a @code{user} name of
2769 @code{change}, and a passwd of @code{changepw}. These limitations will
2770 be removed in the future.}.
2773 The @code{PBChangeSource} is created with the following arguments. All
2774 are optional.
2776 @table @samp
2777 @item @code{port}
2778 which port to listen on. If @code{None} (which is the default), it
2779 shares the port used for buildslave connections. @emph{Not
2780 Implemented, always set to @code{None}}.
2782 @item @code{user} and @code{passwd}
2783 The user/passwd account information that the client program must use
2784 to connect. Defaults to @code{change} and @code{changepw}. @emph{Not
2785 Implemented, @code{user} is currently always set to @code{change},
2786 @code{passwd} is always set to @code{changepw}}.
2788 @item @code{prefix}
2789 The prefix to be found and stripped from filenames delivered over the
2790 connection. Any filenames which do not start with this prefix will be
2791 removed. If all the filenames in a given Change are removed, the that
2792 whole Change will be dropped. This string should probably end with a
2793 directory separator.
2795 This is useful for changes coming from version control systems that
2796 represent branches as parent directories within the repository (like
2797 SVN and Perforce). Use a prefix of 'trunk/' or
2798 'project/branches/foobranch/' to only follow one branch and to get
2799 correct tree-relative filenames. Without a prefix, the PBChangeSource
2800 will probably deliver Changes with filenames like @file{trunk/foo.c}
2801 instead of just @file{foo.c}. Of course this also depends upon the
2802 tool sending the Changes in (like @command{buildbot sendchange}) and
2803 what filenames it is delivering: that tool may be filtering and
2804 stripping prefixes at the sending end.
2806 @end table
2808 @node P4Source, BonsaiPoller, PBChangeSource, Getting Source Code Changes
2809 @section P4Source
2811 @csindex buildbot.changes.p4poller.P4Source
2813 The @code{P4Source} periodically polls a @uref{http://www.perforce.com/,
2814 Perforce} depot for changes. It accepts the following arguments:
2816 @table @samp
2817 @item @code{p4base}
2818 The base depot path to watch, without the trailing '/...'.
2820 @item @code{p4port}
2821 The Perforce server to connect to (as host:port).
2823 @item @code{p4user}
2824 The Perforce user.
2826 @item @code{p4passwd}
2827 The Perforce password.
2829 @item @code{split_file}
2830 A function that maps a pathname, without the leading @code{p4base}, to a
2831 (branch, filename) tuple. The default just returns (None, branchfile),
2832 which effectively disables branch support. You should supply a function
2833 which understands your repository structure.
2835 @item @code{pollinterval}
2836 How often to poll, in seconds. Defaults to 600 (10 minutes).
2838 @item @code{histmax}
2839 The maximum number of changes to inspect at a time. If more than this
2840 number occur since the last poll, older changes will be silently
2841 ignored.
2842 @end table
2844 @heading Example
2846 This configuration uses the @code{P4PORT}, @code{P4USER}, and @code{P4PASSWD}
2847 specified in the buildmaster's environment. It watches a project in which the
2848 branch name is simply the next path component, and the file is all path
2849 components after.
2851 @example
2852 import buildbot.changes.p4poller
2853 c['sources'].append(p4poller.P4Source(
2854         p4base='//depot/project/',
2855         split_file=lambda branchfile: branchfile.split('/',1)
2857 @end example
2859 @node BonsaiPoller, SVNPoller, P4Source, Getting Source Code Changes
2860 @section BonsaiPoller
2862 @csindex buildbot.changes.bonsaipoller.BonsaiPoller
2864 The @code{BonsaiPoller} periodically polls a Bonsai server. This is a
2865 CGI script accessed through a web server that provides information
2866 about a CVS tree, for example the Mozilla bonsai server at
2867 @uref{http://bonsai.mozilla.org}. Bonsai servers are usable by both
2868 humans and machines. In this case, the buildbot's change source forms
2869 a query which asks about any files in the specified branch which have
2870 changed since the last query.
2872 Please take a look at the BonsaiPoller docstring for details about the
2873 arguments it accepts.
2876 @node SVNPoller, MercurialHook, BonsaiPoller, Getting Source Code Changes
2877 @section SVNPoller
2879 @csindex buildbot.changes.svnpoller.SVNPoller
2881 The @code{buildbot.changes.svnpoller.SVNPoller} is a ChangeSource
2882 which periodically polls a @uref{http://subversion.tigris.org/,
2883 Subversion} repository for new revisions, by running the @code{svn
2884 log} command in a subshell. It can watch a single branch or multiple
2885 branches.
2887 @code{SVNPoller} accepts the following arguments:
2889 @table @code
2890 @item svnurl
2891 The base URL path to watch, like
2892 @code{svn://svn.twistedmatrix.com/svn/Twisted/trunk}, or
2893 @code{http://divmod.org/svn/Divmod/}, or even
2894 @code{file:///home/svn/Repository/ProjectA/branches/1.5/}. This must
2895 include the access scheme, the location of the repository (both the
2896 hostname for remote ones, and any additional directory names necessary
2897 to get to the repository), and the sub-path within the repository's
2898 virtual filesystem for the project and branch of interest.
2900 The @code{SVNPoller} will only pay attention to files inside the
2901 subdirectory specified by the complete svnurl.
2903 @item split_file
2904 A function to convert pathnames into (branch, relative_pathname)
2905 tuples. Use this to explain your repository's branch-naming policy to
2906 @code{SVNPoller}. This function must accept a single string and return
2907 a two-entry tuple. There are a few utility functions in
2908 @code{buildbot.changes.svnpoller} that can be used as a
2909 @code{split_file} function, see below for details.
2911 The default value always returns (None, path), which indicates that
2912 all files are on the trunk.
2914 Subclasses of @code{SVNPoller} can override the @code{split_file}
2915 method instead of using the @code{split_file=} argument.
2917 @item svnuser
2918 An optional string parameter. If set, the @code{--user} argument will
2919 be added to all @code{svn} commands. Use this if you have to
2920 authenticate to the svn server before you can do @code{svn info} or
2921 @code{svn log} commands.
2923 @item svnpasswd
2924 Like @code{svnuser}, this will cause a @code{--password} argument to
2925 be passed to all svn commands.
2927 @item pollinterval
2928 How often to poll, in seconds. Defaults to 600 (checking once every 10
2929 minutes). Lower this if you want the buildbot to notice changes
2930 faster, raise it if you want to reduce the network and CPU load on
2931 your svn server. Please be considerate of public SVN repositories by
2932 using a large interval when polling them.
2934 @item histmax
2935 The maximum number of changes to inspect at a time. Every POLLINTERVAL
2936 seconds, the @code{SVNPoller} asks for the last HISTMAX changes and
2937 looks through them for any ones it does not already know about. If
2938 more than HISTMAX revisions have been committed since the last poll,
2939 older changes will be silently ignored. Larger values of histmax will
2940 cause more time and memory to be consumed on each poll attempt.
2941 @code{histmax} defaults to 100.
2943 @item svnbin
2944 This controls the @code{svn} executable to use. If subversion is
2945 installed in a weird place on your system (outside of the
2946 buildmaster's @code{$PATH}), use this to tell @code{SVNPoller} where
2947 to find it. The default value of ``svn'' will almost always be
2948 sufficient.
2950 @end table
2952 @heading Branches
2954 Each source file that is tracked by a Subversion repository has a
2955 fully-qualified SVN URL in the following form:
2956 (REPOURL)(PROJECT-plus-BRANCH)(FILEPATH). When you create the
2957 @code{SVNPoller}, you give it a @code{svnurl} value that includes all
2958 of the REPOURL and possibly some portion of the PROJECT-plus-BRANCH
2959 string. The @code{SVNPoller} is responsible for producing Changes that
2960 contain a branch name and a FILEPATH (which is relative to the top of
2961 a checked-out tree). The details of how these strings are split up
2962 depend upon how your repository names its branches.
2964 @subheading PROJECT/BRANCHNAME/FILEPATH repositories
2966 One common layout is to have all the various projects that share a
2967 repository get a single top-level directory each. Then under a given
2968 project's directory, you get two subdirectories, one named ``trunk''
2969 and another named ``branches''. Under ``branches'' you have a bunch of
2970 other directories, one per branch, with names like ``1.5.x'' and
2971 ``testing''. It is also common to see directories like ``tags'' and
2972 ``releases'' next to ``branches'' and ``trunk''.
2974 For example, the Twisted project has a subversion server on
2975 ``svn.twistedmatrix.com'' that hosts several sub-projects. The
2976 repository is available through a SCHEME of ``svn:''. The primary
2977 sub-project is Twisted, of course, with a repository root of
2978 ``svn://svn.twistedmatrix.com/svn/Twisted''. Another sub-project is
2979 Informant, with a root of
2980 ``svn://svn.twistedmatrix.com/svn/Informant'', etc. Inside any
2981 checked-out Twisted tree, there is a file named bin/trial (which is
2982 used to run unit test suites).
2984 The trunk for Twisted is in
2985 ``svn://svn.twistedmatrix.com/svn/Twisted/trunk'', and the
2986 fully-qualified SVN URL for the trunk version of @code{trial} would be
2987 ``svn://svn.twistedmatrix.com/svn/Twisted/trunk/bin/trial''. The same
2988 SVNURL for that file on a branch named ``1.5.x'' would be
2989 ``svn://svn.twistedmatrix.com/svn/Twisted/branches/1.5.x/bin/trial''.
2991 To set up a @code{SVNPoller} that watches the Twisted trunk (and
2992 nothing else), we would use the following:
2994 @example
2995 from buildbot.changes.svnpoller import SVNPoller
2996 s = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted/trunk")
2997 c['sources'].append(ss)
2998 @end example
3000 In this case, every Change that our @code{SVNPoller} produces will
3001 have @code{.branch=None}, to indicate that the Change is on the trunk.
3002 No other sub-projects or branches will be tracked.
3004 If we want our ChangeSource to follow multiple branches, we have to do
3005 two things. First we have to change our @code{svnurl=} argument to
3006 watch more than just ``.../Twisted/trunk''. We will set it to
3007 ``.../Twisted'' so that we'll see both the trunk and all the branches.
3008 Second, we have to tell @code{SVNPoller} how to split the
3009 (PROJECT-plus-BRANCH)(FILEPATH) strings it gets from the repository
3010 out into (BRANCH) and (FILEPATH) pairs.
3012 We do the latter by providing a ``split_file'' function. This function
3013 is responsible for splitting something like
3014 ``branches/1.5.x/bin/trial'' into @code{branch}=''branches/1.5.x'' and
3015 @code{filepath}=''bin/trial''. This function is always given a string
3016 that names a file relative to the subdirectory pointed to by the
3017 @code{SVNPoller}'s @code{svnurl=} argument. It is expected to return a
3018 (BRANCHNAME, FILEPATH) tuple (in which FILEPATH is relative to the
3019 branch indicated), or None to indicate that the file is outside any
3020 project of interest.
3022 (note that we want to see ``branches/1.5.x'' rather than just
3023 ``1.5.x'' because when we perform the SVN checkout, we will probably
3024 append the branch name to the baseURL, which requires that we keep the
3025 ``branches'' component in there. Other VC schemes use a different
3026 approach towards branches and may not require this artifact.)
3028 If your repository uses this same PROJECT/BRANCH/FILEPATH naming
3029 scheme, the following function will work:
3031 @example
3032 def split_file_branches(path):
3033     pieces = path.split('/')
3034     if pieces[0] == 'trunk':
3035         return (None, '/'.join(pieces[1:]))
3036     elif pieces[0] == 'branches':
3037         return ('/'.join(pieces[0:2]),
3038                 '/'.join(pieces[2:]))
3039     else:
3040         return None
3041 @end example
3043 This function is provided as
3044 @code{buildbot.changes.svnpoller.split_file_branches} for your
3045 convenience. So to have our Twisted-watching @code{SVNPoller} follow
3046 multiple branches, we would use this:
3048 @example
3049 from buildbot.changes.svnpoller import SVNPoller, split_file_branches
3050 s = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted",
3051               split_file=split_file_branches)
3052 c['sources'].append(ss)
3053 @end example
3055 Changes for all sorts of branches (with names like ``branches/1.5.x'',
3056 and None to indicate the trunk) will be delivered to the Schedulers.
3057 Each Scheduler is then free to use or ignore each branch as it sees
3058 fit.
3060 @subheading BRANCHNAME/PROJECT/FILEPATH repositories
3062 Another common way to organize a Subversion repository is to put the
3063 branch name at the top, and the projects underneath. This is
3064 especially frequent when there are a number of related sub-projects
3065 that all get released in a group.
3067 For example, Divmod.org hosts a project named ``Nevow'' as well as one
3068 named ``Quotient''. In a checked-out Nevow tree there is a directory
3069 named ``formless'' that contains a python source file named
3070 ``webform.py''. This repository is accessible via webdav (and thus
3071 uses an ``http:'' scheme) through the divmod.org hostname. There are
3072 many branches in this repository, and they use a
3073 (BRANCHNAME)/(PROJECT) naming policy.
3075 The fully-qualified SVN URL for the trunk version of webform.py is
3076 @code{http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.py}.
3077 You can do an @code{svn co} with that URL and get a copy of the latest
3078 version. The 1.5.x branch version of this file would have a URL of
3079 @code{http://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.py}.
3080 The whole Nevow trunk would be checked out with
3081 @code{http://divmod.org/svn/Divmod/trunk/Nevow}, while the Quotient
3082 trunk would be checked out using
3083 @code{http://divmod.org/svn/Divmod/trunk/Quotient}.
3085 Now suppose we want to have an @code{SVNPoller} that only cares about
3086 the Nevow trunk. This case looks just like the PROJECT/BRANCH layout
3087 described earlier:
3089 @example
3090 from buildbot.changes.svnpoller import SVNPoller
3091 s = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")
3092 c['sources'].append(ss)
3093 @end example
3095 But what happens when we want to track multiple Nevow branches? We
3096 have to point our @code{svnurl=} high enough to see all those
3097 branches, but we also don't want to include Quotient changes (since
3098 we're only building Nevow). To accomplish this, we must rely upon the
3099 @code{split_file} function to help us tell the difference between
3100 files that belong to Nevow and those that belong to Quotient, as well
3101 as figuring out which branch each one is on.
3103 @example
3104 from buildbot.changes.svnpoller import SVNPoller
3105 s = SVNPoller("http://divmod.org/svn/Divmod",
3106               split_file=my_file_splitter)
3107 c['sources'].append(ss)
3108 @end example
3110 The @code{my_file_splitter} function will be called with
3111 repository-relative pathnames like:
3113 @table @code
3114 @item trunk/Nevow/formless/webform.py
3115 This is a Nevow file, on the trunk. We want the Change that includes this
3116 to see a filename of @code{formless/webform.py"}, and a branch of None
3118 @item branches/1.5.x/Nevow/formless/webform.py
3119 This is a Nevow file, on a branch. We want to get
3120 branch=''branches/1.5.x'' and filename=''formless/webform.py''.
3122 @item trunk/Quotient/setup.py
3123 This is a Quotient file, so we want to ignore it by having
3124 @code{my_file_splitter} return None.
3126 @item branches/1.5.x/Quotient/setup.py
3127 This is also a Quotient file, which should be ignored.
3128 @end table
3130 The following definition for @code{my_file_splitter} will do the job:
3132 @example
3133 def my_file_splitter(path):
3134     pieces = path.split('/')
3135     if pieces[0] == 'trunk':
3136         branch = None
3137         pieces.pop(0) # remove 'trunk'
3138     elif pieces[0] == 'branches':
3139         pieces.pop(0) # remove 'branches'
3140         # grab branch name
3141         branch = 'branches/' + pieces.pop(0)
3142     else:
3143         return None # something weird
3144     projectname = pieces.pop(0)
3145     if projectname != 'Nevow':
3146         return None # wrong project
3147     return (branch, '/'.join(pieces))
3148 @end example
3150 @node MercurialHook,  , SVNPoller, Getting Source Code Changes
3151 @section MercurialHook
3153 Since Mercurial is written in python, the hook script can invoke
3154 Buildbot's @code{sendchange} function directly, rather than having to
3155 spawn an external process. This function delivers the same sort of
3156 changes as @code{buildbot sendchange} and the various hook scripts in
3157 contrib/, so you'll need to add a @code{pb.PBChangeSource} to your
3158 buildmaster to receive these changes.
3160 To set this up, first choose a Mercurial repository that represents
3161 your central ``official'' source tree. This will be the same
3162 repository that your buildslaves will eventually pull from. Install
3163 Buildbot on the machine that hosts this repository, using the same
3164 version of python as Mercurial is using (so that the Mercurial hook
3165 can import code from buildbot). Then add the following to the
3166 @code{.hg/hgrc} file in that repository, replacing the buildmaster
3167 hostname/portnumber as appropriate for your buildbot:
3169 @example
3170 [hooks]
3171 changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook
3173 [hgbuildbot]
3174 master = buildmaster.example.org:9987
3175 @end example
3177 (Note that Mercurial lets you define multiple @code{changegroup} hooks
3178 by giving them distinct names, like @code{changegroup.foo} and
3179 @code{changegroup.bar}, which is why we use
3180 @code{changegroup.buildbot} in this example. There is nothing magical
3181 about the ``buildbot'' suffix in the hook name. The
3182 @code{[hgbuildbot]} section @emph{is} special, however, as it is the
3183 only section that the buildbot hook pays attention to.)
3185 Also note that this runs as a @code{changegroup} hook, rather than as
3186 an @code{incoming} hook. The @code{changegroup} hook is run with
3187 multiple revisions at a time (say, if multiple revisions are being
3188 pushed to this repository in a single @command{hg push} command),
3189 whereas the @code{incoming} hook is run with just one revision at a
3190 time. The @code{hgbuildbot.hook} function will only work with the
3191 @code{changegroup} hook.
3193 The @code{[hgbuildbot]} section has two other parameters that you
3194 might specify, both of which control the name of the branch that is
3195 attached to the changes coming from this hook.
3197 One common branch naming policy for Mercurial repositories is to use
3198 it just like Darcs: each branch goes into a separate repository, and
3199 all the branches for a single project share a common parent directory.
3200 For example, you might have @file{/var/repos/PROJECT/trunk/} and
3201 @file{/var/repos/PROJECT/release}. To use this style, use the
3202 @code{branchtype = dirname} setting, which simply uses the last
3203 component of the repository's enclosing directory as the branch name:
3205 @example
3206 [hgbuildbot]
3207 master = buildmaster.example.org:9987
3208 branchtype = dirname
3209 @end example
3211 Another approach is to use Mercurial's built-in branches (the kind
3212 created with @command{hg branch} and listed with @command{hg
3213 branches}). This feature associates persistent names with particular
3214 lines of descent within a single repository. (note that the buildbot
3215 @code{source.Mercurial} checkout step does not yet support this kind
3216 of branch). To have the commit hook deliver this sort of branch name
3217 with the Change object, use @code{branchtype = inrepo}:
3219 @example
3220 [hgbuildbot]
3221 master = buildmaster.example.org:9987
3222 branchtype = inrepo
3223 @end example
3225 Finally, if you want to simply specify the branchname directly, for
3226 all changes, use @code{branch = BRANCHNAME}. This overrides
3227 @code{branchtype}:
3229 @example
3230 [hgbuildbot]
3231 master = buildmaster.example.org:9987
3232 branch = trunk
3233 @end example
3235 If you use @code{branch=} like this, you'll need to put a separate
3236 .hgrc in each repository. If you use @code{branchtype=}, you may be
3237 able to use the same .hgrc for all your repositories, stored in
3238 @file{~/.hgrc} or @file{/etc/mercurial/hgrc}.
3241 @node Build Process, Status Delivery, Getting Source Code Changes, Top
3242 @chapter Build Process
3244 A @code{Build} object is responsible for actually performing a build.
3245 It gets access to a remote @code{SlaveBuilder} where it may run
3246 commands, and a @code{BuildStatus} object where it must emit status
3247 events. The @code{Build} is created by the Builder's
3248 @code{BuildFactory}.
3250 The default @code{Build} class is made up of a fixed sequence of
3251 @code{BuildSteps}, executed one after another until all are complete
3252 (or one of them indicates that the build should be halted early). The
3253 default @code{BuildFactory} creates instances of this @code{Build}
3254 class with a list of @code{BuildSteps}, so the basic way to configure
3255 the build is to provide a list of @code{BuildSteps} to your
3256 @code{BuildFactory}.
3258 More complicated @code{Build} subclasses can make other decisions:
3259 execute some steps only if certain files were changed, or if certain
3260 previous steps passed or failed. The base class has been written to
3261 allow users to express basic control flow without writing code, but
3262 you can always subclass and customize to achieve more specialized
3263 behavior.
3265 @menu
3266 * Build Steps::                 
3267 * Interlocks::                  
3268 * Build Factories::             
3269 @end menu
3271 @node Build Steps, Interlocks, Build Process, Build Process
3272 @section Build Steps
3274 @code{BuildStep}s are usually specified in the buildmaster's
3275 configuration file, in a list that goes into the @code{BuildFactory}.
3276 The @code{BuildStep} instances in this list are used as templates to
3277 construct new independent copies for each build (so that state can be
3278 kept on the @code{BuildStep} in one build without affecting a later
3279 build). Each @code{BuildFactory} can be created with a list of steps,
3280 or the factory can be created empty and then steps added to it using
3281 the @code{addStep} method:
3283 @example
3284 from buildbot.steps import source, shell
3285 from buildbot.process import factory
3287 f = factory.BuildFactory()
3288 f.addStep(source.SVN(svnurl="http://svn.example.org/Trunk/"))
3289 f.addStep(shell.ShellCommand(command=["make", "all"]))
3290 f.addStep(shell.ShellCommand(command=["make", "test"]))
3291 @end example
3293 In earlier versions (0.7.5 and older), these steps were specified with
3294 a tuple of (step_class, keyword_arguments). Steps can still be
3295 specified this way, but the preferred form is to pass actual
3296 @code{BuildStep} instances to @code{addStep}, because that gives the
3297 @code{BuildStep} class a chance to do some validation on the
3298 arguments.
3300 The rest of this section lists all the standard BuildStep objects
3301 available for use in a Build, and the parameters which can be used to
3302 control each.
3304 @menu
3305 * Common Parameters::           
3306 * Source Checkout::             
3307 * ShellCommand::                
3308 * Simple ShellCommand Subclasses::  
3309 * Python BuildSteps::           
3310 * Transferring Files::          
3311 * Writing New BuildSteps::      
3312 @end menu
3314 @node Common Parameters, Source Checkout, Build Steps, Build Steps
3315 @subsection Common Parameters
3317 The standard @code{Build} runs a series of @code{BuildStep}s in order,
3318 only stopping when it runs out of steps or if one of them requests
3319 that the build be halted. It collects status information from each one
3320 to create an overall build status (of SUCCESS, WARNINGS, or FAILURE).
3322 All BuildSteps accept some common parameters. Some of these control
3323 how their individual status affects the overall build. Others are used
3324 to specify which @code{Locks} (see @pxref{Interlocks}) should be
3325 acquired before allowing the step to run.
3327 Arguments common to all @code{BuildStep} subclasses:
3330 @table @code
3331 @item name
3332 the name used to describe the step on the status display. It is also
3333 used to give a name to any LogFiles created by this step.
3335 @item haltOnFailure
3336 if True, a FAILURE of this build step will cause the build to halt
3337 immediately with an overall result of FAILURE.
3339 @item flunkOnWarnings
3340 when True, a WARNINGS or FAILURE of this build step will mark the
3341 overall build as FAILURE. The remaining steps will still be executed.
3343 @item flunkOnFailure
3344 when True, a FAILURE of this build step will mark the overall build as
3345 a FAILURE. The remaining steps will still be executed.
3347 @item warnOnWarnings
3348 when True, a WARNINGS or FAILURE of this build step will mark the
3349 overall build as having WARNINGS. The remaining steps will still be
3350 executed.
3352 @item warnOnFailure
3353 when True, a FAILURE of this build step will mark the overall build as
3354 having WARNINGS. The remaining steps will still be executed.
3356 @item locks
3357 a list of Locks (instances of @code{buildbot.locks.SlaveLock} or
3358 @code{buildbot.locks.MasterLock}) that should be acquired before
3359 starting this Step. The Locks will be released when the step is
3360 complete. Note that this is a list of actual Lock instances, not
3361 names. Also note that all Locks must have unique names.
3363 @end table
3366 @node Source Checkout, ShellCommand, Common Parameters, Build Steps
3367 @subsection Source Checkout
3369 The first step of any build is typically to acquire the source code
3370 from which the build will be performed. There are several classes to
3371 handle this, one for each of the different source control system that
3372 Buildbot knows about. For a description of how Buildbot treats source
3373 control in general, see @ref{Version Control Systems}.
3375 All source checkout steps accept some common parameters to control how
3376 they get the sources and where they should be placed. The remaining
3377 per-VC-system parameters are mostly to specify where exactly the
3378 sources are coming from.
3380 @table @code
3381 @item mode
3383 a string describing the kind of VC operation that is desired. Defaults
3384 to @code{update}.
3386 @table @code
3387 @item update
3388 specifies that the CVS checkout/update should be performed directly
3389 into the workdir. Each build is performed in the same directory,
3390 allowing for incremental builds. This minimizes disk space, bandwidth,
3391 and CPU time. However, it may encounter problems if the build process
3392 does not handle dependencies properly (sometimes you must do a ``clean
3393 build'' to make sure everything gets compiled), or if source files are
3394 deleted but generated files can influence test behavior (e.g. python's
3395 .pyc files), or when source directories are deleted but generated
3396 files prevent CVS from removing them. Builds ought to be correct
3397 regardless of whether they are done ``from scratch'' or incrementally,
3398 but it is useful to test both kinds: this mode exercises the
3399 incremental-build style.
3401 @item copy
3402 specifies that the CVS workspace should be maintained in a separate
3403 directory (called the 'copydir'), using checkout or update as
3404 necessary. For each build, a new workdir is created with a copy of the
3405 source tree (rm -rf workdir; cp -r copydir workdir). This doubles the
3406 disk space required, but keeps the bandwidth low (update instead of a
3407 full checkout). A full 'clean' build is performed each time. This
3408 avoids any generated-file build problems, but is still occasionally
3409 vulnerable to CVS problems such as a repository being manually
3410 rearranged, causing CVS errors on update which are not an issue with a
3411 full checkout.
3413 @c TODO: something is screwy about this, revisit. Is it the source
3414 @c directory or the working directory that is deleted each time?
3416 @item clobber
3417 specifes that the working directory should be deleted each time,
3418 necessitating a full checkout for each build. This insures a clean
3419 build off a complete checkout, avoiding any of the problems described
3420 above. This mode exercises the ``from-scratch'' build style.
3422 @item export
3423 this is like @code{clobber}, except that the 'cvs export' command is
3424 used to create the working directory. This command removes all CVS
3425 metadata files (the CVS/ directories) from the tree, which is
3426 sometimes useful for creating source tarballs (to avoid including the
3427 metadata in the tar file).
3428 @end table
3430 @item workdir
3431 like all Steps, this indicates the directory where the build will take
3432 place. Source Steps are special in that they perform some operations
3433 outside of the workdir (like creating the workdir itself).
3435 @item alwaysUseLatest
3436 if True, bypass the usual ``update to the last Change'' behavior, and
3437 always update to the latest changes instead.
3439 @item retry
3440 If set, this specifies a tuple of @code{(delay, repeats)} which means
3441 that when a full VC checkout fails, it should be retried up to
3442 @var{repeats} times, waiting @var{delay} seconds between attempts. If
3443 you don't provide this, it defaults to @code{None}, which means VC
3444 operations should not be retried. This is provided to make life easier
3445 for buildslaves which are stuck behind poor network connections.
3447 @end table
3450 My habit as a developer is to do a @code{cvs update} and @code{make} each
3451 morning. Problems can occur, either because of bad code being checked in, or
3452 by incomplete dependencies causing a partial rebuild to fail where a
3453 complete from-scratch build might succeed. A quick Builder which emulates
3454 this incremental-build behavior would use the @code{mode='update'}
3455 setting.
3457 On the other hand, other kinds of dependency problems can cause a clean
3458 build to fail where a partial build might succeed. This frequently results
3459 from a link step that depends upon an object file that was removed from a
3460 later version of the tree: in the partial tree, the object file is still
3461 around (even though the Makefiles no longer know how to create it).
3463 ``official'' builds (traceable builds performed from a known set of
3464 source revisions) are always done as clean builds, to make sure it is
3465 not influenced by any uncontrolled factors (like leftover files from a
3466 previous build). A ``full'' Builder which behaves this way would want
3467 to use the @code{mode='clobber'} setting.
3469 Each VC system has a corresponding source checkout class: their
3470 arguments are described on the following pages.
3473 @menu
3474 * CVS::                         
3475 * SVN::                         
3476 * Darcs::                       
3477 * Mercurial::                   
3478 * Arch::                        
3479 * Bazaar::                      
3480 * Bzr::                         
3481 * P4::                          
3482 @end menu
3484 @node CVS, SVN, Source Checkout, Source Checkout
3485 @subsubsection CVS
3486 @cindex CVS Checkout
3487 @bsindex buildbot.steps.source.CVS
3490 The @code{CVS} build step performs a @uref{http://www.nongnu.org/cvs/,
3491 CVS} checkout or update. It takes the following arguments:
3493 @table @code
3494 @item cvsroot
3495 (required): specify the CVSROOT value, which points to a CVS
3496 repository, probably on a remote machine. For example, the cvsroot
3497 value you would use to get a copy of the Buildbot source code is
3498 @code{:pserver:anonymous@@cvs.sourceforge.net:/cvsroot/buildbot}
3500 @item cvsmodule
3501 (required): specify the cvs @code{module}, which is generally a
3502 subdirectory of the CVSROOT. The cvsmodule for the Buildbot source
3503 code is @code{buildbot}.
3505 @item branch
3506 a string which will be used in a @code{-r} argument. This is most
3507 useful for specifying a branch to work on. Defaults to @code{HEAD}.
3509 @item global_options
3510 a list of flags to be put before the verb in the CVS command.
3512 @item checkoutDelay
3513 if set, the number of seconds to put between the timestamp of the last
3514 known Change and the value used for the @code{-D} option. Defaults to
3515 half of the parent Build's treeStableTimer.
3517 @end table
3520 @node SVN, Darcs, CVS, Source Checkout
3521 @subsubsection SVN
3523 @cindex SVN Checkout
3524 @bsindex buildbot.steps.source.SVN
3527 The @code{SVN} build step performs a
3528 @uref{http://subversion.tigris.org, Subversion} checkout or update.
3529 There are two basic ways of setting up the checkout step, depending
3530 upon whether you are using multiple branches or not.
3532 If all of your builds use the same branch, then you should create the
3533 @code{SVN} step with the @code{svnurl} argument:
3535 @table @code
3536 @item svnurl
3537 (required): this specifies the @code{URL} argument that will be given
3538 to the @code{svn checkout} command. It dictates both where the
3539 repository is located and which sub-tree should be extracted. In this
3540 respect, it is like a combination of the CVS @code{cvsroot} and
3541 @code{cvsmodule} arguments. For example, if you are using a remote
3542 Subversion repository which is accessible through HTTP at a URL of
3543 @code{http://svn.example.com/repos}, and you wanted to check out the
3544 @code{trunk/calc} sub-tree, you would use
3545 @code{svnurl="http://svn.example.com/repos/trunk/calc"} as an argument
3546 to your @code{SVN} step.
3547 @end table
3549 If, on the other hand, you are building from multiple branches, then
3550 you should create the @code{SVN} step with the @code{baseURL} and
3551 @code{defaultBranch} arguments instead:
3553 @table @code
3554 @item baseURL
3555 (required): this specifies the base repository URL, to which a branch
3556 name will be appended. It should probably end in a slash.
3558 @item defaultBranch
3559 this specifies the name of the branch to use when a Build does not
3560 provide one of its own. This will be appended to @code{baseURL} to
3561 create the string that will be passed to the @code{svn checkout}
3562 command.
3563 @end table
3565 If you are using branches, you must also make sure your
3566 @code{ChangeSource} will report the correct branch names.
3568 @heading branch example
3570 Let's suppose that the ``MyProject'' repository uses branches for the
3571 trunk, for various users' individual development efforts, and for
3572 several new features that will require some amount of work (involving
3573 multiple developers) before they are ready to merge onto the trunk.
3574 Such a repository might be organized as follows:
3576 @example
3577 svn://svn.example.org/MyProject/trunk
3578 svn://svn.example.org/MyProject/branches/User1/foo
3579 svn://svn.example.org/MyProject/branches/User1/bar
3580 svn://svn.example.org/MyProject/branches/User2/baz
3581 svn://svn.example.org/MyProject/features/newthing
3582 svn://svn.example.org/MyProject/features/otherthing
3583 @end example
3585 Further assume that we want the Buildbot to run tests against the
3586 trunk and against all the feature branches (i.e., do a
3587 checkout/compile/build of branch X when a file has been changed on
3588 branch X, when X is in the set [trunk, features/newthing,
3589 features/otherthing]). We do not want the Buildbot to automatically
3590 build any of the user branches, but it should be willing to build a
3591 user branch when explicitly requested (most likely by the user who
3592 owns that branch).
3594 There are three things that need to be set up to accomodate this
3595 system. The first is a ChangeSource that is capable of identifying the
3596 branch which owns any given file. This depends upon a user-supplied
3597 function, in an external program that runs in the SVN commit hook and
3598 connects to the buildmaster's @code{PBChangeSource} over a TCP
3599 connection. (you can use the ``@code{buildbot sendchange}'' utility
3600 for this purpose, but you will still need an external program to
3601 decide what value should be passed to the @code{--branch=} argument).
3602 For example, a change to a file with the SVN url of
3603 ``svn://svn.example.org/MyProject/features/newthing/src/foo.c'' should
3604 be broken down into a Change instance with
3605 @code{branch='features/newthing'} and @code{file='src/foo.c'}.
3607 The second piece is an @code{AnyBranchScheduler} which will pay
3608 attention to the desired branches. It will not pay attention to the
3609 user branches, so it will not automatically start builds in response
3610 to changes there. The AnyBranchScheduler class requires you to
3611 explicitly list all the branches you want it to use, but it would not
3612 be difficult to write a subclass which used
3613 @code{branch.startswith('features/'} to remove the need for this
3614 explicit list. Or, if you want to build user branches too, you can use
3615 AnyBranchScheduler with @code{branches=None} to indicate that you want
3616 it to pay attention to all branches.
3618 The third piece is an @code{SVN} checkout step that is configured to
3619 handle the branches correctly, with a @code{baseURL} value that
3620 matches the way the ChangeSource splits each file's URL into base,
3621 branch, and file.
3623 @example
3624 from buildbot.changes.pb import PBChangeSource
3625 from buildbot.scheduler import AnyBranchScheduler
3626 from buildbot.process import source, factory
3627 from buildbot.steps import source, shell
3629 c['sources'] = [PBChangeSource()]
3630 s1 = AnyBranchScheduler('main',
3631                         ['trunk', 'features/newthing', 'features/otherthing'],
3632                         10*60, ['test-i386', 'test-ppc'])
3633 c['schedulers'] = [s1]
3635 f = factory.BuildFactory()
3636 f.addStep(source.SVN(mode='update',
3637                      baseURL='svn://svn.example.org/MyProject/',
3638                      defaultBranch='trunk'))
3639 f.addStep(shell.Compile(command="make all"))
3640 f.addStep(shell.Test(command="make test"))
3642 c['builders'] = [
3643   @{'name':'test-i386', 'slavename':'bot-i386', 'builddir':'test-i386',
3644                        'factory':f @},
3645   @{'name':'test-ppc', 'slavename':'bot-ppc', 'builddir':'test-ppc',
3646                       'factory':f @},
3648 @end example
3650 In this example, when a change arrives with a @code{branch} attribute
3651 of ``trunk'', the resulting build will have an SVN step that
3652 concatenates ``svn://svn.example.org/MyProject/'' (the baseURL) with
3653 ``trunk'' (the branch name) to get the correct svn command. If the
3654 ``newthing'' branch has a change to ``src/foo.c'', then the SVN step
3655 will concatenate ``svn://svn.example.org/MyProject/'' with
3656 ``features/newthing'' to get the svnurl for checkout.
3658 @node Darcs, Mercurial, SVN, Source Checkout
3659 @subsubsection Darcs
3661 @cindex Darcs Checkout
3662 @bsindex buildbot.steps.source.Darcs
3665 The @code{Darcs} build step performs a
3666 @uref{http://abridgegame.org/darcs/, Darcs} checkout or update.
3668 Like @xref{SVN}, this step can either be configured to always check
3669 out a specific tree, or set up to pull from a particular branch that
3670 gets specified separately for each build. Also like SVN, the
3671 repository URL given to Darcs is created by concatenating a
3672 @code{baseURL} with the branch name, and if no particular branch is
3673 requested, it uses a @code{defaultBranch}. The only difference in
3674 usage is that each potential Darcs repository URL must point to a
3675 fully-fledged repository, whereas SVN URLs usually point to sub-trees
3676 of the main Subversion repository. In other words, doing an SVN
3677 checkout of @code{baseURL} is legal, but silly, since you'd probably
3678 wind up with a copy of every single branch in the whole repository.
3679 Doing a Darcs checkout of @code{baseURL} is just plain wrong, since
3680 the parent directory of a collection of Darcs repositories is not
3681 itself a valid repository.
3683 The Darcs step takes the following arguments:
3685 @table @code
3686 @item repourl
3687 (required unless @code{baseURL} is provided): the URL at which the
3688 Darcs source repository is available.
3690 @item baseURL
3691 (required unless @code{repourl} is provided): the base repository URL,
3692 to which a branch name will be appended. It should probably end in a
3693 slash.
3695 @item defaultBranch
3696 (allowed if and only if @code{baseURL} is provided): this specifies
3697 the name of the branch to use when a Build does not provide one of its
3698 own. This will be appended to @code{baseURL} to create the string that
3699 will be passed to the @code{darcs get} command.
3700 @end table
3702 @node Mercurial, Arch, Darcs, Source Checkout
3703 @subsubsection Mercurial
3705 @cindex Mercurial Checkout
3706 @bsindex buildbot.steps.source.Mercurial
3709 The @code{Mercurial} build step performs a
3710 @uref{http://selenic.com/mercurial, Mercurial} (aka ``hg'') checkout
3711 or update.
3713 Branches are handled just like @xref{Darcs}.
3715 The Mercurial step takes the following arguments:
3717 @table @code
3718 @item repourl
3719 (required unless @code{baseURL} is provided): the URL at which the
3720 Mercurial source repository is available.
3722 @item baseURL
3723 (required unless @code{repourl} is provided): the base repository URL,
3724 to which a branch name will be appended. It should probably end in a
3725 slash.
3727 @item defaultBranch
3728 (allowed if and only if @code{baseURL} is provided): this specifies
3729 the name of the branch to use when a Build does not provide one of its
3730 own. This will be appended to @code{baseURL} to create the string that
3731 will be passed to the @code{hg clone} command.
3732 @end table
3735 @node Arch, Bazaar, Mercurial, Source Checkout
3736 @subsubsection Arch
3738 @cindex Arch Checkout
3739 @bsindex buildbot.steps.source.Arch
3742 The @code{Arch} build step performs an @uref{http://gnuarch.org/,
3743 Arch} checkout or update using the @code{tla} client. It takes the
3744 following arguments:
3746 @table @code
3747 @item url
3748 (required): this specifies the URL at which the Arch source archive is
3749 available.
3751 @item version
3752 (required): this specifies which ``development line'' (like a branch)
3753 should be used. This provides the default branch name, but individual
3754 builds may specify a different one.
3756 @item archive
3757 (optional): Each repository knows its own archive name. If this
3758 parameter is provided, it must match the repository's archive name.
3759 The parameter is accepted for compatibility with the @code{Bazaar}
3760 step, below.
3762 @end table
3764 @node Bazaar, Bzr, Arch, Source Checkout
3765 @subsubsection Bazaar
3767 @cindex Bazaar Checkout
3768 @bsindex buildbot.steps.source.Bazaar
3771 @code{Bazaar} is an alternate implementation of the Arch VC system,
3772 which uses a client named @code{baz}. The checkout semantics are just
3773 different enough from @code{tla} that there is a separate BuildStep for
3776 It takes exactly the same arguments as @code{Arch}, except that the
3777 @code{archive=} parameter is required. (baz does not emit the archive
3778 name when you do @code{baz register-archive}, so we must provide it
3779 ourselves).
3782 @node Bzr, P4, Bazaar, Source Checkout
3783 @subsubsection Bzr
3785 @cindex Bzr Checkout
3786 @bsindex buildbot.steps.source.Bzr
3788 @code{bzr} is a descendant of Arch/Baz, and is frequently referred to
3789 as simply ``Bazaar''. The repository-vs-workspace model is similar to
3790 Darcs, but it uses a strictly linear sequence of revisions (one
3791 history per branch) like Arch. Branches are put in subdirectories.
3792 This makes it look very much like Mercurial, so it takes the same
3793 arguments:
3795 @table @code
3797 @item repourl
3798 (required unless @code{baseURL} is provided): the URL at which the
3799 Bzr source repository is available.
3801 @item baseURL
3802 (required unless @code{repourl} is provided): the base repository URL,
3803 to which a branch name will be appended. It should probably end in a
3804 slash.
3806 @item defaultBranch
3807 (allowed if and only if @code{baseURL} is provided): this specifies
3808 the name of the branch to use when a Build does not provide one of its
3809 own. This will be appended to @code{baseURL} to create the string that
3810 will be passed to the @code{bzr checkout} command.
3811 @end table
3815 @node P4,  , Bzr, Source Checkout
3816 @subsubsection P4
3818 @cindex Perforce Update
3819 @bsindex buildbot.steps.source.P4
3820 @c TODO @bsindex buildbot.steps.source.P4Sync
3823 The @code{P4} build step creates a @uref{http://www.perforce.com/,
3824 Perforce} client specification and performs an update.
3826 @table @code
3827 @item p4base
3828 A view into the Perforce depot without branch name or trailing "...".
3829 Typically "//depot/proj/".
3830 @item defaultBranch
3831 A branch name to append on build requests if none is specified.
3832 Typically "trunk".
3833 @item p4port
3834 (optional): the host:port string describing how to get to the P4 Depot
3835 (repository), used as the -p argument for all p4 commands.
3836 @item p4user
3837 (optional): the Perforce user, used as the -u argument to all p4
3838 commands.
3839 @item p4passwd
3840 (optional): the Perforce password, used as the -p argument to all p4
3841 commands.
3842 @item p4extra_views
3843 (optional): a list of (depotpath, clientpath) tuples containing extra
3844 views to be mapped into the client specification. Both will have
3845 "/..." appended automatically. The client name and source directory
3846 will be prepended to the client path.
3847 @item p4client
3848 (optional): The name of the client to use. In mode='copy' and
3849 mode='update', it's particularly important that a unique name is used
3850 for each checkout directory to avoid incorrect synchronization. For
3851 this reason, Python percent substitution will be performed on this value
3852 to replace %(slave)s with the slave name and %(builder)s with the
3853 builder name. The default is "buildbot_%(slave)s_%(build)s".
3854 @end table
3856 @node ShellCommand, Simple ShellCommand Subclasses, Source Checkout, Build Steps
3857 @subsection ShellCommand
3859 @bsindex buildbot.steps.shell.ShellCommand
3860 @c TODO @bsindex buildbot.steps.shell.TreeSize
3862 This is a useful base class for just about everything you might want
3863 to do during a build (except for the initial source checkout). It runs
3864 a single command in a child shell on the buildslave. All stdout/stderr
3865 is recorded into a LogFile. The step finishes with a status of FAILURE
3866 if the command's exit code is non-zero, otherwise it has a status of
3867 SUCCESS.
3869 The preferred way to specify the command is with a list of argv strings,
3870 since this allows for spaces in filenames and avoids doing any fragile
3871 shell-escaping. You can also specify the command with a single string, in
3872 which case the string is given to '/bin/sh -c COMMAND' for parsing.
3874 All ShellCommands are run by default in the ``workdir'', which
3875 defaults to the ``@file{build}'' subdirectory of the slave builder's
3876 base directory. The absolute path of the workdir will thus be the
3877 slave's basedir (set as an option to @code{buildbot create-slave},
3878 @pxref{Creating a buildslave}) plus the builder's basedir (set in the
3879 builder's @code{c['builddir']} key in master.cfg) plus the workdir
3880 itself (a class-level attribute of the BuildFactory, defaults to
3881 ``@file{build}'').
3883 @code{ShellCommand} arguments:
3885 @table @code
3886 @item command
3887 a list of strings (preferred) or single string (discouraged) which
3888 specifies the command to be run. A list of strings is preferred
3889 because it can be used directly as an argv array. Using a single
3890 string (with embedded spaces) requires the buildslave to pass the
3891 string to /bin/sh for interpretation, which raises all sorts of
3892 difficult questions about how to escape or interpret shell
3893 metacharacters.
3895 @item env
3896 a dictionary of environment strings which will be added to the child
3897 command's environment. For example, to run tests with a different i18n
3898 language setting, you might use
3900 @example
3901 f.addStep(ShellCommand, command=["make", "test"],
3902           env=@{'LANG': 'fr_FR'@})
3903 @end example
3905 These variable settings will override any existing ones in the
3906 buildslave's environment. The exception is PYTHONPATH, which is merged
3907 with (actually prepended to) any existing $PYTHONPATH setting. The
3908 value is treated as a list of directories to prepend, and a single
3909 string is treated like a one-item list. For example, to prepend both
3910 @file{/usr/local/lib/python2.3} and @file{/home/buildbot/lib/python}
3911 to any existing $PYTHONPATH setting, you would do something like the
3912 following:
3914 @example
3915 f.addStep(ShellCommand, command=["make", "test"],
3916           env=@{'PYTHONPATH': ["/usr/local/lib/python2.3",
3917                               "/home/buildbot/lib/python"] @})
3918 @end example
3920 @item want_stdout
3921 if False, stdout from the child process is discarded rather than being
3922 sent to the buildmaster for inclusion in the step's LogFile.
3924 @item want_stderr
3925 like @code{want_stdout} but for stderr. Note that commands run through
3926 a PTY do not have separate stdout/stderr streams: both are merged into
3927 stdout.
3929 @item logfiles
3930 Sometimes commands will log interesting data to a local file, rather
3931 than emitting everything to stdout or stderr. For example, Twisted's
3932 ``trial'' command (which runs unit tests) only presents summary
3933 information to stdout, and puts the rest into a file named
3934 @file{_trial_temp/test.log}. It is often useful to watch these files
3935 as the command runs, rather than using @command{/bin/cat} to dump
3936 their contents afterwards.
3938 The @code{logfiles=} argument allows you to collect data from these
3939 secondary logfiles in near-real-time, as the step is running. It
3940 accepts a dictionary which maps from a local Log name (which is how
3941 the log data is presented in the build results) to a remote filename
3942 (interpreted relative to the build's working directory). Each named
3943 file will be polled on a regular basis (every couple of seconds) as
3944 the build runs, and any new text will be sent over to the buildmaster.
3946 @example
3947 f.addStep(ShellCommand, command=["make", "test"],
3948           logfiles=@{"triallog": "_trial_temp/test.log"@})
3949 @end example
3952 @item timeout
3953 if the command fails to produce any output for this many seconds, it
3954 is assumed to be locked up and will be killed.
3956 @item description
3957 This will be used to describe the command (on the Waterfall display)
3958 while the command is still running. It should be a single
3959 imperfect-tense verb, like ``compiling'' or ``testing''. The preferred
3960 form is a list of short strings, which allows the HTML Waterfall
3961 display to create narrower columns by emitting a <br> tag between each
3962 word. You may also provide a single string.
3964 @item descriptionDone
3965 This will be used to describe the command once it has finished. A
3966 simple noun like ``compile'' or ``tests'' should be used. Like
3967 @code{description}, this may either be a list of short strings or a
3968 single string.
3970 If neither @code{description} nor @code{descriptionDone} are set, the
3971 actual command arguments will be used to construct the description.
3972 This may be a bit too wide to fit comfortably on the Waterfall
3973 display.
3975 @example
3976 f.addStep(ShellCommand, command=["make", "test"],
3977           description=["testing"],
3978           descriptionDone=["tests"])
3979 @end example
3981 @end table
3983 @node Simple ShellCommand Subclasses, Python BuildSteps, ShellCommand, Build Steps
3984 @subsection Simple ShellCommand Subclasses
3986 Several subclasses of ShellCommand are provided as starting points for
3987 common build steps. These are all very simple: they just override a few
3988 parameters so you don't have to specify them yourself, making the master.cfg
3989 file less verbose.
3991 @menu
3992 * Configure::                   
3993 * Compile::                     
3994 * Test::                        
3995 * Build Properties::            
3996 @end menu
3998 @node Configure, Compile, Simple ShellCommand Subclasses, Simple ShellCommand Subclasses
3999 @subsubsection Configure
4001 @bsindex buildbot.steps.shell.Configure
4003 This is intended to handle the @code{./configure} step from
4004 autoconf-style projects, or the @code{perl Makefile.PL} step from perl
4005 MakeMaker.pm-style modules. The default command is @code{./configure}
4006 but you can change this by providing a @code{command=} parameter.
4008 @node Compile, Test, Configure, Simple ShellCommand Subclasses
4009 @subsubsection Compile
4011 @bsindex buildbot.steps.shell.Compile
4013 This is meant to handle compiling or building a project written in C. The
4014 default command is @code{make all}. When the compile is finished, the
4015 log file is scanned for GCC error/warning messages and a summary log is
4016 created with any problems that were seen (TODO: the summary is not yet
4017 created).
4019 @node Test, Build Properties, Compile, Simple ShellCommand Subclasses
4020 @subsubsection Test
4022 @bsindex buildbot.steps.shell.Test
4024 This is meant to handle unit tests. The default command is @code{make
4025 test}, and the @code{warnOnFailure} flag is set.
4029 @node Build Properties,  , Test, Simple ShellCommand Subclasses
4030 @subsubsection Build Properties
4032 @cindex build properties
4034 Each build has a set of ``Build Properties'', which can be used by its
4035 BuildStep to modify their actions. For example, the SVN revision
4036 number of the source code being built is available as a build
4037 property, and a ShellCommand step could incorporate this number into a
4038 command which create a numbered release tarball.
4040 Some build properties are set when the build starts, such as the
4041 SourceStamp information. Other properties can be set by BuildSteps as
4042 they run, for example the various Source steps will set the
4043 @code{got_revision} property to the source revision that was actually
4044 checked out (which can be useful when the SourceStamp in use merely
4045 requested the ``latest revision'': @code{got_revision} will tell you
4046 what was actually built).
4048 In custom BuildSteps, you can get and set the build properties with
4049 the @code{getProperty}/@code{setProperty} methods. Each takes a string
4050 for the name of the property, and returns or accepts an
4051 arbitrary@footnote{Build properties are serialized along with the
4052 build results, so they must be serializable. For this reason, the
4053 value of any build property should be simple inert data: strings,
4054 numbers, lists, tuples, and dictionaries. They should not contain
4055 class instances.} object. For example:
4057 @example
4058 class MakeTarball(ShellCommand):
4059     def start(self):
4060         self.setCommand(["tar", "czf",
4061                          "build-%s.tar.gz" % self.getProperty("revision"),
4062                          "source"])
4063         ShellCommand.start(self)
4064 @end example
4066 @cindex WithProperties
4068 You can use build properties in ShellCommands by using the
4069 @code{WithProperties} wrapper when setting the arguments of the
4070 ShellCommand. This interpolates the named build properties into the
4071 generated shell command. You can also use a @code{WithProperties} as
4072 the @code{workdir=} argument: this allows the working directory for a
4073 command to be varied for each build, depending upon various build
4074 properties.
4076 @example
4077 from buildbot.steps.shell import ShellCommand, WithProperties
4079 f.addStep(ShellCommand,
4080           command=["tar", "czf",
4081                    WithProperties("build-%s.tar.gz", "revision"),
4082                    "source"])
4083 @end example
4085 If this BuildStep were used in a tree obtained from Subversion, it
4086 would create a tarball with a name like @file{build-1234.tar.gz}.
4088 The @code{WithProperties} function does @code{printf}-style string
4089 interpolation, using strings obtained by calling
4090 @code{build.getProperty(propname)}. Note that for every @code{%s} (or
4091 @code{%d}, etc), you must have exactly one additional argument to
4092 indicate which build property you want to insert.
4095 You can also use python dictionary-style string interpolation by using
4096 the @code{%(propname)s} syntax. In this form, the property name goes
4097 in the parentheses, and WithProperties takes @emph{no} additional
4098 arguments:
4100 @example
4101 f.addStep(ShellCommand,
4102           command=["tar", "czf",
4103                    WithProperties("build-%(revision)s.tar.gz"),
4104                    "source"])
4105 @end example
4107 Don't forget the extra ``s'' after the closing parenthesis! This is
4108 the cause of many confusing errors. Also note that you can only use
4109 WithProperties in the list form of the command= definition. You cannot
4110 currently use it in the (discouraged) @code{command="stuff"}
4111 single-string form. However, you can use something like
4112 @code{command=["/bin/sh", "-c", "stuff", WithProperties(stuff)]} to
4113 use both shell expansion and WithProperties interpolation.
4115 Note that, like python, you can either do positional-argument
4116 interpolation @emph{or} keyword-argument interpolation, not both. Thus
4117 you cannot use a string like
4118 @code{WithProperties("foo-%(revision)s-%s", "branch")}.
4120 At the moment, the only way to set build properties is by writing a
4121 custom BuildStep.
4123 @heading Common Build Properties
4125 The following build properties are set when the build is started, and
4126 are available to all steps.
4128 @table @code
4129 @item branch
4131 This comes from the build's SourceStamp, and describes which branch is
4132 being checked out. This will be @code{None} (which interpolates into
4133 @code{WithProperties} as an empty string) if the build is on the
4134 default branch, which is generally the trunk. Otherwise it will be a
4135 string like ``branches/beta1.4''. The exact syntax depends upon the VC
4136 system being used.
4138 @item revision
4140 This also comes from the SourceStamp, and is the revision of the
4141 source code tree that was requested from the VC system. When a build
4142 is requested of a specific revision (as is generally the case when the
4143 build is triggered by Changes), this will contain the revision
4144 specification. The syntax depends upon the VC system in use: for SVN
4145 it is an integer, for Mercurial it is a short string, for Darcs it is
4146 a rather large string, etc.
4148 If the ``force build'' button was pressed, the revision will be
4149 @code{None}, which means to use the most recent revision available.
4150 This is a ``trunk build''. This will be interpolated as an empty
4151 string.
4153 @item got_revision
4155 This is set when a Source step checks out the source tree, and
4156 provides the revision that was actually obtained from the VC system.
4157 In general this should be the same as @code{revision}, except for
4158 trunk builds, where @code{got_revision} indicates what revision was
4159 current when the checkout was performed. This can be used to rebuild
4160 the same source code later.
4162 Note that for some VC systems (Darcs in particular), the revision is a
4163 large string containing newlines, and is not suitable for
4164 interpolation into a filename.
4166 @item buildername
4168 This is a string that indicates which Builder the build was a part of.
4169 The combination of buildername and buildnumber uniquely identify a
4170 build.
4172 @item buildnumber
4174 Each build gets a number, scoped to the Builder (so the first build
4175 performed on any given Builder will have a build number of 0). This
4176 integer property contains the build's number.
4178 @item slavename
4180 This is a string which identifies which buildslave the build is
4181 running on.
4183 @end table
4185 @node Python BuildSteps, Transferring Files, Simple ShellCommand Subclasses, Build Steps
4186 @subsection Python BuildSteps
4188 Here are some BuildSteps that are specifcally useful for projects
4189 implemented in Python.
4191 @menu
4192 * BuildEPYDoc::                 
4193 * PyFlakes::                    
4194 @end menu
4196 @node BuildEPYDoc, PyFlakes, Python BuildSteps, Python BuildSteps
4197 @subsubsection BuildEPYDoc
4199 @bsindex buildbot.steps.python.BuildEPYDoc
4201 @url{http://epydoc.sourceforge.net/, epydoc} is a tool for generating
4202 API documentation for Python modules from their docstrings. It reads
4203 all the .py files from your source tree, processes the docstrings
4204 therein, and creates a large tree of .html files (or a single .pdf
4205 file).
4207 The @code{buildbot.steps.python.BuildEPYDoc} step will run
4208 @command{epydoc} to produce this API documentation, and will count the
4209 errors and warnings from its output.
4211 You must supply the command line to be used. The default is
4212 @command{make epydocs}, which assumes that your project has a Makefile
4213 with an ``epydocs'' target. You might wish to use something like
4214 @command{epydoc -o apiref source/PKGNAME} instead. You might also want
4215 to add @command{--pdf} to generate a PDF file instead of a large tree
4216 of HTML files.
4218 The API docs are generated in-place in the build tree (under the
4219 workdir, in the subdirectory controlled by the ``-o'' argument). To
4220 make them useful, you will probably have to copy them to somewhere
4221 they can be read. A command like @command{rsync -ad apiref/
4222 dev.example.com:~public_html/current-apiref/} might be useful. You
4223 might instead want to bundle them into a tarball and publish it in the
4224 same place where the generated install tarball is placed.
4226 @example
4227 from buildbot.steps.python import BuildEPYDoc
4230 f.addStep(BuildEPYDoc, command=["epydoc", "-o", "apiref", "source/mypkg"])
4231 @end example
4234 @node PyFlakes,  , BuildEPYDoc, Python BuildSteps
4235 @subsubsection PyFlakes
4237 @bsindex buildbot.steps.python.PyFlakes
4239 @url{http://divmod.org/trac/wiki/DivmodPyflakes, PyFlakes} is a tool
4240 to perform basic static analysis of Python code to look for simple
4241 errors, like missing imports and references of undefined names. It is
4242 like a fast and simple form of the C ``lint'' program. Other tools
4243 (like pychecker) provide more detailed results but take longer to run.
4245 The @code{buildbot.steps.python.PyFlakes} step will run pyflakes and
4246 count the various kinds of errors and warnings it detects.
4248 You must supply the command line to be used. The default is
4249 @command{make pyflakes}, which assumes you have a top-level Makefile
4250 with a ``pyflakes'' target. You might want to use something like
4251 @command{pyflakes .} or @command{pyflakes src}.
4253 @example
4254 from buildbot.steps.python import PyFlakes
4257 f.addStep(PyFlakes, command=["pyflakes", "src"])
4258 @end example
4261 @node Transferring Files, Writing New BuildSteps, Python BuildSteps, Build Steps
4262 @subsection Transferring Files
4264 @cindex File Transfer
4265 @bsindex buildbot.steps.transfer.FileUpload
4266 @bsindex buildbot.steps.transfer.FileDownload
4268 Most of the work involved in a build will take place on the
4269 buildslave. But occasionally it is useful to do some work on the
4270 buildmaster side. The most basic way to involve the buildmaster is
4271 simply to move a file from the slave to the master, or vice versa.
4272 There are a pair of BuildSteps named @code{FileUpload} and
4273 @code{FileDownload} to provide this functionality. @code{FileUpload}
4274 moves a file @emph{up to} the master, while @code{FileDownload} moves
4275 a file @emph{down from} the master.
4277 As an example, let's assume that there is a step which produces an
4278 HTML file within the source tree that contains some sort of generated
4279 project documentation. We want to move this file to the buildmaster,
4280 into a @file{~/public_html} directory, so it can be visible to
4281 developers. This file will wind up in the slave-side working directory
4282 under the name @file{docs/reference.html}. We want to put it into the
4283 master-side @file{~/public_html/ref.html}.
4285 @example
4286 from buildbot.steps.shell import ShellCommand
4287 from buildbot.steps.transfer import FileUpload
4289 f.addStep(ShellCommand, command=["make", "docs"])
4290 f.addStep(FileUpload,
4291           slavesrc="docs/reference.html",
4292           masterdest="~/public_html/ref.html")
4293 @end example
4295 The @code{masterdest=} argument will be passed to os.path.expanduser,
4296 so things like ``~'' will be expanded properly. Non-absolute paths
4297 will be interpreted relative to the buildmaster's base directory.
4298 Likewise, the @code{slavesrc=} argument will be expanded and
4299 interpreted relative to the builder's working directory.
4302 To move a file from the master to the slave, use the
4303 @code{FileDownload} command. For example, let's assume that some step
4304 requires a configuration file that, for whatever reason, could not be
4305 recorded in the source code repository or generated on the buildslave
4306 side:
4308 @example
4309 from buildbot.steps.shell import ShellCommand
4310 from buildbot.steps.transfer import FileUpload
4312 f.addStep(FileDownload
4313           mastersrc="~/todays_build_config.txt",
4314           slavedest="build_config.txt")
4315 f.addStep(ShellCommand, command=["make", "config"])
4316 @end example
4318 Like @code{FileUpload}, the @code{mastersrc=} argument is interpreted
4319 relative to the buildmaster's base directory, and the
4320 @code{slavedest=} argument is relative to the builder's working
4321 directory. If the buildslave is running in @file{~buildslave}, and the
4322 builder's ``builddir'' is something like @file{tests-i386}, then the
4323 workdir is going to be @file{~buildslave/tests-i386/build}, and a
4324 @code{slavedest=} of @file{foo/bar.html} will get put in
4325 @file{~buildslave/tests-i386/build/foo/bar.html}. Remember that
4326 neither of these commands will create missing directories for you.
4329 @subheading Other Parameters
4331 The @code{maxsize=} argument lets you set a maximum size for the file
4332 to be transferred. This may help to avoid surprises: transferring a
4333 100MB coredump when you were expecting to move a 10kB status file
4334 might take an awfully long time. The @code{blocksize=} argument
4335 controls how the file is sent over the network: larger blocksizes are
4336 slightly more efficient but also consume more memory on each end, and
4337 there is a hard-coded limit of about 640kB.
4339 The @code{mode=} argument allows you to control the access permissions
4340 of the target file, traditionally expressed as an octal integer. The
4341 most common value is probably 0755, which sets the ``x'' executable
4342 bit on the file (useful for shell scripts and the like). The default
4343 value for @code{mode=} is None, which means the permission bits will
4344 default to whatever the umask of the writing process is. The default
4345 umask tends to be fairly restrictive, but at least on the buildslave
4346 you can make it less restrictive with a --umask command-line option at
4347 creation time (@pxref{Buildslave Options}).
4350 @node Writing New BuildSteps,  , Transferring Files, Build Steps
4351 @subsection Writing New BuildSteps
4353 While it is a good idea to keep your build process self-contained in
4354 the source code tree, sometimes it is convenient to put more
4355 intelligence into your Buildbot configuration. One was to do this is
4356 to write a custom BuildStep. Once written, this Step can be used in
4357 the @file{master.cfg} file.
4359 The best reason for writing a custom BuildStep is to better parse the
4360 results of the command being run. For example, a BuildStep that knows
4361 about JUnit could look at the logfiles to determine which tests had
4362 been run, how many passed and how many failed, and then report more
4363 detailed information than a simple @code{rc==0} -based ``good/bad''
4364 decision.
4366 TODO: add more description of BuildSteps.
4368 @menu
4369 * BuildStep LogFiles::          
4370 * Reading Logfiles::            
4371 * Adding LogObservers::         
4372 * BuildStep URLs::              
4373 @end menu
4375 @node BuildStep LogFiles, Reading Logfiles, Writing New BuildSteps, Writing New BuildSteps
4376 @subsubsection BuildStep LogFiles
4378 Each BuildStep has a collection of ``logfiles''. Each one has a short
4379 name, like ``stdio'' or ``warnings''. Each LogFile contains an
4380 arbitrary amount of text, usually the contents of some output file
4381 generated during a build or test step, or a record of everything that
4382 was printed to stdout/stderr during the execution of some command.
4384 These LogFiles are stored to disk, so they can be retrieved later.
4386 Each can contain multiple ``channels'', generally limited to three
4387 basic ones: stdout, stderr, and ``headers''. For example, when a
4388 ShellCommand runs, it writes a few lines to the ``headers'' channel to
4389 indicate the exact argv strings being run, which directory the command
4390 is being executed in, and the contents of the current environment
4391 variables. Then, as the command runs, it adds a lot of ``stdout'' and
4392 ``stderr'' messages. When the command finishes, a final ``header''
4393 line is added with the exit code of the process.
4395 Status display plugins can format these different channels in
4396 different ways. For example, the web page shows LogFiles as text/html,
4397 with header lines in blue text, stdout in black, and stderr in red. A
4398 different URL is available which provides a text/plain format, in
4399 which stdout and stderr are collapsed together, and header lines are
4400 stripped completely. This latter option makes it easy to save the
4401 results to a file and run @command{grep} or whatever against the
4402 output.
4404 Each BuildStep contains a mapping (implemented in a python dictionary)
4405 from LogFile name to the actual LogFile objects. Status plugins can
4406 get a list of LogFiles to display, for example, a list of HREF links
4407 that, when clicked, provide the full contents of the LogFile.
4409 @heading Using LogFiles in custom BuildSteps
4411 The most common way for a custom BuildStep to use a LogFile is to
4412 summarize the results of a ShellCommand (after the command has
4413 finished running). For example, a compile step with thousands of lines
4414 of output might want to create a summary of just the warning messages.
4415 If you were doing this from a shell, you would use something like:
4417 @example
4418 grep "warning:" output.log >warnings.log
4419 @end example
4421 In a custom BuildStep, you could instead create a ``warnings'' LogFile
4422 that contained the same text. To do this, you would add code to your
4423 @code{createSummary} method that pulls lines from the main output log
4424 and creates a new LogFile with the results:
4426 @example
4427     def createSummary(self, log):
4428         warnings = []
4429         for line in log.readlines():
4430             if "warning:" in line:
4431                 warnings.append()
4432         self.addCompleteLog('warnings', "".join(warnings))
4433 @end example
4435 This example uses the @code{addCompleteLog} method, which creates a
4436 new LogFile, puts some text in it, and then ``closes'' it, meaning
4437 that no further contents will be added. This LogFile will appear in
4438 the HTML display under an HREF with the name ``warnings'', since that
4439 is the name of the LogFile.
4441 You can also use @code{addHTMLLog} to create a complete (closed)
4442 LogFile that contains HTML instead of plain text. The normal LogFile
4443 will be HTML-escaped if presented through a web page, but the HTML
4444 LogFile will not. At the moment this is only used to present a pretty
4445 HTML representation of an otherwise ugly exception traceback when
4446 something goes badly wrong during the BuildStep.
4448 In contrast, you might want to create a new LogFile at the beginning
4449 of the step, and add text to it as the command runs. You can create
4450 the LogFile and attach it to the build by calling @code{addLog}, which
4451 returns the LogFile object. You then add text to this LogFile by
4452 calling methods like @code{addStdout} and @code{addHeader}. When you
4453 are done, you must call the @code{finish} method so the LogFile can be
4454 closed. It may be useful to create and populate a LogFile like this
4455 from a LogObserver method @xref{Adding LogObservers}.
4457 The @code{logfiles=} argument to @code{ShellCommand} (see
4458 @pxref{ShellCommand}) creates new LogFiles and fills them in realtime
4459 by asking the buildslave to watch a actual file on disk. The
4460 buildslave will look for additions in the target file and report them
4461 back to the BuildStep. These additions will be added to the LogFile by
4462 calling @code{addStdout}. These secondary LogFiles can be used as the
4463 source of a LogObserver just like the normal ``stdio'' LogFile.
4465 @node Reading Logfiles, Adding LogObservers, BuildStep LogFiles, Writing New BuildSteps
4466 @subsubsection Reading Logfiles
4468 Once a LogFile has been added to a BuildStep with @code{addLog()},
4469 @code{addCompleteLog()}, @code{addHTMLLog()}, or @code{logfiles=},
4470 your BuildStep can retrieve it by using @code{getLog()}:
4472 @example
4473 class MyBuildStep(ShellCommand):
4474     logfiles = @{ "nodelog": "_test/node.log" @}
4476     def evaluateCommand(self, cmd):
4477         nodelog = self.getLog("nodelog")
4478         if "STARTED" in nodelog.getText():
4479             return SUCCESS
4480         else:
4481             return FAILURE
4482 @end example
4484 For a complete list of the methods you can call on a LogFile, please
4485 see the docstrings on the @code{IStatusLog} class in
4486 @file{buildbot/interfaces.py}.
4489 @node Adding LogObservers, BuildStep URLs, Reading Logfiles, Writing New BuildSteps
4490 @subsubsection Adding LogObservers
4492 @cindex LogObserver
4493 @cindex LogLineObserver
4495 Most shell commands emit messages to stdout or stderr as they operate,
4496 especially if you ask them nicely with a @code{--verbose} flag of some
4497 sort. They may also write text to a log file while they run. Your
4498 BuildStep can watch this output as it arrives, to keep track of how
4499 much progress the command has made. You can get a better measure of
4500 progress by counting the number of source files compiled or test cases
4501 run than by merely tracking the number of bytes that have been written
4502 to stdout. This improves the accuracy and the smoothness of the ETA
4503 display.
4505 To accomplish this, you will need to attach a @code{LogObserver} to
4506 one of the log channels, most commonly to the ``stdio'' channel but
4507 perhaps to another one which tracks a log file. This observer is given
4508 all text as it is emitted from the command, and has the opportunity to
4509 parse that output incrementally. Once the observer has decided that
4510 some event has occurred (like a source file being compiled), it can
4511 use the @code{setProgress} method to tell the BuildStep about the
4512 progress that this event represents.
4514 There are a number of pre-built @code{LogObserver} classes that you
4515 can choose from (defined in @code{buildbot.process.buildstep}, and of
4516 course you can subclass them to add further customization. The
4517 @code{LogLineObserver} class handles the grunt work of buffering and
4518 scanning for end-of-line delimiters, allowing your parser to operate
4519 on complete stdout/stderr lines.
4521 For example, let's take a look at the @code{TrialTestCaseCounter},
4522 which is used by the Trial step to count test cases as they are run.
4523 As Trial executes, it emits lines like the following:
4525 @example
4526 buildbot.test.test_config.ConfigTest.testDebugPassword ... [OK]
4527 buildbot.test.test_config.ConfigTest.testEmpty ... [OK]
4528 buildbot.test.test_config.ConfigTest.testIRC ... [FAIL]
4529 buildbot.test.test_config.ConfigTest.testLocks ... [OK]
4530 @end example
4532 When the tests are finished, trial emits a long line of ``======'' and
4533 then some lines which summarize the tests that failed. We want to
4534 avoid parsing these trailing lines, because their format is less
4535 well-defined than the ``[OK]'' lines.
4537 The parser class looks like this:
4539 @example
4540 from buildbot.process.buildstep import LogLineObserver
4542 class TrialTestCaseCounter(LogLineObserver):
4543     _line_re = re.compile(r'^([\w\.]+) \.\.\. \[([^\]]+)\]$')
4544     numTests = 0
4545     finished = False
4547     def outLineReceived(self, line):
4548         if self.finished:
4549             return
4550         if line.startswith("=" * 40):
4551             self.finished = True
4552             return
4554         m = self._line_re.search(line.strip())
4555         if m:
4556             testname, result = m.groups()
4557             self.numTests += 1
4558             self.step.setProgress('tests', self.numTests)
4559 @end example
4561 This parser only pays attention to stdout, since that's where trial
4562 writes the progress lines. It has a mode flag named @code{finished} to
4563 ignore everything after the ``===='' marker, and a scary-looking
4564 regular expression to match each line while hopefully ignoring other
4565 messages that might get displayed as the test runs.
4567 Each time it identifies a test has been completed, it increments its
4568 counter and delivers the new progress value to the step with
4569 @code{self.step.setProgress}. This class is specifically measuring
4570 progress along the ``tests'' metric, in units of test cases (as
4571 opposed to other kinds of progress like the ``output'' metric, which
4572 measures in units of bytes). The Progress-tracking code uses each
4573 progress metric separately to come up with an overall completion
4574 percentage and an ETA value.
4576 To connect this parser into the @code{Trial} BuildStep,
4577 @code{Trial.__init__} ends with the following clause:
4579 @example
4580         # this counter will feed Progress along the 'test cases' metric
4581         counter = TrialTestCaseCounter()
4582         self.addLogObserver('stdio', counter)
4583 @end example
4585 This creates a TrialTestCaseCounter and tells the step that the
4586 counter wants to watch the ``stdio'' log. The observer is
4587 automatically given a reference to the step in its @code{.step}
4588 attribute.
4590 @subheading A Somewhat Whimsical Example
4592 Let's say that we've got some snazzy new unit-test framework called
4593 Framboozle. It's the hottest thing since sliced bread. It slices, it
4594 dices, it runs unit tests like there's no tomorrow. Plus if your unit
4595 tests fail, you can use its name for a Web 2.1 startup company, make
4596 millions of dollars, and hire engineers to fix the bugs for you, while
4597 you spend your afternoons lazily hang-gliding along a scenic pacific
4598 beach, blissfully unconcerned about the state of your
4599 tests.@footnote{framboozle.com is still available. Remember, I get 10%
4600 :).}
4602 To run a Framboozle-enabled test suite, you just run the 'framboozler'
4603 command from the top of your source code tree. The 'framboozler'
4604 command emits a bunch of stuff to stdout, but the most interesting bit
4605 is that it emits the line "FNURRRGH!" every time it finishes running a
4606 test case@footnote{Framboozle gets very excited about running unit
4607 tests.}. You'd like to have a test-case counting LogObserver that
4608 watches for these lines and counts them, because counting them will
4609 help the buildbot more accurately calculate how long the build will
4610 take, and this will let you know exactly how long you can sneak out of
4611 the office for your hang-gliding lessons without anyone noticing that
4612 you're gone.
4614 This will involve writing a new BuildStep (probably named
4615 "Framboozle") which inherits from ShellCommand. The BuildStep class
4616 definition itself will look something like this:
4618 @example
4619 # START
4620 from buildbot.steps.shell import ShellCommand
4621 from buildbot.process.buildstep import LogLineObserver
4623 class FNURRRGHCounter(LogLineObserver):
4624     numTests = 0
4625     def outLineReceived(self, line):
4626         if "FNURRRGH!" in line:
4627             self.numTests += 1
4628             self.step.setProgress('tests', self.numTests)
4630 class Framboozle(ShellCommand):
4631     command = ["framboozler"]
4633     def __init__(self, **kwargs):
4634         ShellCommand.__init__(self, **kwargs)   # always upcall!
4635         counter = FNURRRGHCounter())
4636         self.addLogObserver(counter)
4637 # FINISH
4638 @end example
4640 So that's the code that we want to wind up using. How do we actually
4641 deploy it?
4643 You have a couple of different options.
4645 Option 1: The simplest technique is to simply put this text
4646 (everything from START to FINISH) in your master.cfg file, somewhere
4647 before the BuildFactory definition where you actually use it in a
4648 clause like:
4650 @example
4651 f = BuildFactory()
4652 f.addStep(SVN(svnurl="stuff"))
4653 f.addStep(Framboozle())
4654 @end example
4656 Remember that master.cfg is secretly just a python program with one
4657 job: populating the BuildmasterConfig dictionary. And python programs
4658 are allowed to define as many classes as they like. So you can define
4659 classes and use them in the same file, just as long as the class is
4660 defined before some other code tries to use it.
4662 This is easy, and it keeps the point of definition very close to the
4663 point of use, and whoever replaces you after that unfortunate
4664 hang-gliding accident will appreciate being able to easily figure out
4665 what the heck this stupid "Framboozle" step is doing anyways. The
4666 downside is that every time you reload the config file, the Framboozle
4667 class will get redefined, which means that the buildmaster will think
4668 that you've reconfigured all the Builders that use it, even though
4669 nothing changed. Bleh.
4671 Option 2: Instead, we can put this code in a separate file, and import
4672 it into the master.cfg file just like we would the normal buildsteps
4673 like ShellCommand and SVN.
4675 Create a directory named ~/lib/python, put everything from START to
4676 FINISH in ~/lib/python/framboozle.py, and run your buildmaster using:
4678 @example
4679  PYTHONPATH=~/lib/python buildbot start MASTERDIR
4680 @end example
4682 or use the @file{Makefile.buildbot} to control the way
4683 @command{buildbot start} works. Or add something like this to
4684 something like your ~/.bashrc or ~/.bash_profile or ~/.cshrc:
4686 @example
4687  export PYTHONPATH=~/lib/python
4688 @end example
4690 Once we've done this, our master.cfg can look like:
4692 @example
4693 from framboozle import Framboozle
4694 f = BuildFactory()
4695 f.addStep(SVN(svnurl="stuff"))
4696 f.addStep(Framboozle())
4697 @end example
4701 @example
4702 import framboozle
4703 f = BuildFactory()
4704 f.addStep(SVN(svnurl="stuff"))
4705 f.addStep(framboozle.Framboozle())
4706 @end example
4708 (check out the python docs for details about how "import" and "from A
4709 import B" work).
4711 What we've done here is to tell python that every time it handles an
4712 "import" statement for some named module, it should look in our
4713 ~/lib/python/ for that module before it looks anywhere else. After our
4714 directories, it will try in a bunch of standard directories too
4715 (including the one where buildbot is installed). By setting the
4716 PYTHONPATH environment variable, you can add directories to the front
4717 of this search list.
4719 Python knows that once it "import"s a file, it doesn't need to
4720 re-import it again. This means that reconfiguring the buildmaster
4721 (with "buildbot reconfig", for example) won't make it think the
4722 Framboozle class has changed every time, so the Builders that use it
4723 will not be spuriously restarted. On the other hand, you either have
4724 to start your buildmaster in a slightly weird way, or you have to
4725 modify your environment to set the PYTHONPATH variable.
4728 Option 3: Install this code into a standard python library directory
4730 Find out what your python's standard include path is by asking it:
4732 @example
4733 80:warner@@luther% python
4734 Python 2.4.4c0 (#2, Oct  2 2006, 00:57:46) 
4735 [GCC 4.1.2 20060928 (prerelease) (Debian 4.1.1-15)] on linux2
4736 Type "help", "copyright", "credits" or "license" for more information.
4737 >>> import sys
4738 >>> print sys.path
4739 ['', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/Numeric', '/var/lib/python-support/python2.4', '/usr/lib/site-python']
4740 >>> 
4741 @end example
4743 In this case, putting the code into
4744 /usr/local/lib/python2.4/site-packages/framboozle.py would work just
4745 fine. We can use the same master.cfg "import framboozle" statement as
4746 in Option 2. By putting it in a standard include directory (instead of
4747 the decidedly non-standard ~/lib/python), we don't even have to set
4748 PYTHONPATH to anything special. The downside is that you probably have
4749 to be root to write to one of those standard include directories.
4752 Option 4: Submit the code for inclusion in the Buildbot distribution
4754 Contribute the code in an Enhancement Request on SourceForge, via
4755 http://buildbot.sf.net . Lobby, convince, coerce, bribe, badger,
4756 harass, threaten, or otherwise encourage the author to accept the
4757 patch. This lets you do something like:
4759 @example
4760 from buildbot.steps import framboozle
4761 f = BuildFactory()
4762 f.addStep(SVN(svnurl="stuff"))
4763 f.addStep(framboozle.Framboozle())
4764 @end example
4766 And then you don't even have to install framboozle.py anywhere on your
4767 system, since it will ship with Buildbot. You don't have to be root,
4768 you don't have to set PYTHONPATH. But you do have to make a good case
4769 for Framboozle being worth going into the main distribution, you'll
4770 probably have to provide docs and some unit test cases, you'll need to
4771 figure out what kind of beer the author likes, and then you'll have to
4772 wait until the next release. But in some environments, all this is
4773 easier than getting root on your buildmaster box, so the tradeoffs may
4774 actually be worth it.
4778 Putting the code in master.cfg (1) makes it available to that
4779 buildmaster instance. Putting it in a file in a personal library
4780 directory (2) makes it available for any buildmasters you might be
4781 running. Putting it in a file in a system-wide shared library
4782 directory (3) makes it available for any buildmasters that anyone on
4783 that system might be running. Getting it into the buildbot's upstream
4784 repository (4) makes it available for any buildmasters that anyone in
4785 the world might be running. It's all a matter of how widely you want
4786 to deploy that new class.
4790 @node BuildStep URLs,  , Adding LogObservers, Writing New BuildSteps
4791 @subsubsection BuildStep URLs
4793 @cindex links
4794 @cindex BuildStep URLs
4795 @cindex addURL
4797 Each BuildStep has a collection of ``links''. Like its collection of
4798 LogFiles, each link has a name and a target URL. The web status page
4799 creates HREFs for each link in the same box as it does for LogFiles,
4800 except that the target of the link is the external URL instead of an
4801 internal link to a page that shows the contents of the LogFile.
4803 These external links can be used to point at build information hosted
4804 on other servers. For example, the test process might produce an
4805 intricate description of which tests passed and failed, or some sort
4806 of code coverage data in HTML form, or a PNG or GIF image with a graph
4807 of memory usage over time. The external link can provide an easy way
4808 for users to navigate from the buildbot's status page to these
4809 external web sites or file servers. Note that the step itself is
4810 responsible for insuring that there will be a document available at
4811 the given URL (perhaps by using @command{scp} to copy the HTML output
4812 to a @file{~/public_html/} directory on a remote web server). Calling
4813 @code{addURL} does not magically populate a web server.
4815 To set one of these links, the BuildStep should call the @code{addURL}
4816 method with the name of the link and the target URL. Multiple URLs can
4817 be set.
4819 In this example, we assume that the @command{make test} command causes
4820 a collection of HTML files to be created and put somewhere on the
4821 coverage.example.org web server, in a filename that incorporates the
4822 build number.
4824 @example
4825 class TestWithCodeCoverage(BuildStep):
4826     command = ["make", "test",
4827                WithProperties("buildnum=%s" % "buildnumber")]
4829     def createSummary(self, log):
4830         buildnumber = self.getProperty("buildnumber")
4831         url = "http://coverage.example.org/builds/%s.html" % buildnumber
4832         self.addURL("coverage", url)
4833 @end example
4835 You might also want to extract the URL from some special message
4836 output by the build process itself:
4838 @example
4839 class TestWithCodeCoverage(BuildStep):
4840     command = ["make", "test",
4841                WithProperties("buildnum=%s" % "buildnumber")]
4843     def createSummary(self, log):
4844         output = StringIO(log.getText())
4845         for line in output.readlines():
4846             if line.startswith("coverage-url:"):
4847                 url = line[len("coverage-url:"):].strip()
4848                 self.addURL("coverage", url)
4849                 return
4850 @end example
4852 Note that a build process which emits both stdout and stderr might
4853 cause this line to be split or interleaved between other lines. It
4854 might be necessary to restrict the getText() call to only stdout with
4855 something like this:
4857 @example
4858         output = StringIO("".join([c[1]
4859                                    for c in log.getChunks()
4860                                    if c[0] == LOG_CHANNEL_STDOUT]))
4861 @end example
4863 Of course if the build is run under a PTY, then stdout and stderr will
4864 be merged before the buildbot ever sees them, so such interleaving
4865 will be unavoidable.
4868 @node Interlocks, Build Factories, Build Steps, Build Process
4869 @section Interlocks
4871 @cindex locks
4872 @slindex buildbot.locks.MasterLock
4873 @slindex buildbot.locks.SlaveLock
4875 For various reasons, you may want to prevent certain Steps (or perhaps
4876 entire Builds) from running simultaneously. Limited CPU speed or
4877 network bandwidth to the VC server, problems with simultaneous access
4878 to a database server used by unit tests, or multiple Builds which
4879 access shared state may all require some kind of interlock to prevent
4880 corruption, confusion, or resource overload. These resources might
4881 require completely exclusive access, or it might be sufficient to
4882 establish a limit of two or three simultaneous builds.
4884 @code{Locks} are the mechanism used to express these kinds of
4885 constraints on when Builds or Steps can be run. There are two kinds of
4886 @code{Locks}, each with their own scope: @code{MasterLock} instances
4887 are scoped to the buildbot as a whole, while @code{SlaveLock}s are
4888 scoped to a single buildslave. This means that each buildslave has a
4889 separate copy of each @code{SlaveLock}, which could enforce a
4890 one-Build-at-a-time limit for each machine, but still allow as many
4891 simultaneous builds as there are machines.
4893 Each @code{Lock} is created with a unique name. Each lock gets a count
4894 of how many owners it may have: how many processes can claim it at ths
4895 same time. This limit defaults to one, and is controllable through the
4896 @code{maxCount} argument. On @code{SlaveLock}s you can set the owner
4897 count on a per-slave basis by providing a dictionary (that maps from
4898 slavename to maximum owner count) to its @code{maxCountForSlave}
4899 argument. Any buildslaves that aren't mentioned in
4900 @code{maxCountForSlave} get their owner count from @code{maxCount}.
4902 To use a lock, simply include it in the @code{locks=} argument of the
4903 @code{BuildStep} object that should obtain the lock before it runs.
4904 This argument accepts a list of @code{Lock} objects: the Step will
4905 acquire all of them before it runs.
4907 To claim a lock for the whole Build, add a @code{'locks'} key to the
4908 builder specification dictionary with the same list of @code{Lock}
4909 objects. (This is the dictionary that has the @code{'name'},
4910 @code{'slavename'}, @code{'builddir'}, and @code{'factory'} keys). The
4911 @code{Build} object also accepts a @code{locks=} argument, but unless
4912 you are writing your own @code{BuildFactory} subclass then it will be
4913 easier to set the locks in the builder dictionary.
4915 Note that there are no partial-acquire or partial-release semantics:
4916 this prevents deadlocks caused by two Steps each waiting for a lock
4917 held by the other@footnote{Also note that a clever buildmaster admin
4918 could still create the opportunity for deadlock: Build A obtains Lock
4919 1, inside which Step A.two tries to acquire Lock 2 at the Step level.
4920 Meanwhile Build B obtains Lock 2, and has a Step B.two which wants to
4921 acquire Lock 1 at the Step level. Don't Do That.}. This also means
4922 that waiting to acquire a @code{Lock} can take an arbitrarily long
4923 time: if the buildmaster is very busy, a Step or Build which requires
4924 only one @code{Lock} may starve another that is waiting for that
4925 @code{Lock} plus some others.
4928 In the following example, we run the same build on three different
4929 platforms. The unit-test steps of these builds all use a common
4930 database server, and would interfere with each other if allowed to run
4931 simultaneously. The @code{Lock} prevents more than one of these builds
4932 from happening at the same time.
4934 @example
4935 from buildbot import locks
4936 from buildbot.steps import source, shell
4937 from buildbot.process import factory
4939 db_lock = locks.MasterLock("database")
4940 f = factory.BuildFactory()
4941 f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk"))
4942 f.addStep(shell.ShellCommand(command="make all"))
4943 f.addStep(shell.ShellCommand(command="make test", locks=[db_lock]))
4944 b1 = @{'name': 'full1', 'slavename': 'bot-1', builddir='f1', 'factory': f@}
4945 b2 = @{'name': 'full2', 'slavename': 'bot-2', builddir='f2', 'factory': f@}
4946 b3 = @{'name': 'full3', 'slavename': 'bot-3', builddir='f3', 'factory': f@}
4947 c['builders'] = [b1, b2, b3]
4948 @end example
4950 In the next example, we have one buildslave hosting three separate
4951 Builders (each running tests against a different version of Python).
4952 The machine which hosts this buildslave is not particularly fast, so
4953 we want to prevent all three builds from all happening at the same
4954 time. (Assume we've experimentally determined that one build leaves
4955 unused CPU capacity, three builds causes a lot of disk thrashing, but
4956 two builds at a time is Just Right). We use a @code{SlaveLock} because
4957 the builds happening on this one slow slave should not affect builds
4958 running on other slaves, and we use the lock on the build as a whole
4959 because the slave is so slow that even multiple simultaneous SVN
4960 checkouts would be too taxing. We set @code{maxCount=2} to achieve our
4961 goal of two simultaneous builds per slave.
4963 @example
4964 from buildbot import locks
4965 from buildbot.steps import source
4966 from buildbot.process import s, factory
4968 slow_lock = locks.SlaveLock("cpu", maxCount=2)
4969 source = s(source.SVN, svnurl="http://example.org/svn/Trunk")
4970 f22 = factory.Trial(source, trialpython=["python2.2"])
4971 f23 = factory.Trial(source, trialpython=["python2.3"])
4972 f24 = factory.Trial(source, trialpython=["python2.4"])
4973 b1 = @{'name': 'p22', 'slavename': 'bot-1', builddir='p22', 'factory': f22,
4974       'locks': [slow_lock] @}
4975 b2 = @{'name': 'p23', 'slavename': 'bot-1', builddir='p23', 'factory': f23,
4976       'locks': [slow_lock] @}
4977 b3 = @{'name': 'p24', 'slavename': 'bot-1', builddir='p24', 'factory': f24,
4978       'locks': [slow_lock] @}
4979 c['builders'] = [b1, b2, b3]
4980 @end example
4982 In the last example, we use two Locks at the same time. In this case,
4983 we're concerned about both of the previous constraints, but we'll say
4984 that only the tests are computationally intensive, and that they have
4985 been split into those which use the database and those which do not.
4986 In addition, two of the Builds run on a fast machine which does not
4987 need to worry about the cpu lock, but which still must be prevented
4988 from simultaneous database access. We use @code{maxCountForSlave} to
4989 limit the slow machine to one simultanous build, but allow practically
4990 unlimited concurrent builds on the fast machine.
4992 @example
4993 from buildbot import locks
4994 from buildbot.steps import source, shell
4995 from buildbot.process import factory
4997 db_lock = locks.MasterLock("database")
4998 slavecounts = @{"bot-slow": 1, "bot-fast": 100@}
4999 cpu_lock = locks.SlaveLock("cpu", maxCountForSlave=slavecounts)
5000 f = factory.BuildFactory()
5001 f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk"))
5002 f.addStep(shell.ShellCommand(command="make all", locks=[cpu_lock]))
5003 f.addStep(shell.ShellCommand(command="make test", locks=[cpu_lock]))
5004 f.addStep(shell.ShellCommand(command="make db-test", locks=[db_lock, cpu_lock]))
5006 b1 = @{'name': 'full1', 'slavename': 'bot-slow', builddir='full1',
5007       'factory': f@}
5008 b2 = @{'name': 'full2', 'slavename': 'bot-slow', builddir='full2',
5009       'factory': f@}
5010 b3 = @{'name': 'full3', 'slavename': 'bot-fast', builddir='full3',
5011       'factory': f@}
5012 b4 = @{'name': 'full4', 'slavename': 'bot-fast', builddir='full4',
5013       'factory': f@}
5014 c['builders'] = [b1, b2, b3, b4]
5015 @end example
5017 As a final note, remember that a unit test system which breaks when
5018 multiple people run it at the same time is fragile and should be
5019 fixed. Asking your human developers to serialize themselves when
5020 running unit tests will just discourage them from running the unit
5021 tests at all. Find a way to fix this: change the database tests to
5022 create a new (uniquely-named) user or table for each test run, don't
5023 use fixed listening TCP ports for network tests (instead listen on
5024 port 0 to let the kernel choose a port for you and then query the
5025 socket to find out what port was allocated). @code{MasterLock}s can be
5026 used to accomodate broken test systems like this, but are really
5027 intended for other purposes: build processes that store or retrieve
5028 products in shared directories, or which do things that human
5029 developers would not (or which might slow down or break in ways that
5030 require human attention to deal with).
5032 @code{SlaveLocks}s can be used to keep automated performance tests
5033 from interfering with each other, when there are multiple Builders all
5034 using the same buildslave. But they can't prevent other users from
5035 running CPU-intensive jobs on that host while the tests are running.
5037 @node Build Factories,  , Interlocks, Build Process
5038 @section Build Factories
5041 Each Builder is equipped with a ``build factory'', which is
5042 responsible for producing the actual @code{Build} objects that perform
5043 each build. This factory is created in the configuration file, and
5044 attached to a Builder through the @code{factory} element of its
5045 dictionary.
5047 The standard @code{BuildFactory} object creates @code{Build} objects
5048 by default. These Builds will each execute a collection of BuildSteps
5049 in a fixed sequence. Each step can affect the results of the build,
5050 but in general there is little intelligence to tie the different steps
5051 together. You can create subclasses of @code{Build} to implement more
5052 sophisticated build processes, and then use a subclass of
5053 @code{BuildFactory} (or simply set the @code{buildClass} attribute) to
5054 create instances of your new Build subclass.
5057 @menu
5058 * BuildStep Objects::           
5059 * BuildFactory::                
5060 * Process-Specific build factories::  
5061 @end menu
5063 @node BuildStep Objects, BuildFactory, Build Factories, Build Factories
5064 @subsection BuildStep Objects
5066 The steps used by these builds are all subclasses of @code{BuildStep}.
5067 The standard ones provided with Buildbot are documented later,
5068 @xref{Build Steps}. You can also write your own subclasses to use in
5069 builds.
5071 The basic behavior for a @code{BuildStep} is to:
5073 @itemize @bullet
5074 @item
5075 run for a while, then stop
5076 @item
5077 possibly invoke some RemoteCommands on the attached build slave
5078 @item
5079 possibly produce a set of log files
5080 @item
5081 finish with a status described by one of four values defined in
5082 buildbot.status.builder: SUCCESS, WARNINGS, FAILURE, SKIPPED
5083 @item
5084 provide a list of short strings to describe the step
5085 @item
5086 define a color (generally green, orange, or red) with which the
5087 step should be displayed
5088 @end itemize
5091 More sophisticated steps may produce additional information and
5092 provide it to later build steps, or store it in the factory to provide
5093 to later builds.
5096 @menu
5097 * BuildFactory Attributes::     
5098 * Quick builds::                
5099 @end menu
5101 @node BuildFactory, Process-Specific build factories, BuildStep Objects, Build Factories
5102 @subsection BuildFactory
5104 @bfindex buildbot.process.factory.BuildFactory
5105 @bfindex buildbot.process.factory.BasicBuildFactory
5106 @c TODO: what is BasicSVN anyway?
5107 @bfindex buildbot.process.factory.BasicSVN
5109 The default @code{BuildFactory}, provided in the
5110 @code{buildbot.process.factory} module, contains an internal list of
5111 ``BuildStep specifications'': a list of @code{(step_class, kwargs)}
5112 tuples for each. These specification tuples are constructed when the
5113 config file is read, by asking the instances passed to @code{addStep}
5114 for their subclass and arguments.
5116 When asked to create a Build, the @code{BuildFactory} puts a copy of
5117 the list of step specifications into the new Build object. When the
5118 Build is actually started, these step specifications are used to
5119 create the actual set of BuildSteps, which are then executed one at a
5120 time. This serves to give each Build an independent copy of each step.
5121 For example, a build which consists of a CVS checkout followed by a
5122 @code{make build} would be constructed as follows:
5124 @example
5125 from buildbot.steps import source, shell
5126 from buildbot.process import factory
5128 f = factory.BuildFactory()
5129 f.addStep(source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"))
5130 f.addStep(shell.Compile(command=["make", "build"]))
5131 @end example
5133 (To support config files from buildbot-0.7.5 and earlier,
5134 @code{addStep} also accepts the @code{f.addStep(shell.Compile,
5135 command=["make","build"])} form, although its use is discouraged
5136 because then the @code{Compile} step doesn't get to validate or
5137 complain about its arguments until build time. The modern
5138 pass-by-instance approach allows this validation to occur while the
5139 config file is being loaded, where the admin has a better chance of
5140 noticing problems).
5142 It is also possible to pass a list of steps into the
5143 @code{BuildFactory} when it is created. Using @code{addStep} is
5144 usually simpler, but there are cases where is is more convenient to
5145 create the list of steps ahead of time.:
5147 @example
5148 from buildbot.steps import source, shell
5149 from buildbot.process import factory
5151 all_steps = [source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"),
5152              shell.Compile(command=["make", "build"]),
5153             ]
5154 f = factory.BuildFactory(all_steps)
5155 @end example
5158 Each step can affect the build process in the following ways:
5160 @itemize @bullet
5161 @item
5162 If the step's @code{haltOnFailure} attribute is True, then a failure
5163 in the step (i.e. if it completes with a result of FAILURE) will cause
5164 the whole build to be terminated immediately: no further steps will be
5165 executed. This is useful for setup steps upon which the rest of the
5166 build depends: if the CVS checkout or @code{./configure} process
5167 fails, there is no point in trying to compile or test the resulting
5168 tree.
5170 @item
5171 If the @code{flunkOnFailure} or @code{flunkOnWarnings} flag is set,
5172 then a result of FAILURE or WARNINGS will mark the build as a whole as
5173 FAILED. However, the remaining steps will still be executed. This is
5174 appropriate for things like multiple testing steps: a failure in any
5175 one of them will indicate that the build has failed, however it is
5176 still useful to run them all to completion.
5178 @item
5179 Similarly, if the @code{warnOnFailure} or @code{warnOnWarnings} flag
5180 is set, then a result of FAILURE or WARNINGS will mark the build as
5181 having WARNINGS, and the remaining steps will still be executed. This
5182 may be appropriate for certain kinds of optional build or test steps.
5183 For example, a failure experienced while building documentation files
5184 should be made visible with a WARNINGS result but not be serious
5185 enough to warrant marking the whole build with a FAILURE.
5187 @end itemize
5189 In addition, each Step produces its own results, may create logfiles,
5190 etc. However only the flags described above have any effect on the
5191 build as a whole.
5193 The pre-defined BuildSteps like @code{CVS} and @code{Compile} have
5194 reasonably appropriate flags set on them already. For example, without
5195 a source tree there is no point in continuing the build, so the
5196 @code{CVS} class has the @code{haltOnFailure} flag set to True. Look
5197 in @file{buildbot/steps/*.py} to see how the other Steps are
5198 marked.
5200 Each Step is created with an additional @code{workdir} argument that
5201 indicates where its actions should take place. This is specified as a
5202 subdirectory of the slave builder's base directory, with a default
5203 value of @code{build}. This is only implemented as a step argument (as
5204 opposed to simply being a part of the base directory) because the
5205 CVS/SVN steps need to perform their checkouts from the parent
5206 directory.
5208 @menu
5209 * BuildFactory Attributes::     
5210 * Quick builds::                
5211 @end menu
5213 @node BuildFactory Attributes, Quick builds, BuildFactory, BuildFactory
5214 @subsubsection BuildFactory Attributes
5216 Some attributes from the BuildFactory are copied into each Build.
5218 @cindex treeStableTimer
5220 @table @code
5221 @item useProgress
5222 (defaults to True): if True, the buildmaster keeps track of how long
5223 each step takes, so it can provide estimates of how long future builds
5224 will take. If builds are not expected to take a consistent amount of
5225 time (such as incremental builds in which a random set of files are
5226 recompiled or tested each time), this should be set to False to
5227 inhibit progress-tracking.
5229 @end table
5232 @node Quick builds,  , BuildFactory Attributes, BuildFactory
5233 @subsubsection Quick builds
5235 @bfindex buildbot.process.factory.QuickBuildFactory
5237 The difference between a ``full build'' and a ``quick build'' is that
5238 quick builds are generally done incrementally, starting with the tree
5239 where the previous build was performed. That simply means that the
5240 source-checkout step should be given a @code{mode='update'} flag, to
5241 do the source update in-place.
5243 In addition to that, the @code{useProgress} flag should be set to
5244 False. Incremental builds will (or at least the ought to) compile as
5245 few files as necessary, so they will take an unpredictable amount of
5246 time to run. Therefore it would be misleading to claim to predict how
5247 long the build will take.
5250 @node Process-Specific build factories,  , BuildFactory, Build Factories
5251 @subsection Process-Specific build factories
5253 Many projects use one of a few popular build frameworks to simplify
5254 the creation and maintenance of Makefiles or other compilation
5255 structures. Buildbot provides several pre-configured BuildFactory
5256 subclasses which let you build these projects with a minimum of fuss.
5258 @menu
5259 * GNUAutoconf::                 
5260 * CPAN::                        
5261 * Python distutils::            
5262 * Python/Twisted/trial projects::  
5263 @end menu
5265 @node GNUAutoconf, CPAN, Process-Specific build factories, Process-Specific build factories
5266 @subsubsection GNUAutoconf
5268 @bfindex buildbot.process.factory.GNUAutoconf
5270 @uref{http://www.gnu.org/software/autoconf/, GNU Autoconf} is a
5271 software portability tool, intended to make it possible to write
5272 programs in C (and other languages) which will run on a variety of
5273 UNIX-like systems. Most GNU software is built using autoconf. It is
5274 frequently used in combination with GNU automake. These tools both
5275 encourage a build process which usually looks like this:
5277 @example
5278 % CONFIG_ENV=foo ./configure --with-flags
5279 % make all
5280 % make check
5281 # make install
5282 @end example
5284 (except of course the Buildbot always skips the @code{make install}
5285 part).
5287 The Buildbot's @code{buildbot.process.factory.GNUAutoconf} factory is
5288 designed to build projects which use GNU autoconf and/or automake. The
5289 configuration environment variables, the configure flags, and command
5290 lines used for the compile and test are all configurable, in general
5291 the default values will be suitable.
5293 Example:
5295 @example
5296 # use the s() convenience function defined earlier
5297 f = factory.GNUAutoconf(source=s(step.SVN, svnurl=URL, mode="copy"),
5298                         flags=["--disable-nls"])
5299 @end example
5301 Required Arguments:
5303 @table @code
5304 @item source
5305 This argument must be a step specification tuple that provides a
5306 BuildStep to generate the source tree.
5307 @end table
5309 Optional Arguments:
5311 @table @code
5312 @item configure
5313 The command used to configure the tree. Defaults to
5314 @code{./configure}. Accepts either a string or a list of shell argv
5315 elements.
5317 @item configureEnv
5318 The environment used for the initial configuration step. This accepts
5319 a dictionary which will be merged into the buildslave's normal
5320 environment. This is commonly used to provide things like
5321 @code{CFLAGS="-O2 -g"} (to turn off debug symbols during the compile).
5322 Defaults to an empty dictionary.
5324 @item configureFlags
5325 A list of flags to be appended to the argument list of the configure
5326 command. This is commonly used to enable or disable specific features
5327 of the autoconf-controlled package, like @code{["--without-x"]} to
5328 disable windowing support. Defaults to an empty list.
5330 @item compile
5331 this is a shell command or list of argv values which is used to
5332 actually compile the tree. It defaults to @code{make all}. If set to
5333 None, the compile step is skipped.
5335 @item test
5336 this is a shell command or list of argv values which is used to run
5337 the tree's self-tests. It defaults to @code{make check}. If set to
5338 None, the test step is skipped.
5340 @end table
5343 @node CPAN, Python distutils, GNUAutoconf, Process-Specific build factories
5344 @subsubsection CPAN
5346 @bfindex buildbot.process.factory.CPAN
5348 Most Perl modules available from the @uref{http://www.cpan.org/, CPAN}
5349 archive use the @code{MakeMaker} module to provide configuration,
5350 build, and test services. The standard build routine for these modules
5351 looks like:
5353 @example
5354 % perl Makefile.PL
5355 % make
5356 % make test
5357 # make install
5358 @end example
5360 (except again Buildbot skips the install step)
5362 Buildbot provides a @code{CPAN} factory to compile and test these
5363 projects.
5366 Arguments:
5367 @table @code
5368 @item source
5369 (required): A step specification tuple, that that used by GNUAutoconf.
5371 @item perl
5372 A string which specifies the @code{perl} executable to use. Defaults
5373 to just @code{perl}.
5375 @end table
5378 @node Python distutils, Python/Twisted/trial projects, CPAN, Process-Specific build factories
5379 @subsubsection Python distutils
5381 @bfindex buildbot.process.factory.Distutils
5383 Most Python modules use the @code{distutils} package to provide
5384 configuration and build services. The standard build process looks
5385 like:
5387 @example
5388 % python ./setup.py build
5389 % python ./setup.py install
5390 @end example
5392 Unfortunately, although Python provides a standard unit-test framework
5393 named @code{unittest}, to the best of my knowledge @code{distutils}
5394 does not provide a standardized target to run such unit tests. (please
5395 let me know if I'm wrong, and I will update this factory).
5397 The @code{Distutils} factory provides support for running the build
5398 part of this process. It accepts the same @code{source=} parameter as
5399 the other build factories.
5402 Arguments:
5403 @table @code
5404 @item source
5405 (required): A step specification tuple, that that used by GNUAutoconf.
5406   
5407 @item python
5408 A string which specifies the @code{python} executable to use. Defaults
5409 to just @code{python}.
5411 @item test
5412 Provides a shell command which runs unit tests. This accepts either a
5413 string or a list. The default value is None, which disables the test
5414 step (since there is no common default command to run unit tests in
5415 distutils modules).
5417 @end table
5420 @node Python/Twisted/trial projects,  , Python distutils, Process-Specific build factories
5421 @subsubsection Python/Twisted/trial projects
5423 @bfindex buildbot.process.factory.Trial
5424 @c TODO: document these steps better
5425 @bsindex buildbot.steps.python_twisted.HLint
5426 @bsindex buildbot.steps.python_twisted.Trial
5427 @bsindex buildbot.steps.python_twisted.ProcessDocs
5428 @bsindex buildbot.steps.python_twisted.BuildDebs
5429 @bsindex buildbot.steps.python_twisted.RemovePYCs
5431 Twisted provides a unit test tool named @code{trial} which provides a
5432 few improvements over Python's built-in @code{unittest} module. Many
5433 python projects which use Twisted for their networking or application
5434 services also use trial for their unit tests. These modules are
5435 usually built and tested with something like the following:
5437 @example
5438 % python ./setup.py build
5439 % PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test
5440 % python ./setup.py install
5441 @end example
5443 Unfortunately, the @file{build/lib} directory into which the
5444 built/copied .py files are placed is actually architecture-dependent,
5445 and I do not yet know of a simple way to calculate its value. For many
5446 projects it is sufficient to import their libraries ``in place'' from
5447 the tree's base directory (@code{PYTHONPATH=.}).
5449 In addition, the @var{PROJECTNAME} value where the test files are
5450 located is project-dependent: it is usually just the project's
5451 top-level library directory, as common practice suggests the unit test
5452 files are put in the @code{test} sub-module. This value cannot be
5453 guessed, the @code{Trial} class must be told where to find the test
5454 files.
5456 The @code{Trial} class provides support for building and testing
5457 projects which use distutils and trial. If the test module name is
5458 specified, trial will be invoked. The library path used for testing
5459 can also be set.
5461 One advantage of trial is that the Buildbot happens to know how to
5462 parse trial output, letting it identify which tests passed and which
5463 ones failed. The Buildbot can then provide fine-grained reports about
5464 how many tests have failed, when individual tests fail when they had
5465 been passing previously, etc.
5467 Another feature of trial is that you can give it a series of source
5468 .py files, and it will search them for special @code{test-case-name}
5469 tags that indicate which test cases provide coverage for that file.
5470 Trial can then run just the appropriate tests. This is useful for
5471 quick builds, where you want to only run the test cases that cover the
5472 changed functionality.
5474 Arguments:
5475 @table @code
5476 @item source
5477 (required): A step specification tuple, like that used by GNUAutoconf.
5479 @item buildpython
5480 A list (argv array) of strings which specifies the @code{python}
5481 executable to use when building the package. Defaults to just
5482 @code{['python']}. It may be useful to add flags here, to supress
5483 warnings during compilation of extension modules. This list is
5484 extended with @code{['./setup.py', 'build']} and then executed in a
5485 ShellCommand.
5487 @item testpath
5488 Provides a directory to add to @code{PYTHONPATH} when running the unit
5489 tests, if tests are being run. Defaults to @code{.} to include the
5490 project files in-place. The generated build library is frequently
5491 architecture-dependent, but may simply be @file{build/lib} for
5492 pure-python modules.
5494 @item trialpython
5495 Another list of strings used to build the command that actually runs
5496 trial. This is prepended to the contents of the @code{trial} argument
5497 below. It may be useful to add @code{-W} flags here to supress
5498 warnings that occur while tests are being run. Defaults to an empty
5499 list, meaning @code{trial} will be run without an explicit
5500 interpreter, which is generally what you want if you're using
5501 @file{/usr/bin/trial} instead of, say, the @file{./bin/trial} that
5502 lives in the Twisted source tree.
5504 @item trial
5505 provides the name of the @code{trial} command. It is occasionally
5506 useful to use an alternate executable, such as @code{trial2.2} which
5507 might run the tests under an older version of Python. Defaults to
5508 @code{trial}.
5510 @item tests
5511 Provides a module name or names which contain the unit tests for this
5512 project. Accepts a string, typically @code{PROJECTNAME.test}, or a
5513 list of strings. Defaults to None, indicating that no tests should be
5514 run. You must either set this or @code{useTestCaseNames} to do anyting
5515 useful with the Trial factory.
5517 @item useTestCaseNames
5518 Tells the Step to provide the names of all changed .py files to trial,
5519 so it can look for test-case-name tags and run just the matching test
5520 cases. Suitable for use in quick builds. Defaults to False.
5522 @item randomly
5523 If @code{True}, tells Trial (with the @code{--random=0} argument) to
5524 run the test cases in random order, which sometimes catches subtle
5525 inter-test dependency bugs. Defaults to @code{False}.
5527 @item recurse
5528 If @code{True}, tells Trial (with the @code{--recurse} argument) to
5529 look in all subdirectories for additional test cases. It isn't clear
5530 to me how this works, but it may be useful to deal with the
5531 unknown-PROJECTNAME problem described above, and is currently used in
5532 the Twisted buildbot to accomodate the fact that test cases are now
5533 distributed through multiple twisted.SUBPROJECT.test directories.
5535 @end table  
5537 Unless one of @code{trialModule} or @code{useTestCaseNames}
5538 are set, no tests will be run.
5540 Some quick examples follow. Most of these examples assume that the
5541 target python code (the ``code under test'') can be reached directly
5542 from the root of the target tree, rather than being in a @file{lib/}
5543 subdirectory.
5545 @example
5546 #  Trial(source, tests="toplevel.test") does:
5547 #   python ./setup.py build
5548 #   PYTHONPATH=. trial -to toplevel.test
5550 #  Trial(source, tests=["toplevel.test", "other.test"]) does:
5551 #   python ./setup.py build
5552 #   PYTHONPATH=. trial -to toplevel.test other.test
5554 #  Trial(source, useTestCaseNames=True) does:
5555 #   python ./setup.py build
5556 #   PYTHONPATH=. trial -to --testmodule=foo/bar.py..  (from Changes)
5558 #  Trial(source, buildpython=["python2.3", "-Wall"], tests="foo.tests"):
5559 #   python2.3 -Wall ./setup.py build
5560 #   PYTHONPATH=. trial -to foo.tests
5562 #  Trial(source, trialpython="python2.3", trial="/usr/bin/trial",
5563 #        tests="foo.tests") does:
5564 #   python2.3 -Wall ./setup.py build
5565 #   PYTHONPATH=. python2.3 /usr/bin/trial -to foo.tests
5567 # For running trial out of the tree being tested (only useful when the
5568 # tree being built is Twisted itself):
5569 #  Trial(source, trialpython=["python2.3", "-Wall"], trial="./bin/trial",
5570 #        tests="foo.tests") does:
5571 #   python2.3 -Wall ./setup.py build
5572 #   PYTHONPATH=. python2.3 -Wall ./bin/trial -to foo.tests
5573 @end example
5575 If the output directory of @code{./setup.py build} is known, you can
5576 pull the python code from the built location instead of the source
5577 directories. This should be able to handle variations in where the
5578 source comes from, as well as accomodating binary extension modules:
5580 @example
5581 # Trial(source,tests="toplevel.test",testpath='build/lib.linux-i686-2.3')
5582 # does:
5583 #  python ./setup.py build
5584 #  PYTHONPATH=build/lib.linux-i686-2.3 trial -to toplevel.test
5585 @end example
5588 @node Status Delivery, Command-line tool, Build Process, Top
5589 @chapter Status Delivery
5591 More details are available in the docstrings for each class, use
5592 @code{pydoc buildbot.status.html.Waterfall} to see them. Most status
5593 delivery objects take a @code{categories=} argument, which can contain
5594 a list of ``category'' names: in this case, it will only show status
5595 for Builders that are in one of the named categories.
5597 (implementor's note: each of these objects should be a
5598 service.MultiService which will be attached to the BuildMaster object
5599 when the configuration is processed. They should use
5600 @code{self.parent.getStatus()} to get access to the top-level IStatus
5601 object, either inside @code{startService} or later. They may call
5602 @code{status.subscribe()} in @code{startService} to receive
5603 notifications of builder events, in which case they must define
5604 @code{builderAdded} and related methods. See the docstrings in
5605 @file{buildbot/interfaces.py} for full details.)
5607 @menu
5608 * HTML Waterfall::              
5609 * IRC Bot::                     
5610 * PBListener::                  
5611 * Writing New Status Plugins::  
5612 @end menu
5614 @c @node Email Delivery,  , Status Delivery, Status Delivery
5615 @c @subsection Email Delivery
5617 @c DOCUMENT THIS
5619 @node HTML Waterfall, IRC Bot, Status Delivery, Status Delivery
5620 @section HTML Waterfall
5622 @cindex Waterfall
5623 @stindex buildbot.status.html.Waterfall
5626 @example
5627 from buildbot.status import html
5628 w = html.Waterfall(http_port=8080)
5629 c['status'].append(w)
5630 @end example
5632 The @code{buildbot.status.html.Waterfall} status target creates an
5633 HTML ``waterfall display'', which shows a time-based chart of events.
5634 This display provides detailed information about all steps of all
5635 recent builds, and provides hyperlinks to look at individual build
5636 logs and source changes. If the @code{http_port} argument is provided,
5637 it provides a strports specification for the port that the web server
5638 should listen on. This can be a simple port number, or a string like
5639 @code{tcp:8080:interface=127.0.0.1} (to limit connections to the
5640 loopback interface, and therefore to clients running on the same
5641 host)@footnote{It may even be possible to provide SSL access by using
5642 a specification like
5643 @code{"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"}, but this is
5644 completely untested}.
5646 If instead (or in addition) you provide the @code{distrib_port}
5647 argument, a twisted.web distributed server will be started either on a
5648 TCP port (if @code{distrib_port} is like @code{"tcp:12345"}) or more
5649 likely on a UNIX socket (if @code{distrib_port} is like
5650 @code{"unix:/path/to/socket"}).
5652 The @code{distrib_port} option means that, on a host with a
5653 suitably-configured twisted-web server, you do not need to consume a
5654 separate TCP port for the buildmaster's status web page. When the web
5655 server is constructed with @code{mktap web --user}, URLs that point to
5656 @code{http://host/~username/} are dispatched to a sub-server that is
5657 listening on a UNIX socket at @code{~username/.twisted-web-pb}. On
5658 such a system, it is convenient to create a dedicated @code{buildbot}
5659 user, then set @code{distrib_port} to
5660 @code{"unix:"+os.path.expanduser("~/.twistd-web-pb")}. This
5661 configuration will make the HTML status page available at
5662 @code{http://host/~buildbot/} . Suitable URL remapping can make it
5663 appear at @code{http://host/buildbot/}, and the right virtual host
5664 setup can even place it at @code{http://buildbot.host/} .
5666 Other arguments:
5668 @table @code
5669 @item allowForce
5670 If set to True (the default), then the web page will provide a ``Force
5671 Build'' button that allows visitors to manually trigger builds. This
5672 is useful for developers to re-run builds that have failed because of
5673 intermittent problems in the test suite, or because of libraries that
5674 were not installed at the time of the previous build. You may not wish
5675 to allow strangers to cause a build to run: in that case, set this to
5676 False to remove these buttons.
5678 @item favicon
5679 If set to a string, this will be interpreted as a filename containing
5680 a ``favicon'': a small image that contains an icon for the web site.
5681 This is returned to browsers that request the @code{favicon.ico} file,
5682 and should point to a .png or .ico image file. The default value uses
5683 the buildbot/buildbot.png image (a small hex nut) contained in the
5684 buildbot distribution. You can set this to None to avoid using a
5685 favicon at all.
5687 @item robots_txt
5688 If set to a string, this will be interpreted as a filename containing
5689 the contents of ``robots.txt''. Many search engine spiders request
5690 this file before indexing the site. Setting it to a file which
5691 contains:
5692 @example
5693 User-agent: *
5694 Disallow: /
5695 @end example
5696 will prevent most search engines from trawling the (voluminous)
5697 generated status pages.
5699 @end table
5702 @node IRC Bot, PBListener, HTML Waterfall, Status Delivery
5703 @section IRC Bot
5705 @cindex IRC
5706 @stindex buildbot.status.words.IRC
5709 The @code{buildbot.status.words.IRC} status target creates an IRC bot
5710 which will attach to certain channels and be available for status
5711 queries. It can also be asked to announce builds as they occur, or be
5712 told to shut up.
5714 @example
5715 from twisted.status import words
5716 irc = words.IRC("irc.example.org", "botnickname", 
5717                 channels=["channel1", "channel2"],
5718                 password="mysecretpassword")
5719 c['status'].append(irc)
5720 @end example
5722 Take a look at the docstring for @code{words.IRC} for more details on
5723 configuring this service. The @code{password} argument, if provided,
5724 will be sent to Nickserv to claim the nickname: some IRC servers will
5725 not allow clients to send private messages until they have logged in
5726 with a password.
5728 To use the service, you address messages at the buildbot, either
5729 normally (@code{botnickname: status}) or with private messages
5730 (@code{/msg botnickname status}). The buildbot will respond in kind.
5732 Some of the commands currently available:
5734 @table @code
5736 @item list builders
5737 Emit a list of all configured builders
5738 @item status BUILDER
5739 Announce the status of a specific Builder: what it is doing right now.
5740 @item status all
5741 Announce the status of all Builders
5742 @item watch BUILDER
5743 If the given Builder is currently running, wait until the Build is
5744 finished and then announce the results.
5745 @item last BUILDER
5746 Return the results of the last build to run on the given Builder.
5748 @item help COMMAND
5749 Describe a command. Use @code{help commands} to get a list of known
5750 commands.
5751 @item source
5752 Announce the URL of the Buildbot's home page.
5753 @item version
5754 Announce the version of this Buildbot.
5755 @end table
5757 If the @code{allowForce=True} option was used, some addtional commands
5758 will be available:
5760 @table @code
5761 @item force build BUILDER REASON
5762 Tell the given Builder to start a build of the latest code. The user
5763 requesting the build and REASON are recorded in the Build status. The
5764 buildbot will announce the build's status when it finishes.
5766 @item stop build BUILDER REASON
5767 Terminate any running build in the given Builder. REASON will be added
5768 to the build status to explain why it was stopped. You might use this
5769 if you committed a bug, corrected it right away, and don't want to
5770 wait for the first build (which is destined to fail) to complete
5771 before starting the second (hopefully fixed) build.
5772 @end table
5774 @node PBListener, Writing New Status Plugins, IRC Bot, Status Delivery
5775 @section PBListener
5777 @cindex PBListener
5778 @stindex buildbot.status.client.PBListener
5781 @example
5782 import buildbot.status.client
5783 pbl = buildbot.status.client.PBListener(port=int, user=str,
5784                                         passwd=str)
5785 c['status'].append(pbl)
5786 @end example
5788 This sets up a PB listener on the given TCP port, to which a PB-based
5789 status client can connect and retrieve status information.
5790 @code{buildbot statusgui} (@pxref{statusgui}) is an example of such a
5791 status client. The @code{port} argument can also be a strports
5792 specification string.
5794 @node Writing New Status Plugins,  , PBListener, Status Delivery
5795 @section Writing New Status Plugins
5797 TODO: this needs a lot more examples
5799 Each status plugin is an object which provides the
5800 @code{twisted.application.service.IService} interface, which creates a
5801 tree of Services with the buildmaster at the top [not strictly true].
5802 The status plugins are all children of an object which implements
5803 @code{buildbot.interfaces.IStatus}, the main status object. From this
5804 object, the plugin can retrieve anything it wants about current and
5805 past builds. It can also subscribe to hear about new and upcoming
5806 builds.
5808 Status plugins which only react to human queries (like the Waterfall
5809 display) never need to subscribe to anything: they are idle until
5810 someone asks a question, then wake up and extract the information they
5811 need to answer it, then they go back to sleep. Plugins which need to
5812 act spontaneously when builds complete (like the Mail plugin) need to
5813 subscribe to hear about new builds.
5815 If the status plugin needs to run network services (like the HTTP
5816 server used by the Waterfall plugin), they can be attached as Service
5817 children of the plugin itself, using the @code{IServiceCollection}
5818 interface.
5822 @node Command-line tool, Resources, Status Delivery, Top
5823 @chapter Command-line tool
5825 The @command{buildbot} command-line tool can be used to start or stop a
5826 buildmaster or buildbot, and to interact with a running buildmaster.
5827 Some of its subcommands are intended for buildmaster admins, while
5828 some are for developers who are editing the code that the buildbot is
5829 monitoring.
5831 @menu
5832 * Administrator Tools::         
5833 * Developer Tools::             
5834 * Other Tools::                 
5835 * .buildbot config directory::  
5836 @end menu
5838 @node Administrator Tools, Developer Tools, Command-line tool, Command-line tool
5839 @section Administrator Tools
5841 The following @command{buildbot} sub-commands are intended for
5842 buildmaster administrators:
5844 @heading create-master
5846 This creates a new directory and populates it with files that allow it
5847 to be used as a buildmaster's base directory.
5849 @example
5850 buildbot create-master BASEDIR
5851 @end example
5853 @heading create-slave
5855 This creates a new directory and populates it with files that let it
5856 be used as a buildslave's base directory. You must provide several
5857 arguments, which are used to create the initial @file{buildbot.tac}
5858 file.
5860 @example
5861 buildbot create-slave @var{BASEDIR} @var{MASTERHOST}:@var{PORT} @var{SLAVENAME} @var{PASSWORD}
5862 @end example
5864 @heading start
5866 This starts a buildmaster or buildslave which was already created in
5867 the given base directory. The daemon is launched in the background,
5868 with events logged to a file named @file{twistd.log}.
5870 @example
5871 buildbot start BASEDIR
5872 @end example
5874 @heading stop
5876 This terminates the daemon (either buildmaster or buildslave) running
5877 in the given directory.
5879 @example
5880 buildbot stop BASEDIR
5881 @end example
5883 @heading sighup
5885 This sends a SIGHUP to the buildmaster running in the given directory,
5886 which causes it to re-read its @file{master.cfg} file.
5888 @example
5889 buildbot sighup BASEDIR
5890 @end example
5892 @node Developer Tools, Other Tools, Administrator Tools, Command-line tool
5893 @section Developer Tools
5895 These tools are provided for use by the developers who are working on
5896 the code that the buildbot is monitoring.
5898 @menu
5899 * statuslog::                   
5900 * statusgui::                   
5901 * try::                         
5902 @end menu
5904 @node statuslog, statusgui, Developer Tools, Developer Tools
5905 @subsection statuslog
5907 @example
5908 buildbot statuslog --master @var{MASTERHOST}:@var{PORT}
5909 @end example
5911 This command starts a simple text-based status client, one which just
5912 prints out a new line each time an event occurs on the buildmaster.
5914 The @option{--master} option provides the location of the
5915 @code{buildbot.status.client.PBListener} status port, used to deliver
5916 build information to realtime status clients. The option is always in
5917 the form of a string, with hostname and port number separated by a
5918 colon (@code{HOSTNAME:PORTNUM}). Note that this port is @emph{not} the
5919 same as the slaveport (although a future version may allow the same
5920 port number to be used for both purposes). If you get an error message
5921 to the effect of ``Failure: twisted.cred.error.UnauthorizedLogin:'',
5922 this may indicate that you are connecting to the slaveport rather than
5923 a @code{PBListener} port.
5925 The @option{--master} option can also be provided by the
5926 @code{masterstatus} name in @file{.buildbot/options} (@pxref{.buildbot
5927 config directory}).
5929 @node statusgui, try, statuslog, Developer Tools
5930 @subsection statusgui
5932 @cindex statusgui
5934 If you have set up a PBListener (@pxref{PBListener}), you will be able
5935 to monitor your Buildbot using a simple Gtk+ application invoked with
5936 the @code{buildbot statusgui} command:
5938 @example
5939 buildbot statusgui --master @var{MASTERHOST}:@var{PORT}
5940 @end example
5942 This command starts a simple Gtk+-based status client, which contains
5943 a few boxes for each Builder that change color as events occur. It
5944 uses the same @option{--master} argument as the @command{buildbot
5945 statuslog} command (@pxref{statuslog}).
5947 @node try,  , statusgui, Developer Tools
5948 @subsection try
5950 This lets a developer to ask the question ``What would happen if I
5951 committed this patch right now?''. It runs the unit test suite (across
5952 multiple build platforms) on the developer's current code, allowing
5953 them to make sure they will not break the tree when they finally
5954 commit their changes.
5956 The @command{buildbot try} command is meant to be run from within a
5957 developer's local tree, and starts by figuring out the base revision
5958 of that tree (what revision was current the last time the tree was
5959 updated), and a patch that can be applied to that revision of the tree
5960 to make it match the developer's copy. This (revision, patch) pair is
5961 then sent to the buildmaster, which runs a build with that
5962 SourceStamp. If you want, the tool will emit status messages as the
5963 builds run, and will not terminate until the first failure has been
5964 detected (or the last success).
5966 There is an alternate form which accepts a pre-made patch file
5967 (typically the output of a command like 'svn diff'). This ``--diff''
5968 form does not require a local tree to run from. See @xref{try --diff}.
5970 For this command to work, several pieces must be in place:
5973 @heading TryScheduler
5975 @slindex buildbot.scheduler.Try_Jobdir
5976 @slindex buildbot.scheduler.Try_Userpass
5978 The buildmaster must have a @code{scheduler.Try} instance in
5979 the config file's @code{c['schedulers']} list. This lets the
5980 administrator control who may initiate these ``trial'' builds, which
5981 branches are eligible for trial builds, and which Builders should be
5982 used for them.
5984 The @code{TryScheduler} has various means to accept build requests:
5985 all of them enforce more security than the usual buildmaster ports do.
5986 Any source code being built can be used to compromise the buildslave
5987 accounts, but in general that code must be checked out from the VC
5988 repository first, so only people with commit privileges can get
5989 control of the buildslaves. The usual force-build control channels can
5990 waste buildslave time but do not allow arbitrary commands to be
5991 executed by people who don't have those commit privileges. However,
5992 the source code patch that is provided with the trial build does not
5993 have to go through the VC system first, so it is important to make
5994 sure these builds cannot be abused by a non-committer to acquire as
5995 much control over the buildslaves as a committer has. Ideally, only
5996 developers who have commit access to the VC repository would be able
5997 to start trial builds, but unfortunately the buildmaster does not, in
5998 general, have access to VC system's user list.
6000 As a result, the @code{TryScheduler} requires a bit more
6001 configuration. There are currently two ways to set this up:
6003 @table @strong
6004 @item jobdir (ssh)
6006 This approach creates a command queue directory, called the
6007 ``jobdir'', in the buildmaster's working directory. The buildmaster
6008 admin sets the ownership and permissions of this directory to only
6009 grant write access to the desired set of developers, all of whom must
6010 have accounts on the machine. The @code{buildbot try} command creates
6011 a special file containing the source stamp information and drops it in
6012 the jobdir, just like a standard maildir. When the buildmaster notices
6013 the new file, it unpacks the information inside and starts the builds.
6015 The config file entries used by 'buildbot try' either specify a local
6016 queuedir (for which write and mv are used) or a remote one (using scp
6017 and ssh).
6019 The advantage of this scheme is that it is quite secure, the
6020 disadvantage is that it requires fiddling outside the buildmaster
6021 config (to set the permissions on the jobdir correctly). If the
6022 buildmaster machine happens to also house the VC repository, then it
6023 can be fairly easy to keep the VC userlist in sync with the
6024 trial-build userlist. If they are on different machines, this will be
6025 much more of a hassle. It may also involve granting developer accounts
6026 on a machine that would not otherwise require them.
6028 To implement this, the buildslave invokes 'ssh -l username host
6029 buildbot tryserver ARGS', passing the patch contents over stdin. The
6030 arguments must include the inlet directory and the revision
6031 information.
6033 @item user+password (PB)
6035 In this approach, each developer gets a username/password pair, which
6036 are all listed in the buildmaster's configuration file. When the
6037 developer runs @code{buildbot try}, their machine connects to the
6038 buildmaster via PB and authenticates themselves using that username
6039 and password, then sends a PB command to start the trial build.
6041 The advantage of this scheme is that the entire configuration is
6042 performed inside the buildmaster's config file. The disadvantages are
6043 that it is less secure (while the ``cred'' authentication system does
6044 not expose the password in plaintext over the wire, it does not offer
6045 most of the other security properties that SSH does). In addition, the
6046 buildmaster admin is responsible for maintaining the username/password
6047 list, adding and deleting entries as developers come and go.
6049 @end table
6052 For example, to set up the ``jobdir'' style of trial build, using a
6053 command queue directory of @file{MASTERDIR/jobdir} (and assuming that
6054 all your project developers were members of the @code{developers} unix
6055 group), you would first create that directory (with @command{mkdir
6056 MASTERDIR/jobdir MASTERDIR/jobdir/new MASTERDIR/jobdir/cur
6057 MASTERDIR/jobdir/tmp; chgrp developers MASTERDIR/jobdir
6058 MASTERDIR/jobdir/*; chmod g+rwx,o-rwx MASTERDIR/jobdir
6059 MASTERDIR/jobdir/*}), and then use the following scheduler in the
6060 buildmaster's config file:
6062 @example
6063 from buildbot.scheduler import Try_Jobdir
6064 s = Try_Jobdir("try1", ["full-linux", "full-netbsd", "full-OSX"],
6065                jobdir="jobdir")
6066 c['schedulers'] = [s]
6067 @end example
6069 Note that you must create the jobdir before telling the buildmaster to
6070 use this configuration, otherwise you will get an error. Also remember
6071 that the buildmaster must be able to read and write to the jobdir as
6072 well. Be sure to watch the @file{twistd.log} file (@pxref{Logfiles})
6073 as you start using the jobdir, to make sure the buildmaster is happy
6074 with it.
6076 To use the username/password form of authentication, create a
6077 @code{Try_Userpass} instance instead. It takes the same
6078 @code{builderNames} argument as the @code{Try_Jobdir} form, but
6079 accepts an addtional @code{port} argument (to specify the TCP port to
6080 listen on) and a @code{userpass} list of username/password pairs to
6081 accept. Remember to use good passwords for this: the security of the
6082 buildslave accounts depends upon it:
6084 @example
6085 from buildbot.scheduler import Try_Userpass
6086 s = Try_Userpass("try2", ["full-linux", "full-netbsd", "full-OSX"],
6087                  port=8031, userpass=[("alice","pw1"), ("bob", "pw2")] )
6088 c['schedulers'] = [s]
6089 @end example
6091 Like most places in the buildbot, the @code{port} argument takes a
6092 strports specification. See @code{twisted.application.strports} for
6093 details.
6096 @heading locating the master
6098 The @command{try} command needs to be told how to connect to the
6099 @code{TryScheduler}, and must know which of the authentication
6100 approaches described above is in use by the buildmaster. You specify
6101 the approach by using @option{--connect=ssh} or @option{--connect=pb}
6102 (or @code{try_connect = 'ssh'} or @code{try_connect = 'pb'} in
6103 @file{.buildbot/options}).
6105 For the PB approach, the command must be given a @option{--master}
6106 argument (in the form HOST:PORT) that points to TCP port that you
6107 picked in the @code{Try_Userpass} scheduler. It also takes a
6108 @option{--username} and @option{--passwd} pair of arguments that match
6109 one of the entries in the buildmaster's @code{userpass} list. These
6110 arguments can also be provided as @code{try_master},
6111 @code{try_username}, and @code{try_password} entries in the
6112 @file{.buildbot/options} file.
6114 For the SSH approach, the command must be given @option{--tryhost},
6115 @option{--username}, and optionally @option{--password} (TODO:
6116 really?) to get to the buildmaster host. It must also be given
6117 @option{--trydir}, which points to the inlet directory configured
6118 above. The trydir can be relative to the user's home directory, but
6119 most of the time you will use an explicit path like
6120 @file{~buildbot/project/trydir}. These arguments can be provided in
6121 @file{.buildbot/options} as @code{try_host}, @code{try_username},
6122 @code{try_password}, and @code{try_dir}.
6124 In addition, the SSH approach needs to connect to a PBListener status
6125 port, so it can retrieve and report the results of the build (the PB
6126 approach uses the existing connection to retrieve status information,
6127 so this step is not necessary). This requires a @option{--master}
6128 argument, or a @code{masterstatus} entry in @file{.buildbot/options},
6129 in the form of a HOSTNAME:PORT string.
6132 @heading choosing the Builders
6134 A trial build is performed on multiple Builders at the same time, and
6135 the developer gets to choose which Builders are used (limited to a set
6136 selected by the buildmaster admin with the TryScheduler's
6137 @code{builderNames=} argument). The set you choose will depend upon
6138 what your goals are: if you are concerned about cross-platform
6139 compatibility, you should use multiple Builders, one from each
6140 platform of interest. You might use just one builder if that platform
6141 has libraries or other facilities that allow better test coverage than
6142 what you can accomplish on your own machine, or faster test runs.
6144 The set of Builders to use can be specified with multiple
6145 @option{--builder} arguments on the command line. It can also be
6146 specified with a single @code{try_builders} option in
6147 @file{.buildbot/options} that uses a list of strings to specify all
6148 the Builder names:
6150 @example
6151 try_builders = ["full-OSX", "full-win32", "full-linux"]
6152 @end example
6154 @heading specifying the VC system
6156 The @command{try} command also needs to know how to take the
6157 developer's current tree and extract the (revision, patch)
6158 source-stamp pair. Each VC system uses a different process, so you
6159 start by telling the @command{try} command which VC system you are
6160 using, with an argument like @option{--vc=cvs} or @option{--vc=tla}.
6161 This can also be provided as @code{try_vc} in
6162 @file{.buildbot/options}.
6164 The following names are recognized: @code{cvs} @code{svn} @code{baz}
6165 @code{tla} @code{hg} @code{darcs}
6168 @heading finding the top of the tree
6170 Some VC systems (notably CVS and SVN) track each directory
6171 more-or-less independently, which means the @command{try} command
6172 needs to move up to the top of the project tree before it will be able
6173 to construct a proper full-tree patch. To accomplish this, the
6174 @command{try} command will crawl up through the parent directories
6175 until it finds a marker file. The default name for this marker file is
6176 @file{.buildbot-top}, so when you are using CVS or SVN you should
6177 @code{touch .buildbot-top} from the top of your tree before running
6178 @command{buildbot try}. Alternatively, you can use a filename like
6179 @file{ChangeLog} or @file{README}, since many projects put one of
6180 these files in their top-most directory (and nowhere else). To set
6181 this filename, use @option{--try-topfile=ChangeLog}, or set it in the
6182 options file with @code{try_topfile = 'ChangeLog'}.
6184 You can also manually set the top of the tree with
6185 @option{--try-topdir=~/trees/mytree}, or @code{try_topdir =
6186 '~/trees/mytree'}. If you use @code{try_topdir}, in a
6187 @file{.buildbot/options} file, you will need a separate options file
6188 for each tree you use, so it may be more convenient to use the
6189 @code{try_topfile} approach instead.
6191 Other VC systems which work on full projects instead of individual
6192 directories (tla, baz, darcs, monotone, mercurial) do not require
6193 @command{try} to know the top directory, so the @option{--try-topfile}
6194 and @option{--try-topdir} arguments will be ignored.
6195 @c is this true? I think I currently require topdirs all the time.
6197 If the @command{try} command cannot find the top directory, it will
6198 abort with an error message.
6200 @heading determining the branch name
6202 Some VC systems record the branch information in a way that ``try''
6203 can locate it, in particular Arch (both @command{tla} and
6204 @command{baz}). For the others, if you are using something other than
6205 the default branch, you will have to tell the buildbot which branch
6206 your tree is using. You can do this with either the @option{--branch}
6207 argument, or a @option{try_branch} entry in the
6208 @file{.buildbot/options} file.
6210 @heading determining the revision and patch
6212 Each VC system has a separate approach for determining the tree's base
6213 revision and computing a patch.
6215 @table @code
6217 @item CVS
6219 @command{try} pretends that the tree is up to date. It converts the
6220 current time into a @code{-D} time specification, uses it as the base
6221 revision, and computes the diff between the upstream tree as of that
6222 point in time versus the current contents. This works, more or less,
6223 but requires that the local clock be in reasonably good sync with the
6224 repository.
6226 @item SVN
6227 @command{try} does a @code{svn status -u} to find the latest
6228 repository revision number (emitted on the last line in the ``Status
6229 against revision: NN'' message). It then performs an @code{svn diff
6230 -rNN} to find out how your tree differs from the repository version,
6231 and sends the resulting patch to the buildmaster. If your tree is not
6232 up to date, this will result in the ``try'' tree being created with
6233 the latest revision, then @emph{backwards} patches applied to bring it
6234 ``back'' to the version you actually checked out (plus your actual
6235 code changes), but this will still result in the correct tree being
6236 used for the build.
6238 @item baz
6239 @command{try} does a @code{baz tree-id} to determine the
6240 fully-qualified version and patch identifier for the tree
6241 (ARCHIVE/VERSION--patch-NN), and uses the VERSION--patch-NN component
6242 as the base revision. It then does a @code{baz diff} to obtain the
6243 patch.
6245 @item tla
6246 @command{try} does a @code{tla tree-version} to get the
6247 fully-qualified version identifier (ARCHIVE/VERSION), then takes the
6248 first line of @code{tla logs --reverse} to figure out the base
6249 revision. Then it does @code{tla changes --diffs} to obtain the patch.
6251 @item Darcs
6252 @code{darcs changes --context} emits a text file that contains a list
6253 of all patches back to and including the last tag was made. This text
6254 file (plus the location of a repository that contains all these
6255 patches) is sufficient to re-create the tree. Therefore the contents
6256 of this ``context'' file @emph{are} the revision stamp for a
6257 Darcs-controlled source tree.
6259 So @command{try} does a @code{darcs changes --context} to determine
6260 what your tree's base revision is, and then does a @code{darcs diff
6261 -u} to compute the patch relative to that revision.
6263 @item Mercurial
6264 @code{hg identify} emits a short revision ID (basically a truncated
6265 SHA1 hash of the current revision's contents), which is used as the
6266 base revision. @code{hg diff} then provides the patch relative to that
6267 revision. For @command{try} to work, your working directory must only
6268 have patches that are available from the same remotely-available
6269 repository that the build process' @code{step.Mercurial} will use.
6271 @c TODO: monotone, git
6272 @end table
6274 @heading waiting for results
6276 If you provide the @option{--wait} option (or @code{try_wait = True}
6277 in @file{.buildbot/options}), the @command{buildbot try} command will
6278 wait until your changes have either been proven good or bad before
6279 exiting. Unless you use the @option{--quiet} option (or
6280 @code{try_quiet=True}), it will emit a progress message every 60
6281 seconds until the builds have completed.
6283 @menu
6284 * try --diff::                  
6285 @end menu
6287 @node try --diff,  , try, try
6288 @subsubsection try --diff
6290 Sometimes you might have a patch from someone else that you want to
6291 submit to the buildbot. For example, a user may have created a patch
6292 to fix some specific bug and sent it to you by email. You've inspected
6293 the patch and suspect that it might do the job (and have at least
6294 confirmed that it doesn't do anything evil). Now you want to test it
6295 out.
6297 One approach would be to check out a new local tree, apply the patch,
6298 run your local tests, then use ``buildbot try'' to run the tests on
6299 other platforms. An alternate approach is to use the @command{buildbot
6300 try --diff} form to have the buildbot test the patch without using a
6301 local tree.
6303 This form takes a @option{--diff} argument which points to a file that
6304 contains the patch you want to apply. By default this patch will be
6305 applied to the TRUNK revision, but if you give the optional
6306 @option{--baserev} argument, a tree of the given revision will be used
6307 as a starting point instead of TRUNK.
6309 You can also use @command{buildbot try --diff=-} to read the patch
6310 from stdin.
6312 Each patch has a ``patchlevel'' associated with it. This indicates the
6313 number of slashes (and preceding pathnames) that should be stripped
6314 before applying the diff. This exactly corresponds to the @option{-p}
6315 or @option{--strip} argument to the @command{patch} utility. By
6316 default @command{buildbot try --diff} uses a patchlevel of 0, but you
6317 can override this with the @option{-p} argument.
6319 When you use @option{--diff}, you do not need to use any of the other
6320 options that relate to a local tree, specifically @option{--vc},
6321 @option{--try-topfile}, or @option{--try-topdir}. These options will
6322 be ignored. Of course you must still specify how to get to the
6323 buildmaster (with @option{--connect}, @option{--tryhost}, etc).
6326 @node Other Tools, .buildbot config directory, Developer Tools, Command-line tool
6327 @section Other Tools
6329 These tools are generally used by buildmaster administrators.
6331 @menu
6332 * sendchange::                  
6333 * debugclient::                 
6334 @end menu
6336 @node sendchange, debugclient, Other Tools, Other Tools
6337 @subsection sendchange
6339 This command is used to tell the buildmaster about source changes. It
6340 is intended to be used from within a commit script, installed on the
6341 VC server. It requires that you have a PBChangeSource
6342 (@pxref{PBChangeSource}) running in the buildmaster (by being included
6343 in the @code{c['sources']} list).
6346 @example
6347 buildbot sendchange --master @var{MASTERHOST}:@var{PORT} --username @var{USER} @var{FILENAMES..}
6348 @end example
6350 There are other (optional) arguments which can influence the
6351 @code{Change} that gets submitted:
6353 @table @code
6354 @item --branch
6355 This provides the (string) branch specifier. If omitted, it defaults
6356 to None, indicating the ``default branch''. All files included in this
6357 Change must be on the same branch.
6359 @item --revision_number
6360 This provides a (numeric) revision number for the change, used for VC systems
6361 that use numeric transaction numbers (like Subversion).
6363 @item --revision
6364 This provides a (string) revision specifier, for VC systems that use
6365 strings (Arch would use something like patch-42 etc).
6367 @item --revision_file
6368 This provides a filename which will be opened and the contents used as
6369 the revision specifier. This is specifically for Darcs, which uses the
6370 output of @command{darcs changes --context} as a revision specifier.
6371 This context file can be a couple of kilobytes long, spanning a couple
6372 lines per patch, and would be a hassle to pass as a command-line
6373 argument.
6375 @item --comments
6376 This provides the change comments as a single argument. You may want
6377 to use @option{--logfile} instead.
6379 @item --logfile
6380 This instructs the tool to read the change comments from the given
6381 file. If you use @code{-} as the filename, the tool will read the
6382 change comments from stdin.
6383 @end table
6386 @node debugclient,  , sendchange, Other Tools
6387 @subsection debugclient
6389 @example
6390 buildbot debugclient --master @var{MASTERHOST}:@var{PORT} --passwd @var{DEBUGPW}
6391 @end example
6393 This launches a small Gtk+/Glade-based debug tool, connecting to the
6394 buildmaster's ``debug port''. This debug port shares the same port
6395 number as the slaveport (@pxref{Setting the slaveport}), but the
6396 @code{debugPort} is only enabled if you set a debug password in the
6397 buildmaster's config file (@pxref{Debug options}). The
6398 @option{--passwd} option must match the @code{c['debugPassword']}
6399 value.
6401 @option{--master} can also be provided in @file{.debug/options} by the
6402 @code{master} key. @option{--passwd} can be provided by the
6403 @code{debugPassword} key.
6405 The @code{Connect} button must be pressed before any of the other
6406 buttons will be active. This establishes the connection to the
6407 buildmaster. The other sections of the tool are as follows:
6409 @table @code
6410 @item Reload .cfg
6411 Forces the buildmaster to reload its @file{master.cfg} file. This is
6412 equivalent to sending a SIGHUP to the buildmaster, but can be done
6413 remotely through the debug port. Note that it is a good idea to be
6414 watching the buildmaster's @file{twistd.log} as you reload the config
6415 file, as any errors which are detected in the config file will be
6416 announced there.
6418 @item Rebuild .py
6419 (not yet implemented). The idea here is to use Twisted's ``rebuild''
6420 facilities to replace the buildmaster's running code with a new
6421 version. Even if this worked, it would only be used by buildbot
6422 developers.
6424 @item poke IRC
6425 This locates a @code{words.IRC} status target and causes it to emit a
6426 message on all the channels to which it is currently connected. This
6427 was used to debug a problem in which the buildmaster lost the
6428 connection to the IRC server and did not attempt to reconnect.
6430 @item Commit
6431 This allows you to inject a Change, just as if a real one had been
6432 delivered by whatever VC hook you are using. You can set the name of
6433 the committed file and the name of the user who is doing the commit.
6434 Optionally, you can also set a revision for the change. If the
6435 revision you provide looks like a number, it will be sent as an
6436 integer, otherwise it will be sent as a string.
6438 @item Force Build
6439 This lets you force a Builder (selected by name) to start a build of
6440 the current source tree.
6442 @item Currently
6443 (obsolete). This was used to manually set the status of the given
6444 Builder, but the status-assignment code was changed in an incompatible
6445 way and these buttons are no longer meaningful.
6447 @end table
6450 @node .buildbot config directory,  , Other Tools, Command-line tool
6451 @section .buildbot config directory
6453 Many of the @command{buildbot} tools must be told how to contact the
6454 buildmaster that they interact with. This specification can be
6455 provided as a command-line argument, but most of the time it will be
6456 easier to set them in an ``options'' file. The @command{buildbot}
6457 command will look for a special directory named @file{.buildbot},
6458 starting from the current directory (where the command was run) and
6459 crawling upwards, eventually looking in the user's home directory. It
6460 will look for a file named @file{options} in this directory, and will
6461 evaluate it as a python script, looking for certain names to be set.
6462 You can just put simple @code{name = 'value'} pairs in this file to
6463 set the options.
6465 For a description of the names used in this file, please see the
6466 documentation for the individual @command{buildbot} sub-commands. The
6467 following is a brief sample of what this file's contents could be.
6469 @example
6470 # for status-reading tools
6471 masterstatus = 'buildbot.example.org:12345'
6472 # for 'sendchange' or the debug port
6473 master = 'buildbot.example.org:18990'
6474 debugPassword = 'eiv7Po'
6475 @end example
6477 @table @code
6478 @item masterstatus
6479 Location of the @code{client.PBListener} status port, used by
6480 @command{statuslog} and @command{statusgui}.
6482 @item master
6483 Location of the @code{debugPort} (for @command{debugclient}). Also the
6484 location of the @code{pb.PBChangeSource} (for @command{sendchange}).
6485 Usually shares the slaveport, but a future version may make it
6486 possible to have these listen on a separate port number.
6488 @item debugPassword
6489 Must match the value of @code{c['debugPassword']}, used to protect the
6490 debug port, for the @command{debugclient} command.
6492 @item username
6493 Provides a default username for the @command{sendchange} command.
6495 @end table
6498 The following options are used by the @code{buildbot try} command
6499 (@pxref{try}):
6501 @table @code
6502 @item try_connect
6503 This specifies how the ``try'' command should deliver its request to
6504 the buildmaster. The currently accepted values are ``ssh'' and ``pb''.
6505 @item try_builders
6506 Which builders should be used for the ``try'' build.
6507 @item try_vc
6508 This specifies the version control system being used.
6509 @item try_branch
6510 This indicates that the current tree is on a non-trunk branch.
6511 @item try_topdir
6512 @item try_topfile
6513 Use @code{try_topdir} to explicitly indicate the top of your working
6514 tree, or @code{try_topfile} to name a file that will only be found in
6515 that top-most directory.
6517 @item try_host
6518 @item try_username
6519 @item try_dir
6520 When try_connect is ``ssh'', the command will pay attention to
6521 @code{try_host}, @code{try_username}, and @code{try_dir}.
6523 @item try_username
6524 @item try_password
6525 @item try_master
6526 Instead, when @code{try_connect} is ``pb'', the command will pay
6527 attention to @code{try_username}, @code{try_password}, and
6528 @code{try_master}.
6530 @item try_wait
6531 @item masterstatus
6532 @code{try_wait} and @code{masterstatus} are used to ask the ``try''
6533 command to wait for the requested build to complete.
6535 @end table
6539 @node Resources, Developer's Appendix, Command-line tool, Top
6540 @chapter Resources
6542 The Buildbot's home page is at @uref{http://buildbot.sourceforge.net/}
6544 For configuration questions and general discussion, please use the
6545 @code{buildbot-devel} mailing list. The subscription instructions and
6546 archives are available at
6547 @uref{http://lists.sourceforge.net/lists/listinfo/buildbot-devel}
6549 @node Developer's Appendix, Index of Useful Classes, Resources, Top
6550 @unnumbered Developer's Appendix
6552 This appendix contains random notes about the implementation of the
6553 Buildbot, and is likely to only be of use to people intending to
6554 extend the Buildbot's internals.
6556 The buildmaster consists of a tree of Service objects, which is shaped
6557 as follows:
6559 @example
6560 BuildMaster
6561  ChangeMaster  (in .change_svc)
6562   [IChangeSource instances]
6563  [IScheduler instances]  (in .schedulers)
6564  BotMaster  (in .botmaster)
6565  [IStatusTarget instances]  (in .statusTargets)
6566 @end example
6568 The BotMaster has a collection of Builder objects as values of its
6569 @code{.builders} dictionary.
6572 @node Index of Useful Classes, Index of master.cfg keys, Developer's Appendix, Top
6573 @unnumbered Index of Useful Classes
6575 This is a list of all user-visible classes. There are the ones that
6576 are useful in @file{master.cfg}, the buildmaster's configuration file.
6577 Classes that are not listed here are generally internal things that
6578 admins are unlikely to have much use for.
6581 @heading Change Sources
6582 @printindex cs
6584 @heading Schedulers and Locks
6585 @printindex sl
6587 @heading Build Factories
6588 @printindex bf
6590 @heading Build Steps
6591 @printindex bs
6593 @c undocumented steps
6594 @bsindex buildbot.steps.source.Git
6595 @bsindex buildbot.steps.maxq.MaxQ
6598 @heading Status Targets
6599 @printindex st
6601 @c TODO: undocumented targets
6602 @stindex buildbot.status.mail.MailNotifier
6604 @node Index of master.cfg keys, Index, Index of Useful Classes, Top
6605 @unnumbered Index of master.cfg keys
6607 This is a list of all of the significant keys in master.cfg . Recall
6608 that master.cfg is effectively a small python program one
6609 responsibility: create a dictionary named @code{BuildmasterConfig}.
6610 The keys of this dictionary are listed here. The beginning of the
6611 master.cfg file typically starts with something like:
6613 @example
6614 BuildmasterConfig = c = @{@}
6615 @end example
6617 Therefore a config key of @code{sources} will usually appear in
6618 master.cfg as @code{c['sources']}.
6620 @printindex bc
6623 @node Index,  , Index of master.cfg keys, Top
6624 @unnumbered Index
6626 @printindex cp
6629 @bye