web-parts: implement and document WebStatus, and some (but not nearly all) of the...
[buildbot.git] / docs / buildbot.texinfo
blobf0d08df167e840a5ea7925062c6bc6ae9e42d64b
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 * Mail-parsing ChangeSources::  
149 * PBChangeSource::              
150 * P4Source::                    
151 * BonsaiPoller::                
152 * SVNPoller::                   
153 * MercurialHook::               
155 Mail-parsing ChangeSources
157 * Subscribing the Buildmaster::  
158 * Using Maildirs::              
159 * Parsing Email Change Messages::  
161 Parsing Email Change Messages
163 * FCMaildirSource::             
164 * SyncmailMaildirSource::       
165 * BonsaiMaildirSource::         
166 * SVNCommitEmailMaildirSource::  
168 Build Process
170 * Build Steps::                 
171 * Interlocks::                  
172 * Build Factories::             
174 Build Steps
176 * Common Parameters::           
177 * Source Checkout::             
178 * ShellCommand::                
179 * Simple ShellCommand Subclasses::  
180 * Python BuildSteps::           
181 * Transferring Files::          
182 * Writing New BuildSteps::      
184 Source Checkout
186 * CVS::                         
187 * SVN::                         
188 * Darcs::                       
189 * Mercurial::                   
190 * Arch::                        
191 * Bazaar::                      
192 * Bzr::                         
193 * P4::                          
195 Simple ShellCommand Subclasses
197 * Configure::                   
198 * Compile::                     
199 * Test::                        
200 * Build Properties::            
202 Python BuildSteps
204 * BuildEPYDoc::                 
205 * PyFlakes::                    
207 Writing New BuildSteps
209 * BuildStep LogFiles::          
210 * Reading Logfiles::            
211 * Adding LogObservers::         
212 * BuildStep URLs::              
214 Build Factories
216 * BuildStep Objects::           
217 * BuildFactory::                
218 * Process-Specific build factories::  
220 BuildStep Objects
222 * BuildFactory Attributes::     
223 * Quick builds::                
225 BuildFactory
227 * BuildFactory Attributes::     
228 * Quick builds::                
230 Process-Specific build factories
232 * GNUAutoconf::                 
233 * CPAN::                        
234 * Python distutils::            
235 * Python/Twisted/trial projects::  
237 Status Delivery
239 * HTML Waterfall::              
240 * IRC Bot::                     
241 * PBListener::                  
242 * Writing New Status Plugins::  
244 Command-line tool
246 * Administrator Tools::         
247 * Developer Tools::             
248 * Other Tools::                 
249 * .buildbot config directory::  
251 Developer Tools
253 * statuslog::                   
254 * statusgui::                   
255 * try::                         
257 waiting for results
259 * try --diff::                  
261 Other Tools
263 * sendchange::                  
264 * debugclient::                 
266 @end detailmenu
267 @end menu
269 @node Introduction, Installation, Top, Top
270 @chapter Introduction
272 @cindex introduction
274 The BuildBot is a system to automate the compile/test cycle required by most
275 software projects to validate code changes. By automatically rebuilding and
276 testing the tree each time something has changed, build problems are
277 pinpointed quickly, before other developers are inconvenienced by the
278 failure. The guilty developer can be identified and harassed without human
279 intervention. By running the builds on a variety of platforms, developers
280 who do not have the facilities to test their changes everywhere before
281 checkin will at least know shortly afterwards whether they have broken the
282 build or not. Warning counts, lint checks, image size, compile time, and
283 other build parameters can be tracked over time, are more visible, and
284 are therefore easier to improve.
286 The overall goal is to reduce tree breakage and provide a platform to
287 run tests or code-quality checks that are too annoying or pedantic for
288 any human to waste their time with. Developers get immediate (and
289 potentially public) feedback about their changes, encouraging them to
290 be more careful about testing before checkin.
292 Features:
294 @itemize @bullet
295 @item
296 run builds on a variety of slave platforms
297 @item
298 arbitrary build process: handles projects using C, Python, whatever
299 @item
300 minimal host requirements: python and Twisted
301 @item
302 slaves can be behind a firewall if they can still do checkout
303 @item
304 status delivery through web page, email, IRC, other protocols
305 @item
306 track builds in progress, provide estimated completion time
307 @item
308 flexible configuration by subclassing generic build process classes
309 @item
310 debug tools to force a new build, submit fake Changes, query slave status
311 @item
312 released under the GPL
313 @end itemize
315 @menu
316 * History and Philosophy::      
317 * System Architecture::         
318 * Control Flow::                
319 @end menu
322 @node History and Philosophy, System Architecture, Introduction, Introduction
323 @section History and Philosophy
325 @cindex Philosophy of operation
327 The Buildbot was inspired by a similar project built for a development
328 team writing a cross-platform embedded system. The various components
329 of the project were supposed to compile and run on several flavors of
330 unix (linux, solaris, BSD), but individual developers had their own
331 preferences and tended to stick to a single platform. From time to
332 time, incompatibilities would sneak in (some unix platforms want to
333 use @code{string.h}, some prefer @code{strings.h}), and then the tree
334 would compile for some developers but not others. The buildbot was
335 written to automate the human process of walking into the office,
336 updating a tree, compiling (and discovering the breakage), finding the
337 developer at fault, and complaining to them about the problem they had
338 introduced. With multiple platforms it was difficult for developers to
339 do the right thing (compile their potential change on all platforms);
340 the buildbot offered a way to help.
342 Another problem was when programmers would change the behavior of a
343 library without warning its users, or change internal aspects that
344 other code was (unfortunately) depending upon. Adding unit tests to
345 the codebase helps here: if an application's unit tests pass despite
346 changes in the libraries it uses, you can have more confidence that
347 the library changes haven't broken anything. Many developers
348 complained that the unit tests were inconvenient or took too long to
349 run: having the buildbot run them reduces the developer's workload to
350 a minimum.
352 In general, having more visibility into the project is always good,
353 and automation makes it easier for developers to do the right thing.
354 When everyone can see the status of the project, developers are
355 encouraged to keep the tree in good working order. Unit tests that
356 aren't run on a regular basis tend to suffer from bitrot just like
357 code does: exercising them on a regular basis helps to keep them
358 functioning and useful.
360 The current version of the Buildbot is additionally targeted at
361 distributed free-software projects, where resources and platforms are
362 only available when provided by interested volunteers. The buildslaves
363 are designed to require an absolute minimum of configuration, reducing
364 the effort a potential volunteer needs to expend to be able to
365 contribute a new test environment to the project. The goal is for
366 anyone who wishes that a given project would run on their favorite
367 platform should be able to offer that project a buildslave, running on
368 that platform, where they can verify that their portability code
369 works, and keeps working.
371 @node System Architecture, Control Flow, History and Philosophy, Introduction
372 @comment  node-name,  next,  previous,  up
373 @section System Architecture
375 The Buildbot consists of a single @code{buildmaster} and one or more
376 @code{buildslaves}, connected in a star topology. The buildmaster
377 makes all decisions about what, when, and how to build. It sends
378 commands to be run on the build slaves, which simply execute the
379 commands and return the results. (certain steps involve more local
380 decision making, where the overhead of sending a lot of commands back
381 and forth would be inappropriate, but in general the buildmaster is
382 responsible for everything).
384 The buildmaster is usually fed @code{Changes} by some sort of version
385 control system (@pxref{Change Sources}), which may cause builds to be
386 run. As the builds are performed, various status messages are
387 produced, which are then sent to any registered Status Targets
388 (@pxref{Status Delivery}).
390 @c @image{FILENAME, WIDTH, HEIGHT, ALTTEXT, EXTENSION}
391 @image{images/overview,,,Overview Diagram,}
393 The buildmaster is configured and maintained by the ``buildmaster
394 admin'', who is generally the project team member responsible for
395 build process issues. Each buildslave is maintained by a ``buildslave
396 admin'', who do not need to be quite as involved. Generally slaves are
397 run by anyone who has an interest in seeing the project work well on
398 their favorite platform.
400 @menu
401 * BuildSlave Connections::      
402 * Buildmaster Architecture::    
403 * Status Delivery Architecture::  
404 @end menu
406 @node BuildSlave Connections, Buildmaster Architecture, System Architecture, System Architecture
407 @subsection BuildSlave Connections
409 The buildslaves are typically run on a variety of separate machines,
410 at least one per platform of interest. These machines connect to the
411 buildmaster over a TCP connection to a publically-visible port. As a
412 result, the buildslaves can live behind a NAT box or similar
413 firewalls, as long as they can get to buildmaster. The TCP connections
414 are initiated by the buildslave and accepted by the buildmaster, but
415 commands and results travel both ways within this connection. The
416 buildmaster is always in charge, so all commands travel exclusively
417 from the buildmaster to the buildslave.
419 To perform builds, the buildslaves must typically obtain source code
420 from a CVS/SVN/etc repository. Therefore they must also be able to
421 reach the repository. The buildmaster provides instructions for
422 performing builds, but does not provide the source code itself.
424 @image{images/slaves,,,BuildSlave Connections,}
426 @node Buildmaster Architecture, Status Delivery Architecture, BuildSlave Connections, System Architecture
427 @subsection Buildmaster Architecture
429 The Buildmaster consists of several pieces:
431 @image{images/master,,,BuildMaster Architecture,}
433 @itemize @bullet
435 @item
436 Change Sources, which create a Change object each time something is
437 modified in the VC repository. Most ChangeSources listen for messages
438 from a hook script of some sort. Some sources actively poll the
439 repository on a regular basis. All Changes are fed to the Schedulers.
441 @item
442 Schedulers, which decide when builds should be performed. They collect
443 Changes into BuildRequests, which are then queued for delivery to
444 Builders until a buildslave is available.
446 @item
447 Builders, which control exactly @emph{how} each build is performed
448 (with a series of BuildSteps, configured in a BuildFactory). Each
449 Build is run on a single buildslave.
451 @item
452 Status plugins, which deliver information about the build results
453 through protocols like HTTP, mail, and IRC.
455 @end itemize
457 @image{images/slavebuilder,,,SlaveBuilders,}
459 Each Builder is configured with a list of BuildSlaves that it will use
460 for its builds. These buildslaves are expected to behave identically:
461 the only reason to use multiple BuildSlaves for a single Builder is to
462 provide a measure of load-balancing.
464 Within a single BuildSlave, each Builder creates its own SlaveBuilder
465 instance. These SlaveBuilders operate independently from each other.
466 Each gets its own base directory to work in. It is quite common to
467 have many Builders sharing the same buildslave. For example, there
468 might be two buildslaves: one for i386, and a second for PowerPC.
469 There may then be a pair of Builders that do a full compile/test run,
470 one for each architecture, and a lone Builder that creates snapshot
471 source tarballs if the full builders complete successfully. The full
472 builders would each run on a single buildslave, whereas the tarball
473 creation step might run on either buildslave (since the platform
474 doesn't matter when creating source tarballs). In this case, the
475 mapping would look like:
477 @example
478 Builder(full-i386)  ->  BuildSlaves(slave-i386)
479 Builder(full-ppc)   ->  BuildSlaves(slave-ppc)
480 Builder(source-tarball) -> BuildSlaves(slave-i386, slave-ppc)
481 @end example
483 and each BuildSlave would have two SlaveBuilders inside it, one for a
484 full builder, and a second for the source-tarball builder.
486 Once a SlaveBuilder is available, the Builder pulls one or more
487 BuildRequests off its incoming queue. (It may pull more than one if it
488 determines that it can merge the requests together; for example, there
489 may be multiple requests to build the current HEAD revision). These
490 requests are merged into a single Build instance, which includes the
491 SourceStamp that describes what exact version of the source code
492 should be used for the build. The Build is then randomly assigned to a
493 free SlaveBuilder and the build begins.
496 @node Status Delivery Architecture,  , Buildmaster Architecture, System Architecture
497 @subsection Status Delivery Architecture
499 The buildmaster maintains a central Status object, to which various
500 status plugins are connected. Through this Status object, a full
501 hierarchy of build status objects can be obtained.
503 @image{images/status,,,Status Delivery,}
505 The configuration file controls which status plugins are active. Each
506 status plugin gets a reference to the top-level Status object. From
507 there they can request information on each Builder, Build, Step, and
508 LogFile. This query-on-demand interface is used by the html.Waterfall
509 plugin to create the main status page each time a web browser hits the
510 main URL.
512 The status plugins can also subscribe to hear about new Builds as they
513 occur: this is used by the MailNotifier to create new email messages
514 for each recently-completed Build.
516 The Status object records the status of old builds on disk in the
517 buildmaster's base directory. This allows it to return information
518 about historical builds.
520 There are also status objects that correspond to Schedulers and
521 BuildSlaves. These allow status plugins to report information about
522 upcoming builds, and the online/offline status of each buildslave.
525 @node Control Flow,  , System Architecture, Introduction
526 @comment  node-name,  next,  previous,  up
527 @section Control Flow
529 A day in the life of the buildbot:
531 @itemize @bullet
533 @item
534 A developer commits some source code changes to the repository. A hook
535 script or commit trigger of some sort sends information about this
536 change to the buildmaster through one of its configured Change
537 Sources. This notification might arrive via email, or over a network
538 connection (either initiated by the buildmaster as it ``subscribes''
539 to changes, or by the commit trigger as it pushes Changes towards the
540 buildmaster). The Change contains information about who made the
541 change, what files were modified, which revision contains the change,
542 and any checkin comments.
544 @item
545 The buildmaster distributes this change to all of its configured
546 Schedulers. Any ``important'' changes cause the ``tree-stable-timer''
547 to be started, and the Change is added to a list of those that will go
548 into a new Build. When the timer expires, a Build is started on each
549 of a set of configured Builders, all compiling/testing the same source
550 code. Unless configured otherwise, all Builds run in parallel on the
551 various buildslaves.
553 @item
554 The Build consists of a series of Steps. Each Step causes some number
555 of commands to be invoked on the remote buildslave associated with
556 that Builder. The first step is almost always to perform a checkout of
557 the appropriate revision from the same VC system that produced the
558 Change. The rest generally perform a compile and run unit tests. As
559 each Step runs, the buildslave reports back command output and return
560 status to the buildmaster.
562 @item
563 As the Build runs, status messages like ``Build Started'', ``Step
564 Started'', ``Build Finished'', etc, are published to a collection of
565 Status Targets. One of these targets is usually the HTML ``Waterfall''
566 display, which shows a chronological list of events, and summarizes
567 the results of the most recent build at the top of each column.
568 Developers can periodically check this page to see how their changes
569 have fared. If they see red, they know that they've made a mistake and
570 need to fix it. If they see green, they know that they've done their
571 duty and don't need to worry about their change breaking anything.
573 @item
574 If a MailNotifier status target is active, the completion of a build
575 will cause email to be sent to any developers whose Changes were
576 incorporated into this Build. The MailNotifier can be configured to
577 only send mail upon failing builds, or for builds which have just
578 transitioned from passing to failing. Other status targets can provide
579 similar real-time notification via different communication channels,
580 like IRC.
582 @end itemize
585 @node Installation, Concepts, Introduction, Top
586 @chapter Installation
588 @menu
589 * Requirements::                
590 * Installing the code::         
591 * Creating a buildmaster::      
592 * Creating a buildslave::       
593 * Launching the daemons::       
594 * Logfiles::                    
595 * Shutdown::                    
596 * Maintenance::                 
597 * Troubleshooting::             
598 @end menu
600 @node Requirements, Installing the code, Installation, Installation
601 @section Requirements
603 At a bare minimum, you'll need the following (for both the buildmaster
604 and a buildslave):
606 @itemize @bullet
607 @item
608 Python: http://www.python.org
610 Buildbot requires python-2.3 or later, and is primarily developed
611 against python-2.4. It is also tested against python-2.5 .
613 @item
614 Twisted: http://twistedmatrix.com
616 Both the buildmaster and the buildslaves require Twisted-2.0.x or
617 later. It has been tested against all releases of Twisted up to
618 Twisted-2.5.0 (the most recent as of this writing). As always, the
619 most recent version is recommended.
621 Twisted is delivered as a collection of subpackages. You'll need at
622 least "Twisted" (the core package), and you'll also want TwistedMail,
623 TwistedWeb, and TwistedWords (for sending email, serving a web status
624 page, and delivering build status via IRC, respectively). You might
625 also want TwistedConch (for the encrypted Manhole debug port). Note
626 that Twisted requires ZopeInterface to be installed as well.
628 @end itemize
630 Certain other packages may be useful on the system running the
631 buildmaster:
633 @itemize @bullet
634 @item
635 CVSToys: http://purl.net/net/CVSToys
637 If your buildmaster uses FreshCVSSource to receive change notification
638 from a cvstoys daemon, it will require CVSToys be installed (tested
639 with CVSToys-1.0.10). If the it doesn't use that source (i.e. if you
640 only use a mail-parsing change source, or the SVN notification
641 script), you will not need CVSToys.
643 @end itemize
645 And of course, your project's build process will impose additional
646 requirements on the buildslaves. These hosts must have all the tools
647 necessary to compile and test your project's source code.
650 @node Installing the code, Creating a buildmaster, Requirements, Installation
651 @section Installing the code
653 @cindex installation
655 The Buildbot is installed using the standard python @code{distutils}
656 module. After unpacking the tarball, the process is:
658 @example
659 python setup.py build
660 python setup.py install
661 @end example
663 where the install step may need to be done as root. This will put the
664 bulk of the code in somewhere like
665 /usr/lib/python2.3/site-packages/buildbot . It will also install the
666 @code{buildbot} command-line tool in /usr/bin/buildbot.
668 To test this, shift to a different directory (like /tmp), and run:
670 @example
671 buildbot --version
672 @end example
674 If it shows you the versions of Buildbot and Twisted, the install went
675 ok. If it says @code{no such command} or it gets an @code{ImportError}
676 when it tries to load the libaries, then something went wrong.
677 @code{pydoc buildbot} is another useful diagnostic tool.
679 Windows users will find these files in other places. You will need to
680 make sure that python can find the libraries, and will probably find
681 it convenient to have @code{buildbot} on your PATH.
683 If you wish, you can run the buildbot unit test suite like this:
685 @example
686 PYTHONPATH=. trial buildbot.test
687 @end example
689 This should run up to 192 tests, depending upon what VC tools you have
690 installed. On my desktop machine it takes about five minutes to
691 complete. Nothing should fail, a few might be skipped. If any of the
692 tests fail, you should stop and investigate the cause before
693 continuing the installation process, as it will probably be easier to
694 track down the bug early.
696 If you cannot or do not wish to install the buildbot into a site-wide
697 location like @file{/usr} or @file{/usr/local}, you can also install
698 it into the account's home directory. Do the install command like
699 this:
701 @example
702 python setup.py install --home=~
703 @end example
705 That will populate @file{~/lib/python} and create
706 @file{~/bin/buildbot}. Make sure this lib directory is on your
707 @code{PYTHONPATH}.
710 @node Creating a buildmaster, Creating a buildslave, Installing the code, Installation
711 @section Creating a buildmaster
713 As you learned earlier (@pxref{System Architecture}), the buildmaster
714 runs on a central host (usually one that is publically visible, so
715 everybody can check on the status of the project), and controls all
716 aspects of the buildbot system. Let us call this host
717 @code{buildbot.example.org}.
719 You may wish to create a separate user account for the buildmaster,
720 perhaps named @code{buildmaster}. This can help keep your personal
721 configuration distinct from that of the buildmaster and is useful if
722 you have to use a mail-based notification system (@pxref{Change
723 Sources}). However, the Buildbot will work just fine with your regular
724 user account.
726 You need to choose a directory for the buildmaster, called the
727 @code{basedir}. This directory will be owned by the buildmaster, which
728 will use configuration files therein, and create status files as it
729 runs. @file{~/Buildbot} is a likely value. If you run multiple
730 buildmasters in the same account, or if you run both masters and
731 slaves, you may want a more distinctive name like
732 @file{~/Buildbot/master/gnomovision} or
733 @file{~/Buildmasters/fooproject}. If you are using a separate user
734 account, this might just be @file{~buildmaster/masters/fooproject}.
736 Once you've picked a directory, use the @command{buildbot
737 create-master} command to create the directory and populate it with
738 startup files:
740 @example
741 buildbot create-master @var{basedir}
742 @end example
744 You will need to create a configuration file (@pxref{Configuration})
745 before starting the buildmaster. Most of the rest of this manual is
746 dedicated to explaining how to do this. A sample configuration file is
747 placed in the working directory, named @file{master.cfg.sample}, which
748 can be copied to @file{master.cfg} and edited to suit your purposes.
750 (Internal details: This command creates a file named
751 @file{buildbot.tac} that contains all the state necessary to create
752 the buildmaster. Twisted has a tool called @code{twistd} which can use
753 this .tac file to create and launch a buildmaster instance. twistd
754 takes care of logging and daemonization (running the program in the
755 background). @file{/usr/bin/buildbot} is a front end which runs twistd
756 for you.)
758 In addition to @file{buildbot.tac}, a small @file{Makefile.sample} is
759 installed. This can be used as the basis for customized daemon startup,
760 @xref{Launching the daemons}.
763 @node Creating a buildslave, Launching the daemons, Creating a buildmaster, Installation
764 @section Creating a buildslave
766 Typically, you will be adding a buildslave to an existing buildmaster,
767 to provide additional architecture coverage. The buildbot
768 administrator will give you several pieces of information necessary to
769 connect to the buildmaster. You should also be somewhat familiar with
770 the project being tested, so you can troubleshoot build problems
771 locally.
773 The buildbot exists to make sure that the project's stated ``how to
774 build it'' process actually works. To this end, the buildslave should
775 run in an environment just like that of your regular developers.
776 Typically the project build process is documented somewhere
777 (@file{README}, @file{INSTALL}, etc), in a document that should
778 mention all library dependencies and contain a basic set of build
779 instructions. This document will be useful as you configure the host
780 and account in which the buildslave runs.
782 Here's a good checklist for setting up a buildslave:
784 @enumerate
785 @item
786 Set up the account
788 It is recommended (although not mandatory) to set up a separate user
789 account for the buildslave. This account is frequently named
790 @code{buildbot} or @code{buildslave}. This serves to isolate your
791 personal working environment from that of the slave's, and helps to
792 minimize the security threat posed by letting possibly-unknown
793 contributors run arbitrary code on your system. The account should
794 have a minimum of fancy init scripts.
796 @item
797 Install the buildbot code
799 Follow the instructions given earlier (@pxref{Installing the code}).
800 If you use a separate buildslave account, and you didn't install the
801 buildbot code to a shared location, then you will need to install it
802 with @code{--home=~} for each account that needs it.
804 @item
805 Set up the host
807 Make sure the host can actually reach the buildmaster. Usually the
808 buildmaster is running a status webserver on the same machine, so
809 simply point your web browser at it and see if you can get there.
810 Install whatever additional packages or libraries the project's
811 INSTALL document advises. (or not: if your buildslave is supposed to
812 make sure that building without optional libraries still works, then
813 don't install those libraries).
815 Again, these libraries don't necessarily have to be installed to a
816 site-wide shared location, but they must be available to your build
817 process. Accomplishing this is usually very specific to the build
818 process, so installing them to @file{/usr} or @file{/usr/local} is
819 usually the best approach.
821 @item
822 Test the build process
824 Follow the instructions in the INSTALL document, in the buildslave's
825 account. Perform a full CVS (or whatever) checkout, configure, make,
826 run tests, etc. Confirm that the build works without manual fussing.
827 If it doesn't work when you do it by hand, it will be unlikely to work
828 when the buildbot attempts to do it in an automated fashion.
830 @item
831 Choose a base directory
833 This should be somewhere in the buildslave's account, typically named
834 after the project which is being tested. The buildslave will not touch
835 any file outside of this directory. Something like @file{~/Buildbot}
836 or @file{~/Buildslaves/fooproject} is appropriate.
838 @item
839 Get the buildmaster host/port, botname, and password
841 When the buildbot admin configures the buildmaster to accept and use
842 your buildslave, they will provide you with the following pieces of
843 information:
845 @itemize @bullet
846 @item
847 your buildslave's name
848 @item
849 the password assigned to your buildslave
850 @item
851 the hostname and port number of the buildmaster, i.e. buildbot.example.org:8007
852 @end itemize
854 @item
855 Create the buildslave
857 Now run the 'buildbot' command as follows:
859 @example
860 buildbot create-slave @var{BASEDIR} @var{MASTERHOST}:@var{PORT} @var{SLAVENAME} @var{PASSWORD}
861 @end example
863 This will create the base directory and a collection of files inside,
864 including the @file{buildbot.tac} file that contains all the
865 information you passed to the @code{buildbot} command.
867 @item
868 Fill in the hostinfo files
870 When it first connects, the buildslave will send a few files up to the
871 buildmaster which describe the host that it is running on. These files
872 are presented on the web status display so that developers have more
873 information to reproduce any test failures that are witnessed by the
874 buildbot. There are sample files in the @file{info} subdirectory of
875 the buildbot's base directory. You should edit these to correctly
876 describe you and your host.
878 @file{BASEDIR/info/admin} should contain your name and email address.
879 This is the ``buildslave admin address'', and will be visible from the
880 build status page (so you may wish to munge it a bit if
881 address-harvesting spambots are a concern).
883 @file{BASEDIR/info/host} should be filled with a brief description of
884 the host: OS, version, memory size, CPU speed, versions of relevant
885 libraries installed, and finally the version of the buildbot code
886 which is running the buildslave.
888 If you run many buildslaves, you may want to create a single
889 @file{~buildslave/info} file and share it among all the buildslaves
890 with symlinks.
892 @end enumerate
894 @menu
895 * Buildslave Options::          
896 @end menu
898 @node Buildslave Options,  , Creating a buildslave, Creating a buildslave
899 @subsection Buildslave Options
901 There are a handful of options you might want to use when creating the
902 buildslave with the @command{buildbot create-slave <options> DIR <params>}
903 command. You can type @command{buildbot create-slave --help} for a summary.
904 To use these, just include them on the @command{buildbot create-slave}
905 command line, like this:
907 @example
908 buildbot create-slave --umask=022 ~/buildslave buildmaster.example.org:42012 myslavename mypasswd
909 @end example
911 @table @code
912 @item --usepty
913 This is a boolean flag that tells the buildslave whether to launch
914 child processes in a PTY (the default) or with regular pipes. The
915 advantage of using a PTY is that ``grandchild'' processes are more
916 likely to be cleaned up if the build is interrupted or times out
917 (since it enables the use of a ``process group'' in which all child
918 processes will be placed). The disadvantages: some forms of Unix have
919 problems with PTYs, some of your unit tests may behave differently
920 when run under a PTY (generally those which check to see if they are
921 being run interactively), and PTYs will merge the stdout and stderr
922 streams into a single output stream (which means the red-vs-black
923 coloring in the logfiles will be lost). If you encounter problems, you
924 can add @code{--usepty=0} to disable the use of PTYs. Note that
925 windows buildslaves never use PTYs.
927 @item --umask
928 This is a string (generally an octal representation of an integer)
929 which will cause the buildslave process' ``umask'' value to be set
930 shortly after initialization. The ``twistd'' daemonization utility
931 forces the umask to 077 at startup (which means that all files created
932 by the buildslave or its child processes will be unreadable by any
933 user other than the buildslave account). If you want build products to
934 be readable by other accounts, you can add @code{--umask=022} to tell
935 the buildslave to fix the umask after twistd clobbers it. If you want
936 build products to be @emph{writable} by other accounts too, use
937 @code{--umask=000}, but this is likely to be a security problem.
939 @item --keepalive
940 This is a number that indicates how frequently ``keepalive'' messages
941 should be sent from the buildslave to the buildmaster, expressed in
942 seconds. The default (600) causes a message to be sent to the
943 buildmaster at least once every 10 minutes. To set this to a lower
944 value, use e.g. @code{--keepalive=120}.
946 If the buildslave is behind a NAT box or stateful firewall, these
947 messages may help to keep the connection alive: some NAT boxes tend to
948 forget about a connection if it has not been used in a while. When
949 this happens, the buildmaster will think that the buildslave has
950 disappeared, and builds will time out. Meanwhile the buildslave will
951 not realize than anything is wrong.
953 @end table
956 @node Launching the daemons, Logfiles, Creating a buildslave, Installation
957 @section Launching the daemons
959 Both the buildmaster and the buildslave run as daemon programs. To
960 launch them, pass the working directory to the @code{buildbot}
961 command:
963 @example
964 buildbot start @var{BASEDIR}
965 @end example
967 This command will start the daemon and then return, so normally it
968 will not produce any output. To verify that the programs are indeed
969 running, look for a pair of files named @file{twistd.log} and
970 @file{twistd.pid} that should be created in the working directory.
971 @file{twistd.pid} contains the process ID of the newly-spawned daemon.
973 When the buildslave connects to the buildmaster, new directories will
974 start appearing in its base directory. The buildmaster tells the slave
975 to create a directory for each Builder which will be using that slave.
976 All build operations are performed within these directories: CVS
977 checkouts, compiles, and tests.
979 Once you get everything running, you will want to arrange for the
980 buildbot daemons to be started at boot time. One way is to use
981 @code{cron}, by putting them in a @@reboot crontab entry@footnote{this
982 @@reboot syntax is understood by Vixie cron, which is the flavor
983 usually provided with linux systems. Other unices may have a cron that
984 doesn't understand @@reboot}:
986 @example
987 @@reboot buildbot start @var{BASEDIR}
988 @end example
990 When you run @command{crontab} to set this up, remember to do it as
991 the buildmaster or buildslave account! If you add this to your crontab
992 when running as your regular account (or worse yet, root), then the
993 daemon will run as the wrong user, quite possibly as one with more
994 authority than you intended to provide.
996 It is important to remember that the environment provided to cron jobs
997 and init scripts can be quite different that your normal runtime.
998 There may be fewer environment variables specified, and the PATH may
999 be shorter than usual. It is a good idea to test out this method of
1000 launching the buildslave by using a cron job with a time in the near
1001 future, with the same command, and then check @file{twistd.log} to
1002 make sure the slave actually started correctly. Common problems here
1003 are for @file{/usr/local} or @file{~/bin} to not be on your
1004 @code{PATH}, or for @code{PYTHONPATH} to not be set correctly.
1005 Sometimes @code{HOME} is messed up too.
1007 To modify the way the daemons are started (perhaps you want to set
1008 some environment variables first, or perform some cleanup each time),
1009 you can create a file named @file{Makefile.buildbot} in the base
1010 directory. When the @file{buildbot} front-end tool is told to
1011 @command{start} the daemon, and it sees this file (and
1012 @file{/usr/bin/make} exists), it will do @command{make -f
1013 Makefile.buildbot start} instead of its usual action (which involves
1014 running @command{twistd}). When the buildmaster or buildslave is
1015 installed, a @file{Makefile.sample} is created which implements the
1016 same behavior as the the @file{buildbot} tool uses, so if you want to
1017 customize the process, just copy @file{Makefile.sample} to
1018 @file{Makefile.buildbot} and edit it as necessary.
1020 @node Logfiles, Shutdown, Launching the daemons, Installation
1021 @section Logfiles
1023 @cindex logfiles
1025 While a buildbot daemon runs, it emits text to a logfile, named
1026 @file{twistd.log}. A command like @code{tail -f twistd.log} is useful
1027 to watch the command output as it runs.
1029 The buildmaster will announce any errors with its configuration file
1030 in the logfile, so it is a good idea to look at the log at startup
1031 time to check for any problems. Most buildmaster activities will cause
1032 lines to be added to the log.
1034 @node Shutdown, Maintenance, Logfiles, Installation
1035 @section Shutdown
1037 To stop a buildmaster or buildslave manually, use:
1039 @example
1040 buildbot stop @var{BASEDIR}
1041 @end example
1043 This simply looks for the @file{twistd.pid} file and kills whatever
1044 process is identified within.
1046 At system shutdown, all processes are sent a @code{SIGKILL}. The
1047 buildmaster and buildslave will respond to this by shutting down
1048 normally.
1050 The buildmaster will respond to a @code{SIGHUP} by re-reading its
1051 config file. The following shortcut is available:
1053 @example
1054 buildbot reconfig @var{BASEDIR}
1055 @end example
1057 When you update the Buildbot code to a new release, you will need to
1058 restart the buildmaster and/or buildslave before it can take advantage
1059 of the new code. You can do a @code{buildbot stop @var{BASEDIR}} and
1060 @code{buildbot start @var{BASEDIR}} in quick succession, or you can
1061 use the @code{restart} shortcut, which does both steps for you:
1063 @example
1064 buildbot restart @var{BASEDIR}
1065 @end example
1068 @node Maintenance, Troubleshooting, Shutdown, Installation
1069 @section Maintenance
1071 It is a good idea to check the buildmaster's status page every once in
1072 a while, to see if your buildslave is still online. Eventually the
1073 buildbot will probably be enhanced to send you email (via the
1074 @file{info/admin} email address) when the slave has been offline for
1075 more than a few hours.
1077 If you find you can no longer provide a buildslave to the project, please
1078 let the project admins know, so they can put out a call for a
1079 replacement.
1081 The Buildbot records status and logs output continually, each time a
1082 build is performed. The status tends to be small, but the build logs
1083 can become quite large. Each build and log are recorded in a separate
1084 file, arranged hierarchically under the buildmaster's base directory.
1085 To prevent these files from growing without bound, you should
1086 periodically delete old build logs. A simple cron job to delete
1087 anything older than, say, two weeks should do the job. The only trick
1088 is to leave the @file{buildbot.tac} and other support files alone, for
1089 which find's @code{-mindepth} argument helps skip everything in the
1090 top directory. You can use something like the following:
1092 @example
1093 @@weekly cd BASEDIR && find . -mindepth 2 -type f -mtime +14 -exec rm @{@} \;
1094 @@weekly cd BASEDIR && find twistd.log* -mtime +14 -exec rm @{@} \;
1095 @end example
1097 @node Troubleshooting,  , Maintenance, Installation
1098 @section Troubleshooting
1100 Here are a few hints on diagnosing common problems.
1102 @menu
1103 * Starting the buildslave::     
1104 * Connecting to the buildmaster::  
1105 * Forcing Builds::              
1106 @end menu
1108 @node Starting the buildslave, Connecting to the buildmaster, Troubleshooting, Troubleshooting
1109 @subsection Starting the buildslave
1111 Cron jobs are typically run with a minimal shell (@file{/bin/sh}, not
1112 @file{/bin/bash}), and tilde expansion is not always performed in such
1113 commands. You may want to use explicit paths, because the @code{PATH}
1114 is usually quite short and doesn't include anything set by your
1115 shell's startup scripts (@file{.profile}, @file{.bashrc}, etc). If
1116 you've installed buildbot (or other python libraries) to an unusual
1117 location, you may need to add a @code{PYTHONPATH} specification (note
1118 that python will do tilde-expansion on @code{PYTHONPATH} elements by
1119 itself). Sometimes it is safer to fully-specify everything:
1121 @example
1122 @@reboot PYTHONPATH=~/lib/python /usr/local/bin/buildbot start /usr/home/buildbot/basedir
1123 @end example
1125 Take the time to get the @@reboot job set up. Otherwise, things will work
1126 fine for a while, but the first power outage or system reboot you have will
1127 stop the buildslave with nothing but the cries of sorrowful developers to
1128 remind you that it has gone away.
1130 @node Connecting to the buildmaster, Forcing Builds, Starting the buildslave, Troubleshooting
1131 @subsection Connecting to the buildmaster
1133 If the buildslave cannot connect to the buildmaster, the reason should
1134 be described in the @file{twistd.log} logfile. Some common problems
1135 are an incorrect master hostname or port number, or a mistyped bot
1136 name or password. If the buildslave loses the connection to the
1137 master, it is supposed to attempt to reconnect with an
1138 exponentially-increasing backoff. Each attempt (and the time of the
1139 next attempt) will be logged. If you get impatient, just manually stop
1140 and re-start the buildslave.
1142 When the buildmaster is restarted, all slaves will be disconnected,
1143 and will attempt to reconnect as usual. The reconnect time will depend
1144 upon how long the buildmaster is offline (i.e. how far up the
1145 exponential backoff curve the slaves have travelled). Again,
1146 @code{buildbot stop @var{BASEDIR}; buildbot start @var{BASEDIR}} will
1147 speed up the process.
1149 @node Forcing Builds,  , Connecting to the buildmaster, Troubleshooting
1150 @subsection Forcing Builds
1152 From the buildmaster's main status web page, you can force a build to
1153 be run on your build slave. Figure out which column is for a builder
1154 that runs on your slave, click on that builder's name, and the page
1155 that comes up will have a ``Force Build'' button. Fill in the form,
1156 hit the button, and a moment later you should see your slave's
1157 @file{twistd.log} filling with commands being run. Using @code{pstree}
1158 or @code{top} should also reveal the cvs/make/gcc/etc processes being
1159 run by the buildslave. Note that the same web page should also show
1160 the @file{admin} and @file{host} information files that you configured
1161 earlier.
1163 @node Concepts, Configuration, Installation, Top
1164 @chapter Concepts
1166 This chapter defines some of the basic concepts that the Buildbot
1167 uses. You'll need to understand how the Buildbot sees the world to
1168 configure it properly.
1170 @menu
1171 * Version Control Systems::     
1172 * Schedulers::                  
1173 * BuildSet::                    
1174 * BuildRequest::                
1175 * Builder::                     
1176 * Users::                       
1177 @end menu
1179 @node Version Control Systems, Schedulers, Concepts, Concepts
1180 @section Version Control Systems
1182 @cindex Version Control
1184 These source trees come from a Version Control System of some kind.
1185 CVS and Subversion are two popular ones, but the Buildbot supports
1186 others. All VC systems have some notion of an upstream
1187 @code{repository} which acts as a server@footnote{except Darcs, but
1188 since the Buildbot never modifies its local source tree we can ignore
1189 the fact that Darcs uses a less centralized model}, from which clients
1190 can obtain source trees according to various parameters. The VC
1191 repository provides source trees of various projects, for different
1192 branches, and from various points in time. The first thing we have to
1193 do is to specify which source tree we want to get.
1195 @menu
1196 * Generalizing VC Systems::     
1197 * Source Tree Specifications::  
1198 * How Different VC Systems Specify Sources::  
1199 * Attributes of Changes::       
1200 @end menu
1202 @node Generalizing VC Systems, Source Tree Specifications, Version Control Systems, Version Control Systems
1203 @subsection Generalizing VC Systems
1205 For the purposes of the Buildbot, we will try to generalize all VC
1206 systems as having repositories that each provide sources for a variety
1207 of projects. Each project is defined as a directory tree with source
1208 files. The individual files may each have revisions, but we ignore
1209 that and treat the project as a whole as having a set of revisions
1210 (CVS is really the only VC system still in widespread use that has
1211 per-file revisions.. everything modern has moved to atomic tree-wide
1212 changesets). Each time someone commits a change to the project, a new
1213 revision becomes available. These revisions can be described by a
1214 tuple with two items: the first is a branch tag, and the second is
1215 some kind of revision stamp or timestamp. Complex projects may have
1216 multiple branch tags, but there is always a default branch. The
1217 timestamp may be an actual timestamp (such as the -D option to CVS),
1218 or it may be a monotonically-increasing transaction number (such as
1219 the change number used by SVN and P4, or the revision number used by
1220 Arch/Baz/Bazaar, or a labeled tag used in CVS)@footnote{many VC
1221 systems provide more complexity than this: in particular the local
1222 views that P4 and ClearCase can assemble out of various source
1223 directories are more complex than we're prepared to take advantage of
1224 here}. The SHA1 revision ID used by Monotone and Mercurial is also a
1225 kind of revision stamp, in that it specifies a unique copy of the
1226 source tree, as does a Darcs ``context'' file.
1228 When we aren't intending to make any changes to the sources we check out
1229 (at least not any that need to be committed back upstream), there are two
1230 basic ways to use a VC system:
1232 @itemize @bullet
1233 @item
1234 Retrieve a specific set of source revisions: some tag or key is used
1235 to index this set, which is fixed and cannot be changed by subsequent
1236 developers committing new changes to the tree. Releases are built from
1237 tagged revisions like this, so that they can be rebuilt again later
1238 (probably with controlled modifications).
1239 @item
1240 Retrieve the latest sources along a specific branch: some tag is used
1241 to indicate which branch is to be used, but within that constraint we want
1242 to get the latest revisions.
1243 @end itemize
1245 Build personnel or CM staff typically use the first approach: the
1246 build that results is (ideally) completely specified by the two
1247 parameters given to the VC system: repository and revision tag. This
1248 gives QA and end-users something concrete to point at when reporting
1249 bugs. Release engineers are also reportedly fond of shipping code that
1250 can be traced back to a concise revision tag of some sort.
1252 Developers are more likely to use the second approach: each morning
1253 the developer does an update to pull in the changes committed by the
1254 team over the last day. These builds are not easy to fully specify: it
1255 depends upon exactly when you did a checkout, and upon what local
1256 changes the developer has in their tree. Developers do not normally
1257 tag each build they produce, because there is usually significant
1258 overhead involved in creating these tags. Recreating the trees used by
1259 one of these builds can be a challenge. Some VC systems may provide
1260 implicit tags (like a revision number), while others may allow the use
1261 of timestamps to mean ``the state of the tree at time X'' as opposed
1262 to a tree-state that has been explicitly marked.
1264 The Buildbot is designed to help developers, so it usually works in
1265 terms of @emph{the latest} sources as opposed to specific tagged
1266 revisions. However, it would really prefer to build from reproducible
1267 source trees, so implicit revisions are used whenever possible.
1269 @node Source Tree Specifications, How Different VC Systems Specify Sources, Generalizing VC Systems, Version Control Systems
1270 @subsection Source Tree Specifications
1272 So for the Buildbot's purposes we treat each VC system as a server
1273 which can take a list of specifications as input and produce a source
1274 tree as output. Some of these specifications are static: they are
1275 attributes of the builder and do not change over time. Others are more
1276 variable: each build will have a different value. The repository is
1277 changed over time by a sequence of Changes, each of which represents a
1278 single developer making changes to some set of files. These Changes
1279 are cumulative@footnote{Monotone's @emph{multiple heads} feature
1280 violates this assumption of cumulative Changes, but in most situations
1281 the changes don't occur frequently enough for this to be a significant
1282 problem}.
1284 For normal builds, the Buildbot wants to get well-defined source trees
1285 that contain specific Changes, and exclude other Changes that may have
1286 occurred after the desired ones. We assume that the Changes arrive at
1287 the buildbot (through one of the mechanisms described in @pxref{Change
1288 Sources}) in the same order in which they are committed to the
1289 repository. The Buildbot waits for the tree to become ``stable''
1290 before initiating a build, for two reasons. The first is that
1291 developers frequently make multiple related commits in quick
1292 succession, even when the VC system provides ways to make atomic
1293 transactions involving multiple files at the same time. Running a
1294 build in the middle of these sets of changes would use an inconsistent
1295 set of source files, and is likely to fail (and is certain to be less
1296 useful than a build which uses the full set of changes). The
1297 tree-stable-timer is intended to avoid these useless builds that
1298 include some of the developer's changes but not all. The second reason
1299 is that some VC systems (i.e. CVS) do not provide repository-wide
1300 transaction numbers, so that timestamps are the only way to refer to
1301 a specific repository state. These timestamps may be somewhat
1302 ambiguous, due to processing and notification delays. By waiting until
1303 the tree has been stable for, say, 10 minutes, we can choose a
1304 timestamp from the middle of that period to use for our source
1305 checkout, and then be reasonably sure that any clock-skew errors will
1306 not cause the build to be performed on an inconsistent set of source
1307 files.
1309 The Schedulers always use the tree-stable-timer, with a timeout that
1310 is configured to reflect a reasonable tradeoff between build latency
1311 and change frequency. When the VC system provides coherent
1312 repository-wide revision markers (such as Subversion's revision
1313 numbers, or in fact anything other than CVS's timestamps), the
1314 resulting Build is simply performed against a source tree defined by
1315 that revision marker. When the VC system does not provide this, a
1316 timestamp from the middle of the tree-stable period is used to
1317 generate the source tree@footnote{this @code{checkoutDelay} defaults
1318 to half the tree-stable timer, but it can be overridden with an
1319 argument to the Source Step}.
1321 @node How Different VC Systems Specify Sources, Attributes of Changes, Source Tree Specifications, Version Control Systems
1322 @subsection How Different VC Systems Specify Sources
1324 For CVS, the static specifications are @code{repository} and
1325 @code{module}. In addition to those, each build uses a timestamp (or
1326 omits the timestamp to mean @code{the latest}) and @code{branch tag}
1327 (which defaults to HEAD). These parameters collectively specify a set
1328 of sources from which a build may be performed.
1330 @uref{http://subversion.tigris.org, Subversion} combines the
1331 repository, module, and branch into a single @code{Subversion URL}
1332 parameter. Within that scope, source checkouts can be specified by a
1333 numeric @code{revision number} (a repository-wide
1334 monotonically-increasing marker, such that each transaction that
1335 changes the repository is indexed by a different revision number), or
1336 a revision timestamp. When branches are used, the repository and
1337 module form a static @code{baseURL}, while each build has a
1338 @code{revision number} and a @code{branch} (which defaults to a
1339 statically-specified @code{defaultBranch}). The @code{baseURL} and
1340 @code{branch} are simply concatenated together to derive the
1341 @code{svnurl} to use for the checkout.
1343 @uref{http://www.perforce.com/, Perforce} is similar. The server
1344 is specified through a @code{P4PORT} parameter. Module and branch
1345 are specified in a single depot path, and revisions are
1346 depot-wide. When branches are used, the @code{p4base} and
1347 @code{defaultBranch} are concatenated together to produce the depot
1348 path.
1350 @uref{http://wiki.gnuarch.org/, Arch} and
1351 @uref{http://bazaar.canonical.com/, Bazaar} specify a repository by
1352 URL, as well as a @code{version} which is kind of like a branch name.
1353 Arch uses the word @code{archive} to represent the repository. Arch
1354 lets you push changes from one archive to another, removing the strict
1355 centralization required by CVS and SVN. It retains the distinction
1356 between repository and working directory that most other VC systems
1357 use. For complex multi-module directory structures, Arch has a
1358 built-in @code{build config} layer with which the checkout process has
1359 two steps. First, an initial bootstrap checkout is performed to
1360 retrieve a set of build-config files. Second, one of these files is
1361 used to figure out which archives/modules should be used to populate
1362 subdirectories of the initial checkout.
1364 Builders which use Arch and Bazaar therefore have a static archive
1365 @code{url}, and a default ``branch'' (which is a string that specifies
1366 a complete category--branch--version triple). Each build can have its
1367 own branch (the category--branch--version string) to override the
1368 default, as well as a revision number (which is turned into a
1369 --patch-NN suffix when performing the checkout).
1372 @uref{http://bazaar-vcs.org, Bzr} (which is a descendant of
1373 Arch/Bazaar, and is frequently referred to as ``Bazaar'') has the same
1374 sort of repository-vs-workspace model as Arch, but the repository data
1375 can either be stored inside the working directory or kept elsewhere
1376 (either on the same machine or on an entirely different machine). For
1377 the purposes of Buildbot (which never commits changes), the repository
1378 is specified with a URL and a revision number.
1380 The most common way to obtain read-only access to a bzr tree is via
1381 HTTP, simply by making the repository visible through a web server
1382 like Apache. Bzr can also use FTP and SFTP servers, if the buildslave
1383 process has sufficient privileges to access them. Higher performance
1384 can be obtained by running a special Bazaar-specific server. None of
1385 these matter to the buildbot: the repository URL just has to match the
1386 kind of server being used. The @code{repoURL} argument provides the
1387 location of the repository.
1389 Branches are expressed as subdirectories of the main central
1390 repository, which means that if branches are being used, the BZR step
1391 is given a @code{baseURL} and @code{defaultBranch} instead of getting
1392 the @code{repoURL} argument.
1395 @uref{http://darcs.net/, Darcs} doesn't really have the
1396 notion of a single master repository. Nor does it really have
1397 branches. In Darcs, each working directory is also a repository, and
1398 there are operations to push and pull patches from one of these
1399 @code{repositories} to another. For the Buildbot's purposes, all you
1400 need to do is specify the URL of a repository that you want to build
1401 from. The build slave will then pull the latest patches from that
1402 repository and build them. Multiple branches are implemented by using
1403 multiple repositories (possibly living on the same server).
1405 Builders which use Darcs therefore have a static @code{repourl} which
1406 specifies the location of the repository. If branches are being used,
1407 the source Step is instead configured with a @code{baseURL} and a
1408 @code{defaultBranch}, and the two strings are simply concatenated
1409 together to obtain the repository's URL. Each build then has a
1410 specific branch which replaces @code{defaultBranch}, or just uses the
1411 default one. Instead of a revision number, each build can have a
1412 ``context'', which is a string that records all the patches that are
1413 present in a given tree (this is the output of @command{darcs changes
1414 --context}, and is considerably less concise than, e.g. Subversion's
1415 revision number, but the patch-reordering flexibility of Darcs makes
1416 it impossible to provide a shorter useful specification).
1418 @uref{http://selenic.com/mercurial, Mercurial} is like Darcs, in that
1419 each branch is stored in a separate repository. The @code{repourl},
1420 @code{baseURL}, and @code{defaultBranch} arguments are all handled the
1421 same way as with Darcs. The ``revision'', however, is the hash
1422 identifier returned by @command{hg identify}.
1425 @node Attributes of Changes,  , How Different VC Systems Specify Sources, Version Control Systems
1426 @subsection Attributes of Changes
1428 @heading Who
1430 Each Change has a @code{who} attribute, which specifies which
1431 developer is responsible for the change. This is a string which comes
1432 from a namespace controlled by the VC repository. Frequently this
1433 means it is a username on the host which runs the repository, but not
1434 all VC systems require this (Arch, for example, uses a fully-qualified
1435 @code{Arch ID}, which looks like an email address, as does Darcs).
1436 Each StatusNotifier will map the @code{who} attribute into something
1437 appropriate for their particular means of communication: an email
1438 address, an IRC handle, etc.
1440 @heading Files
1442 It also has a list of @code{files}, which are just the tree-relative
1443 filenames of any files that were added, deleted, or modified for this
1444 Change. These filenames are used by the @code{isFileImportant}
1445 function (in the Scheduler) to decide whether it is worth triggering a
1446 new build or not, e.g. the function could use
1447 @code{filename.endswith(".c")} to only run a build if a C file were
1448 checked in. Certain BuildSteps can also use the list of changed files
1449 to run a more targeted series of tests, e.g. the
1450 @code{python_twisted.Trial} step can run just the unit tests that
1451 provide coverage for the modified .py files instead of running the
1452 full test suite.
1454 @heading Comments
1456 The Change also has a @code{comments} attribute, which is a string
1457 containing any checkin comments.
1459 @heading Revision
1461 Each Change can have a @code{revision} attribute, which describes how
1462 to get a tree with a specific state: a tree which includes this Change
1463 (and all that came before it) but none that come after it. If this
1464 information is unavailable, the @code{.revision} attribute will be
1465 @code{None}. These revisions are provided by the ChangeSource, and
1466 consumed by the @code{computeSourceRevision} method in the appropriate
1467 @code{step.Source} class.
1469 @table @samp
1470 @item CVS
1471 @code{revision} is an int, seconds since the epoch
1472 @item SVN
1473 @code{revision} is an int, a transation number (r%d)
1474 @item Darcs
1475 @code{revision} is a large string, the output of @code{darcs changes --context}
1476 @item Mercurial
1477 @code{revision} is a short string (a hash ID), the output of @code{hg identify}
1478 @item Arch/Bazaar
1479 @code{revision} is the full revision ID (ending in --patch-%d)
1480 @item P4
1481 @code{revision} is an int, the transaction number
1482 @end table
1484 @heading Branches
1486 The Change might also have a @code{branch} attribute. This indicates
1487 that all of the Change's files are in the same named branch. The
1488 Schedulers get to decide whether the branch should be built or not.
1490 For VC systems like CVS, Arch, and Monotone, the @code{branch} name is
1491 unrelated to the filename. (that is, the branch name and the filename
1492 inhabit unrelated namespaces). For SVN, branches are expressed as
1493 subdirectories of the repository, so the file's ``svnurl'' is a
1494 combination of some base URL, the branch name, and the filename within
1495 the branch. (In a sense, the branch name and the filename inhabit the
1496 same namespace). Darcs branches are subdirectories of a base URL just
1497 like SVN. Mercurial branches are the same as Darcs.
1499 @table @samp
1500 @item CVS
1501 branch='warner-newfeature', files=['src/foo.c']
1502 @item SVN
1503 branch='branches/warner-newfeature', files=['src/foo.c']
1504 @item Darcs
1505 branch='warner-newfeature', files=['src/foo.c']
1506 @item Mercurial
1507 branch='warner-newfeature', files=['src/foo.c']
1508 @item Arch/Bazaar
1509 branch='buildbot--usebranches--0', files=['buildbot/master.py']
1510 @end table
1512 @heading Links
1514 @c TODO: who is using 'links'? how is it being used?
1516 Finally, the Change might have a @code{links} list, which is intended
1517 to provide a list of URLs to a @emph{viewcvs}-style web page that
1518 provides more detail for this Change, perhaps including the full file
1519 diffs.
1522 @node Schedulers, BuildSet, Version Control Systems, Concepts
1523 @section Schedulers
1525 @cindex Scheduler
1527 Each Buildmaster has a set of @code{Scheduler} objects, each of which
1528 gets a copy of every incoming Change. The Schedulers are responsible
1529 for deciding when Builds should be run. Some Buildbot installations
1530 might have a single Scheduler, while others may have several, each for
1531 a different purpose.
1533 For example, a ``quick'' scheduler might exist to give immediate
1534 feedback to developers, hoping to catch obvious problems in the code
1535 that can be detected quickly. These typically do not run the full test
1536 suite, nor do they run on a wide variety of platforms. They also
1537 usually do a VC update rather than performing a brand-new checkout
1538 each time. You could have a ``quick'' scheduler which used a 30 second
1539 timeout, and feeds a single ``quick'' Builder that uses a VC
1540 @code{mode='update'} setting.
1542 A separate ``full'' scheduler would run more comprehensive tests a
1543 little while later, to catch more subtle problems. This scheduler
1544 would have a longer tree-stable-timer, maybe 30 minutes, and would
1545 feed multiple Builders (with a @code{mode=} of @code{'copy'},
1546 @code{'clobber'}, or @code{'export'}).
1548 The @code{tree-stable-timer} and @code{isFileImportant} decisions are
1549 made by the Scheduler. Dependencies are also implemented here.
1550 Periodic builds (those which are run every N seconds rather than after
1551 new Changes arrive) are triggered by a special @code{Periodic}
1552 Scheduler subclass. The default Scheduler class can also be told to
1553 watch for specific branches, ignoring Changes on other branches. This
1554 may be useful if you have a trunk and a few release branches which
1555 should be tracked, but when you don't want to have the Buildbot pay
1556 attention to several dozen private user branches.
1558 Some Schedulers may trigger builds for other reasons, other than
1559 recent Changes. For example, a Scheduler subclass could connect to a
1560 remote buildmaster and watch for builds of a library to succeed before
1561 triggering a local build that uses that library.
1563 Each Scheduler creates and submits @code{BuildSet} objects to the
1564 @code{BuildMaster}, which is then responsible for making sure the
1565 individual @code{BuildRequests} are delivered to the target
1566 @code{Builders}.
1568 @code{Scheduler} instances are activated by placing them in the
1569 @code{c['schedulers']} list in the buildmaster config file. Each
1570 Scheduler has a unique name.
1573 @node BuildSet, BuildRequest, Schedulers, Concepts
1574 @section BuildSet
1576 @cindex BuildSet
1578 A @code{BuildSet} is the name given to a set of Builds that all
1579 compile/test the same version of the tree on multiple Builders. In
1580 general, all these component Builds will perform the same sequence of
1581 Steps, using the same source code, but on different platforms or
1582 against a different set of libraries.
1584 The @code{BuildSet} is tracked as a single unit, which fails if any of
1585 the component Builds have failed, and therefore can succeed only if
1586 @emph{all} of the component Builds have succeeded. There are two kinds
1587 of status notification messages that can be emitted for a BuildSet:
1588 the @code{firstFailure} type (which fires as soon as we know the
1589 BuildSet will fail), and the @code{Finished} type (which fires once
1590 the BuildSet has completely finished, regardless of whether the
1591 overall set passed or failed).
1593 A @code{BuildSet} is created with a @emph{source stamp} tuple of
1594 (branch, revision, changes, patch), some of which may be None, and a
1595 list of Builders on which it is to be run. They are then given to the
1596 BuildMaster, which is responsible for creating a separate
1597 @code{BuildRequest} for each Builder.
1599 There are a couple of different likely values for the
1600 @code{SourceStamp}:
1602 @table @code
1603 @item (revision=None, changes=[CHANGES], patch=None)
1604 This is a @code{SourceStamp} used when a series of Changes have
1605 triggered a build. The VC step will attempt to check out a tree that
1606 contains CHANGES (and any changes that occurred before CHANGES, but
1607 not any that occurred after them).
1609 @item (revision=None, changes=None, patch=None)
1610 This builds the most recent code on the default branch. This is the
1611 sort of @code{SourceStamp} that would be used on a Build that was
1612 triggered by a user request, or a Periodic scheduler. It is also
1613 possible to configure the VC Source Step to always check out the
1614 latest sources rather than paying attention to the Changes in the
1615 SourceStamp, which will result in same behavior as this.
1617 @item (branch=BRANCH, revision=None, changes=None, patch=None)
1618 This builds the most recent code on the given BRANCH. Again, this is
1619 generally triggered by a user request or Periodic build.
1621 @item (revision=REV, changes=None, patch=(LEVEL, DIFF))
1622 This checks out the tree at the given revision REV, then applies a
1623 patch (using @code{diff -pLEVEL <DIFF}). The @ref{try} feature uses
1624 this kind of @code{SourceStamp}. If @code{patch} is None, the patching
1625 step is bypassed.
1627 @end table
1629 The buildmaster is responsible for turning the @code{BuildSet} into a
1630 set of @code{BuildRequest} objects and queueing them on the
1631 appropriate Builders.
1634 @node BuildRequest, Builder, BuildSet, Concepts
1635 @section BuildRequest
1637 @cindex BuildRequest
1639 A @code{BuildRequest} is a request to build a specific set of sources
1640 on a single specific Builder. Each Builder runs the
1641 @code{BuildRequest} as soon as it can (i.e. when an associated
1642 buildslave becomes free).
1644 The @code{BuildRequest} contains the @code{SourceStamp} specification.
1645 The actual process of running the build (the series of Steps that will
1646 be executed) is implemented by the @code{Build} object. In this future
1647 this might be changed, to have the @code{Build} define @emph{what}
1648 gets built, and a separate @code{BuildProcess} (provided by the
1649 Builder) to define @emph{how} it gets built.
1651 The @code{BuildRequest} may be mergeable with other compatible
1652 @code{BuildRequest}s. Builds that are triggered by incoming Changes
1653 will generally be mergeable. Builds that are triggered by user
1654 requests are generally not, unless they are multiple requests to build
1655 the @emph{latest sources} of the same branch.
1657 @node Builder, Users, BuildRequest, Concepts
1658 @section Builder
1660 @cindex Builder
1662 The @code{Builder} is a long-lived object which controls all Builds of
1663 a given type. Each one is created when the config file is first
1664 parsed, and lives forever (or rather until it is removed from the
1665 config file). It mediates the connections to the buildslaves that do
1666 all the work, and is responsible for creating the @code{Build} objects
1667 that decide @emph{how} a build is performed (i.e., which steps are
1668 executed in what order).
1670 Each @code{Builder} gets a unique name, and the path name of a
1671 directory where it gets to do all its work (there is a
1672 buildmaster-side directory for keeping status information, as well as
1673 a buildslave-side directory where the actual checkout/compile/test
1674 commands are executed). It also gets a @code{BuildFactory}, which is
1675 responsible for creating new @code{Build} instances: because the
1676 @code{Build} instance is what actually performs each build, choosing
1677 the @code{BuildFactory} is the way to specify what happens each time a
1678 build is done.
1680 Each @code{Builder} is associated with one of more @code{BuildSlaves}.
1681 A @code{Builder} which is used to perform OS-X builds (as opposed to
1682 Linux or Solaris builds) should naturally be associated with an
1683 OS-X-based buildslave.
1686 @node Users,  , Builder, Concepts
1687 @section Users
1689 @cindex Users
1691 Buildbot has a somewhat limited awareness of @emph{users}. It assumes
1692 the world consists of a set of developers, each of whom can be
1693 described by a couple of simple attributes. These developers make
1694 changes to the source code, causing builds which may succeed or fail.
1696 Each developer is primarily known through the source control system. Each
1697 Change object that arrives is tagged with a @code{who} field that
1698 typically gives the account name (on the repository machine) of the user
1699 responsible for that change. This string is the primary key by which the
1700 User is known, and is displayed on the HTML status pages and in each Build's
1701 ``blamelist''.
1703 To do more with the User than just refer to them, this username needs to
1704 be mapped into an address of some sort. The responsibility for this mapping
1705 is left up to the status module which needs the address. The core code knows
1706 nothing about email addresses or IRC nicknames, just user names.
1708 @menu
1709 * Doing Things With Users::     
1710 * Email Addresses::             
1711 * IRC Nicknames::               
1712 * Live Status Clients::         
1713 @end menu
1715 @node Doing Things With Users, Email Addresses, Users, Users
1716 @subsection Doing Things With Users
1718 Each Change has a single User who is responsible for that Change. Most
1719 Builds have a set of Changes: the Build represents the first time these
1720 Changes have been built and tested by the Buildbot. The build has a
1721 ``blamelist'' that consists of a simple union of the Users responsible
1722 for all the Build's Changes.
1724 The Build provides (through the IBuildStatus interface) a list of Users
1725 who are ``involved'' in the build. For now this is equal to the
1726 blamelist, but in the future it will be expanded to include a ``build
1727 sheriff'' (a person who is ``on duty'' at that time and responsible for
1728 watching over all builds that occur during their shift), as well as
1729 per-module owners who simply want to keep watch over their domain (chosen by
1730 subdirectory or a regexp matched against the filenames pulled out of the
1731 Changes). The Involved Users are those who probably have an interest in the
1732 results of any given build.
1734 In the future, Buildbot will acquire the concept of ``Problems'',
1735 which last longer than builds and have beginnings and ends. For example, a
1736 test case which passed in one build and then failed in the next is a
1737 Problem. The Problem lasts until the test case starts passing again, at
1738 which point the Problem is said to be ``resolved''.
1740 If there appears to be a code change that went into the tree at the
1741 same time as the test started failing, that Change is marked as being
1742 resposible for the Problem, and the user who made the change is added
1743 to the Problem's ``Guilty'' list. In addition to this user, there may
1744 be others who share responsibility for the Problem (module owners,
1745 sponsoring developers). In addition to the Responsible Users, there
1746 may be a set of Interested Users, who take an interest in the fate of
1747 the Problem.
1749 Problems therefore have sets of Users who may want to be kept aware of
1750 the condition of the problem as it changes over time. If configured, the
1751 Buildbot can pester everyone on the Responsible list with increasing
1752 harshness until the problem is resolved, with the most harshness reserved
1753 for the Guilty parties themselves. The Interested Users may merely be told
1754 when the problem starts and stops, as they are not actually responsible for
1755 fixing anything.
1757 @node Email Addresses, IRC Nicknames, Doing Things With Users, Users
1758 @subsection Email Addresses
1760 The @code{buildbot.status.mail.MailNotifier} class provides a
1761 status target which can send email about the results of each build. It
1762 accepts a static list of email addresses to which each message should be
1763 delivered, but it can also be configured to send mail to the Build's
1764 Interested Users. To do this, it needs a way to convert User names into
1765 email addresses.
1767 For many VC systems, the User Name is actually an account name on the
1768 system which hosts the repository. As such, turning the name into an
1769 email address is a simple matter of appending
1770 ``@@repositoryhost.com''. Some projects use other kinds of mappings
1771 (for example the preferred email address may be at ``project.org''
1772 despite the repository host being named ``cvs.project.org''), and some
1773 VC systems have full separation between the concept of a user and that
1774 of an account on the repository host (like Perforce). Some systems
1775 (like Arch) put a full contact email address in every change.
1777 To convert these names to addresses, the MailNotifier uses an EmailLookup
1778 object. This provides a .getAddress method which accepts a name and
1779 (eventually) returns an address. The default @code{MailNotifier}
1780 module provides an EmailLookup which simply appends a static string,
1781 configurable when the notifier is created. To create more complex behaviors
1782 (perhaps using an LDAP lookup, or using ``finger'' on a central host to
1783 determine a preferred address for the developer), provide a different object
1784 as the @code{lookup} argument.
1786 In the future, when the Problem mechanism has been set up, the Buildbot
1787 will need to send mail to arbitrary Users. It will do this by locating a
1788 MailNotifier-like object among all the buildmaster's status targets, and
1789 asking it to send messages to various Users. This means the User-to-address
1790 mapping only has to be set up once, in your MailNotifier, and every email
1791 message the buildbot emits will take advantage of it.
1793 @node IRC Nicknames, Live Status Clients, Email Addresses, Users
1794 @subsection IRC Nicknames
1796 Like MailNotifier, the @code{buildbot.status.words.IRC} class
1797 provides a status target which can announce the results of each build. It
1798 also provides an interactive interface by responding to online queries
1799 posted in the channel or sent as private messages.
1801 In the future, the buildbot can be configured map User names to IRC
1802 nicknames, to watch for the recent presence of these nicknames, and to
1803 deliver build status messages to the interested parties. Like
1804 @code{MailNotifier} does for email addresses, the @code{IRC} object
1805 will have an @code{IRCLookup} which is responsible for nicknames. The
1806 mapping can be set up statically, or it can be updated by online users
1807 themselves (by claiming a username with some kind of ``buildbot: i am
1808 user warner'' commands).
1810 Once the mapping is established, the rest of the buildbot can ask the
1811 @code{IRC} object to send messages to various users. It can report on
1812 the likelihood that the user saw the given message (based upon how long the
1813 user has been inactive on the channel), which might prompt the Problem
1814 Hassler logic to send them an email message instead.
1816 @node Live Status Clients,  , IRC Nicknames, Users
1817 @subsection Live Status Clients
1819 The Buildbot also offers a PB-based status client interface which can
1820 display real-time build status in a GUI panel on the developer's desktop.
1821 This interface is normally anonymous, but it could be configured to let the
1822 buildmaster know @emph{which} developer is using the status client. The
1823 status client could then be used as a message-delivery service, providing an
1824 alternative way to deliver low-latency high-interruption messages to the
1825 developer (like ``hey, you broke the build'').
1828 @node Configuration, Getting Source Code Changes, Concepts, Top
1829 @chapter Configuration
1831 @cindex Configuration
1833 The buildbot's behavior is defined by the ``config file'', which
1834 normally lives in the @file{master.cfg} file in the buildmaster's base
1835 directory (but this can be changed with an option to the
1836 @code{buildbot create-master} command). This file completely specifies
1837 which Builders are to be run, which slaves they should use, how
1838 Changes should be tracked, and where the status information is to be
1839 sent. The buildmaster's @file{buildbot.tac} file names the base
1840 directory; everything else comes from the config file.
1842 A sample config file was installed for you when you created the
1843 buildmaster, but you will need to edit it before your buildbot will do
1844 anything useful.
1846 This chapter gives an overview of the format of this file and the
1847 various sections in it. You will need to read the later chapters to
1848 understand how to fill in each section properly.
1850 @menu
1851 * Config File Format::          
1852 * Loading the Config File::     
1853 * Defining the Project::        
1854 * Listing Change Sources and Schedulers::  
1855 * Setting the slaveport::       
1856 * Buildslave Specifiers::       
1857 * Defining Builders::           
1858 * Defining Status Targets::     
1859 * Debug options::               
1860 @end menu
1862 @node Config File Format, Loading the Config File, Configuration, Configuration
1863 @section Config File Format
1865 The config file is, fundamentally, just a piece of Python code which
1866 defines a dictionary named @code{BuildmasterConfig}, with a number of
1867 keys that are treated specially. You don't need to know Python to do
1868 basic configuration, though, you can just copy the syntax of the
1869 sample file. If you @emph{are} comfortable writing Python code,
1870 however, you can use all the power of a full programming language to
1871 achieve more complicated configurations.
1873 The @code{BuildmasterConfig} name is the only one which matters: all
1874 other names defined during the execution of the file are discarded.
1875 When parsing the config file, the Buildmaster generally compares the
1876 old configuration with the new one and performs the minimum set of
1877 actions necessary to bring the buildbot up to date: Builders which are
1878 not changed are left untouched, and Builders which are modified get to
1879 keep their old event history.
1881 Basic Python syntax: comments start with a hash character (``#''),
1882 tuples are defined with @code{(parenthesis, pairs)}, arrays are
1883 defined with @code{[square, brackets]}, tuples and arrays are mostly
1884 interchangeable. Dictionaries (data structures which map ``keys'' to
1885 ``values'') are defined with curly braces: @code{@{'key1': 'value1',
1886 'key2': 'value2'@} }. Function calls (and object instantiation) can use
1887 named parameters, like @code{w = html.Waterfall(http_port=8010)}.
1889 The config file starts with a series of @code{import} statements,
1890 which make various kinds of Steps and Status targets available for
1891 later use. The main @code{BuildmasterConfig} dictionary is created,
1892 then it is populated with a variety of keys. These keys are broken
1893 roughly into the following sections, each of which is documented in
1894 the rest of this chapter:
1896 @itemize @bullet
1897 @item
1898 Project Definitions
1899 @item
1900 Change Sources / Schedulers
1901 @item
1902 Slaveport
1903 @item
1904 Buildslave Configuration
1905 @item
1906 Builders / Interlocks
1907 @item
1908 Status Targets
1909 @item
1910 Debug options
1911 @end itemize
1913 The config file can use a few names which are placed into its namespace:
1915 @table @code
1916 @item basedir
1917 the base directory for the buildmaster. This string has not been
1918 expanded, so it may start with a tilde. It needs to be expanded before
1919 use. The config file is located in
1920 @code{os.path.expanduser(os.path.join(basedir, 'master.cfg'))}
1922 @end table
1925 @node Loading the Config File, Defining the Project, Config File Format, Configuration
1926 @section Loading the Config File
1928 The config file is only read at specific points in time. It is first
1929 read when the buildmaster is launched. Once it is running, there are
1930 various ways to ask it to reload the config file. If you are on the
1931 system hosting the buildmaster, you can send a @code{SIGHUP} signal to
1932 it: the @command{buildbot} tool has a shortcut for this:
1934 @example
1935 buildbot reconfig @var{BASEDIR}
1936 @end example
1938 This command will show you all of the lines from @file{twistd.log}
1939 that relate to the reconfiguration. If there are any problems during
1940 the config-file reload, they will be displayed in these lines.
1942 The debug tool (@code{buildbot debugclient --master HOST:PORT}) has a
1943 ``Reload .cfg'' button which will also trigger a reload. In the
1944 future, there will be other ways to accomplish this step (probably a
1945 password-protected button on the web page, as well as a privileged IRC
1946 command).
1948 When reloading the config file, the buildmaster will endeavor to
1949 change as little as possible about the running system. For example,
1950 although old status targets may be shut down and new ones started up,
1951 any status targets that were not changed since the last time the
1952 config file was read will be left running and untouched. Likewise any
1953 Builders which have not been changed will be left running. If a
1954 Builder is modified (say, the build process is changed) while a Build
1955 is currently running, that Build will keep running with the old
1956 process until it completes. Any previously queued Builds (or Builds
1957 which get queued after the reconfig) will use the new process.
1959 @node Defining the Project, Listing Change Sources and Schedulers, Loading the Config File, Configuration
1960 @section Defining the Project
1962 There are a couple of basic settings that you use to tell the buildbot
1963 what project it is working on. This information is used by status
1964 reporters to let users find out more about the codebase being
1965 exercised by this particular Buildbot installation.
1967 @example
1968 c['projectName'] = "Buildbot"
1969 c['projectURL'] = "http://buildbot.sourceforge.net/"
1970 c['buildbotURL'] = "http://localhost:8010/"
1971 @end example
1973 @bcindex c['projectName']
1974 @code{projectName} is a short string will be used to describe the
1975 project that this buildbot is working on. For example, it is used as
1976 the title of the waterfall HTML page. 
1978 @bcindex c['projectURL']
1979 @code{projectURL} is a string that gives a URL for the project as a
1980 whole. HTML status displays will show @code{projectName} as a link to
1981 @code{projectURL}, to provide a link from buildbot HTML pages to your
1982 project's home page.
1984 @bcindex c['buildbotURL']
1985 The @code{buildbotURL} string should point to the location where the
1986 buildbot's internal web server (usually the @code{html.Waterfall}
1987 page) is visible. This typically uses the port number set when you
1988 create the @code{Waterfall} object: the buildbot needs your help to
1989 figure out a suitable externally-visible host name.
1991 When status notices are sent to users (either by email or over IRC),
1992 @code{buildbotURL} will be used to create a URL to the specific build
1993 or problem that they are being notified about. It will also be made
1994 available to queriers (over IRC) who want to find out where to get
1995 more information about this buildbot.
1998 @node Listing Change Sources and Schedulers, Setting the slaveport, Defining the Project, Configuration
1999 @section Listing Change Sources and Schedulers
2001 @bcindex c['sources']
2002 @bcindex c['change_source']
2004 The @code{c['change_source']} key is the ChangeSource
2005 instance@footnote{To be precise, it is an object or a list of objects
2006 which all implement the @code{buildbot.interfaces.IChangeSource}
2007 Interface. It is unusual to have multiple ChangeSources, so this key
2008 accepts either a single ChangeSource or a sequence of them.} that
2009 defines how the buildmaster learns about source code changes. More
2010 information about what goes here is available in @xref{Getting Source
2011 Code Changes}.
2013 @example
2014 from buildbot.changes.pb import PBChangeSource
2015 c['change_source'] = PBChangeSource()
2016 @end example
2018 (note: in buildbot-0.7.5 and earlier, this key was named
2019 @code{c['sources']}, and required a list. @code{c['sources']} is
2020 deprecated as of buildbot-0.7.6 and is scheduled to be removed in a
2021 future release).
2023 @bcindex c['schedulers']
2024 @code{c['schedulers']} is a list of Scheduler instances, each of which
2025 causes builds to be started on a particular set of Builders. The two
2026 basic Scheduler classes you are likely to start with are
2027 @code{Scheduler} and @code{Periodic}, but you can write a customized
2028 subclass to implement more complicated build scheduling.
2030 The docstring for @code{buildbot.scheduler.Scheduler} is the best
2031 place to see all the options that can be used. Type @code{pydoc
2032 buildbot.scheduler.Scheduler} to see it, or look in
2033 @file{buildbot/scheduler.py} directly.
2035 The basic Scheduler takes four arguments:
2037 @table @code
2038 @item name
2039 Each Scheduler must have a unique name. This is only used in status
2040 displays.
2042 @item branch
2043 This Scheduler will pay attention to a single branch, ignoring Changes
2044 that occur on other branches. Setting @code{branch} equal to the
2045 special value of @code{None} means it should only pay attention to the
2046 default branch. Note that @code{None} is a keyword, not a string, so
2047 you want to use @code{None} and not @code{"None"}.
2049 @item treeStableTimer
2050 The Scheduler will wait for this many seconds before starting the
2051 build. If new changes are made during this interval, the timer will be
2052 restarted, so really the build will be started after a change and then
2053 after this many seconds of inactivity.
2055 @item builderNames
2056 When the tree-stable-timer finally expires, builds will be started on
2057 these Builders. Each Builder gets a unique name: these strings must
2058 match.
2060 @end table
2062 @example
2063 from buildbot import scheduler
2064 quick = scheduler.Scheduler("quick", None, 60,
2065                             ["quick-linux", "quick-netbsd"])
2066 full = scheduler.Scheduler("full", None, 5*60,
2067                            ["full-linux", "full-netbsd", "full-OSX"])
2068 nightly = scheduler.Periodic("nightly", ["full-solaris"], 24*60*60)
2069 c['schedulers'] = [quick, full, nightly]
2070 @end example
2072 In this example, the two ``quick'' builds are triggered 60 seconds
2073 after the tree has been changed. The ``full'' builds do not run quite
2074 so quickly (they wait 5 minutes), so hopefully if the quick builds
2075 fail due to a missing file or really simple typo, the developer can
2076 discover and fix the problem before the full builds are started. Both
2077 Schedulers only pay attention to the default branch: any changes on
2078 other branches are ignored by these Schedulers. Each Scheduler
2079 triggers a different set of Builders, referenced by name.
2081 The third Scheduler in this example just runs the full solaris build
2082 once per day. (note that this Scheduler only lets you control the time
2083 between builds, not the absolute time-of-day of each Build, so this
2084 could easily wind up a ``daily'' or ``every afternoon'' scheduler
2085 depending upon when it was first activated).
2087 @menu
2088 * Scheduler Types::             
2089 * Build Dependencies::          
2090 @end menu
2092 @node Scheduler Types, Build Dependencies, Listing Change Sources and Schedulers, Listing Change Sources and Schedulers
2093 @subsection Scheduler Types
2095 @slindex buildbot.scheduler.Scheduler
2096 @slindex buildbot.scheduler.AnyBranchScheduler
2097 @slindex buildbot.scheduler.Periodic
2098 @slindex buildbot.scheduler.Nightly
2100 Here is a brief catalog of the available Scheduler types. All these
2101 Schedulers are classes in @code{buildbot.scheduler}, and the
2102 docstrings there are the best source of documentation on the arguments
2103 taken by each one.
2105 @table @code
2106 @item Scheduler
2107 This is the default Scheduler class. It follows exactly one branch,
2108 and starts a configurable tree-stable-timer after each change on that
2109 branch. When the timer expires, it starts a build on some set of
2110 Builders. The Scheduler accepts a @code{fileIsImportant} function
2111 which can be used to ignore some Changes if they do not affect any
2112 ``important'' files.
2114 @item AnyBranchScheduler
2115 This scheduler uses a tree-stable-timer like the default one, but
2116 follows multiple branches at once. Each branch gets a separate timer.
2118 @item Dependent
2119 This scheduler watches an ``upstream'' Scheduler. When all the
2120 Builders launched by that Scheduler successfully finish, the Dependent
2121 scheduler is triggered. The next section (@pxref{Build Dependencies})
2122 describes this scheduler in more detail.
2124 @item Periodic
2125 This simple scheduler just triggers a build every N seconds.
2127 @item Nightly
2128 This is highly configurable periodic build scheduler, which triggers a
2129 build at particular times of day, week, month, or year. The
2130 configuration syntax is very similar to the well-known @code{crontab}
2131 format, in which you provide values for minute, hour, day, and month
2132 (some of which can be wildcards), and a build is triggered whenever
2133 the current time matches the given constraints. This can run a build
2134 every night, every morning, every weekend, alternate Thursdays, on
2135 your boss's birthday, etc.
2137 @item Try_Jobdir / Try_Userpass
2138 This scheduler allows developers to use the @code{buildbot try}
2139 command to trigger builds of code they have not yet committed. See
2140 @ref{try} for complete details.
2142 @end table
2144 @node Build Dependencies,  , Scheduler Types, Listing Change Sources and Schedulers
2145 @subsection Build Dependencies
2147 @cindex Dependent
2148 @cindex Dependencies
2149 @slindex buildbot.scheduler.Dependent
2151 It is common to wind up with one kind of build which should only be
2152 performed if the same source code was successfully handled by some
2153 other kind of build first. An example might be a packaging step: you
2154 might only want to produce .deb or RPM packages from a tree that was
2155 known to compile successfully and pass all unit tests. You could put
2156 the packaging step in the same Build as the compile and testing steps,
2157 but there might be other reasons to not do this (in particular you
2158 might have several Builders worth of compiles/tests, but only wish to
2159 do the packaging once). Another example is if you want to skip the
2160 ``full'' builds after a failing ``quick'' build of the same source
2161 code. Or, if one Build creates a product (like a compiled library)
2162 that is used by some other Builder, you'd want to make sure the
2163 consuming Build is run @emph{after} the producing one.
2165 You can use @code{Dependencies} to express this relationship to the
2166 Buildbot. There is a special kind of Scheduler named
2167 @code{scheduler.Dependent} that will watch an ``upstream'' Scheduler
2168 for builds to complete successfully (on all of its Builders). Each
2169 time that happens, the same source code (i.e. the same
2170 @code{SourceStamp}) will be used to start a new set of builds, on a
2171 different set of Builders. This ``downstream'' scheduler doesn't pay
2172 attention to Changes at all, it only pays attention to the upstream
2173 scheduler.
2175 If the SourceStamp fails on any of the Builders in the upstream set,
2176 the downstream builds will not fire.
2178 @example
2179 from buildbot import scheduler
2180 tests = scheduler.Scheduler("tests", None, 5*60,
2181                             ["full-linux", "full-netbsd", "full-OSX"])
2182 package = scheduler.Dependent("package",
2183                               tests, # upstream scheduler
2184                               ["make-tarball", "make-deb", "make-rpm"])
2185 c['schedulers'] = [tests, package]
2186 @end example
2188 Note that @code{Dependent}'s upstream scheduler argument is given as a
2189 @code{Scheduler} @emph{instance}, not a name. This makes it impossible
2190 to create circular dependencies in the config file.
2193 @node Setting the slaveport, Buildslave Specifiers, Listing Change Sources and Schedulers, Configuration
2194 @section Setting the slaveport
2196 @bcindex c['slavePortnum']
2198 The buildmaster will listen on a TCP port of your choosing for
2199 connections from buildslaves. It can also use this port for
2200 connections from remote Change Sources, status clients, and debug
2201 tools. This port should be visible to the outside world, and you'll
2202 need to tell your buildslave admins about your choice.
2204 It does not matter which port you pick, as long it is externally
2205 visible, however you should probably use something larger than 1024,
2206 since most operating systems don't allow non-root processes to bind to
2207 low-numbered ports. If your buildmaster is behind a firewall or a NAT
2208 box of some sort, you may have to configure your firewall to permit
2209 inbound connections to this port.
2211 @example
2212 c['slavePortnum'] = 10000
2213 @end example
2215 @code{c['slavePortnum']} is a @emph{strports} specification string,
2216 defined in the @code{twisted.application.strports} module (try
2217 @command{pydoc twisted.application.strports} to get documentation on
2218 the format). This means that you can have the buildmaster listen on a
2219 localhost-only port by doing:
2221 @example
2222 c['slavePortnum'] = "tcp:10000:interface=127.0.0.1"
2223 @end example
2225 This might be useful if you only run buildslaves on the same machine,
2226 and they are all configured to contact the buildmaster at
2227 @code{localhost:10000}.
2230 @node Buildslave Specifiers, Defining Builders, Setting the slaveport, Configuration
2231 @section Buildslave Specifiers
2233 @bcindex c['slaves']
2235 The @code{c['slaves']} key is a list of known buildslaves. Each
2236 buildslave is defined by an instance of the BuildSlave class, created
2237 with two values: (slavename, slavepassword). These are the same two
2238 values that need to be provided to the buildslave administrator when
2239 they create the buildslave.
2241 @example
2242 from buildbot.slave import BuildSlave
2243 c['slaves'] = [BuildSlave('bot-solaris', 'solarispasswd'),
2244                BuildSlave('bot-bsd', 'bsdpasswd'),
2245               ]
2246 @end example
2248 The slavenames must be unique, of course. The password exists to
2249 prevent evildoers from interfering with the buildbot by inserting
2250 their own (broken) buildslaves into the system and thus displacing the
2251 real ones.
2253 Buildslaves with an unrecognized slavename or a non-matching password
2254 will be rejected when they attempt to connect, and a message
2255 describing the problem will be put in the log file (see @ref{Logfiles}).
2257 Historical note: in buildbot-0.7.5 and earlier, the @code{c['bots']}
2258 key was used instead, and it took a list of (name, password) tuples.
2259 This key is accepted for backwards compatibility, but is deprecated as
2260 of 0.7.6 and will go away in some future release.
2263 @node Defining Builders, Defining Status Targets, Buildslave Specifiers, Configuration
2264 @section Defining Builders
2266 @bcindex c['builders']
2268 The @code{c['builders']} key is a list of dictionaries which specify
2269 the Builders. The Buildmaster runs a collection of Builders, each of
2270 which handles a single type of build (e.g. full versus quick), on a
2271 single build slave. A Buildbot which makes sure that the latest code
2272 (``HEAD'') compiles correctly across four separate architecture will
2273 have four Builders, each performing the same build but on different
2274 slaves (one per platform).
2276 Each Builder gets a separate column in the waterfall display. In
2277 general, each Builder runs independently (although various kinds of
2278 interlocks can cause one Builder to have an effect on another).
2280 Each Builder specification dictionary has several required keys:
2282 @table @code
2283 @item name
2284 This specifies the Builder's name, which is used in status
2285 reports.
2287 @item slavename
2288 This specifies which buildslave will be used by this Builder.
2289 @code{slavename} must appear in the @code{c['slaves']} list. Each
2290 buildslave can accomodate multiple Builders.
2292 @item slavenames
2293 If you provide @code{slavenames} instead of @code{slavename}, you can
2294 give a list of buildslaves which are capable of running this Builder.
2295 If multiple buildslaves are available for any given Builder, you will
2296 have some measure of redundancy: in case one slave goes offline, the
2297 others can still keep the Builder working. In addition, multiple
2298 buildslaves will allow multiple simultaneous builds for the same
2299 Builder, which might be useful if you have a lot of forced or ``try''
2300 builds taking place.
2302 If you use this feature, it is important to make sure that the
2303 buildslaves are all, in fact, capable of running the given build. The
2304 slave hosts should be configured similarly, otherwise you will spend a
2305 lot of time trying (unsuccessfully) to reproduce a failure that only
2306 occurs on some of the buildslaves and not the others. Different
2307 platforms, operating systems, versions of major programs or libraries,
2308 all these things mean you should use separate Builders.
2310 @item builddir
2311 This specifies the name of a subdirectory (under the base directory)
2312 in which everything related to this builder will be placed. On the
2313 buildmaster, this holds build status information. On the buildslave,
2314 this is where checkouts, compiles, and tests are run.
2316 @item factory
2317 This is a @code{buildbot.process.factory.BuildFactory} instance which
2318 controls how the build is performed. Full details appear in their own
2319 chapter, @xref{Build Process}. Parameters like the location of the CVS
2320 repository and the compile-time options used for the build are
2321 generally provided as arguments to the factory's constructor.
2323 @end table
2325 Other optional keys may be set on each Builder:
2327 @table @code
2329 @item category
2330 If provided, this is a string that identifies a category for the
2331 builder to be a part of. Status clients can limit themselves to a
2332 subset of the available categories. A common use for this is to add
2333 new builders to your setup (for a new module, or for a new buildslave)
2334 that do not work correctly yet and allow you to integrate them with
2335 the active builders. You can put these new builders in a test
2336 category, make your main status clients ignore them, and have only
2337 private status clients pick them up. As soon as they work, you can
2338 move them over to the active category.
2340 @end table
2343 @node Defining Status Targets, Debug options, Defining Builders, Configuration
2344 @section Defining Status Targets
2346 The Buildmaster has a variety of ways to present build status to
2347 various users. Each such delivery method is a ``Status Target'' object
2348 in the configuration's @code{status} list. To add status targets, you
2349 just append more objects to this list:
2351 @bcindex c['status']
2353 @example
2354 c['status'] = []
2356 from buildbot.status import html
2357 c['status'].append(html.Waterfall(http_port=8010))
2359 from buildbot.status import mail
2360 m = mail.MailNotifier(fromaddr="buildbot@@localhost",
2361                       extraRecipients=["builds@@lists.example.com"],
2362                       sendToInterestedUsers=False)
2363 c['status'].append(m)
2365 from buildbot.status import words
2366 c['status'].append(words.IRC(host="irc.example.com", nick="bb",
2367                              channels=["#example"]))
2368 @end example
2370 Status delivery has its own chapter, @xref{Status Delivery}, in which
2371 all the built-in status targets are documented.
2374 @node Debug options,  , Defining Status Targets, Configuration
2375 @section Debug options
2378 @bcindex c['debugPassword']
2379 If you set @code{c['debugPassword']}, then you can connect to the
2380 buildmaster with the diagnostic tool launched by @code{buildbot
2381 debugclient MASTER:PORT}. From this tool, you can reload the config
2382 file, manually force builds, and inject changes, which may be useful
2383 for testing your buildmaster without actually commiting changes to
2384 your repository (or before you have the Change Sources set up). The
2385 debug tool uses the same port number as the slaves do:
2386 @code{c['slavePortnum']}, and is authenticated with this password.
2388 @example
2389 c['debugPassword'] = "debugpassword"
2390 @end example
2392 @bcindex c['manhole']
2393 If you set @code{c['manhole']} to an instance of one of the classes in
2394 @code{buildbot.manhole}, you can telnet or ssh into the buildmaster
2395 and get an interactive Python shell, which may be useful for debugging
2396 buildbot internals. It is probably only useful for buildbot
2397 developers. It exposes full access to the buildmaster's account
2398 (including the ability to modify and delete files), so it should not
2399 be enabled with a weak or easily guessable password.
2401 There are three separate @code{Manhole} classes. Two of them use SSH,
2402 one uses unencrypted telnet. Two of them use a username+password
2403 combination to grant access, one of them uses an SSH-style
2404 @file{authorized_keys} file which contains a list of ssh public keys.
2406 @table @code
2407 @item manhole.AuthorizedKeysManhole
2408 You construct this with the name of a file that contains one SSH
2409 public key per line, just like @file{~/.ssh/authorized_keys}. If you
2410 provide a non-absolute filename, it will be interpreted relative to
2411 the buildmaster's base directory.
2413 @item manhole.PasswordManhole
2414 This one accepts SSH connections but asks for a username and password
2415 when authenticating. It accepts only one such pair.
2418 @item manhole.TelnetManhole
2419 This accepts regular unencrypted telnet connections, and asks for a
2420 username/password pair before providing access. Because this
2421 username/password is transmitted in the clear, and because Manhole
2422 access to the buildmaster is equivalent to granting full shell
2423 privileges to both the buildmaster and all the buildslaves (and to all
2424 accounts which then run code produced by the buildslaves), it is
2425 highly recommended that you use one of the SSH manholes instead.
2427 @end table
2429 @example
2430 # some examples:
2431 from buildbot import manhole
2432 c['manhole'] = manhole.AuthorizedKeysManhole(1234, "authorized_keys")
2433 c['manhole'] = manhole.PasswordManhole(1234, "alice", "mysecretpassword")
2434 c['manhole'] = manhole.TelnetManhole(1234, "bob", "snoop_my_password_please")
2435 @end example
2437 The @code{Manhole} instance can be configured to listen on a specific
2438 port. You may wish to have this listening port bind to the loopback
2439 interface (sometimes known as ``lo0'', ``localhost'', or 127.0.0.1) to
2440 restrict access to clients which are running on the same host.
2442 @example
2443 from buildbot.manhole import PasswordManhole
2444 c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")
2445 @end example
2447 To have the @code{Manhole} listen on all interfaces, use
2448 @code{"tcp:9999"} or simply 9999. This port specification uses
2449 @code{twisted.application.strports}, so you can make it listen on SSL
2450 or even UNIX-domain sockets if you want.
2452 Note that using any Manhole requires that the TwistedConch package be
2453 installed, and that you be using Twisted version 2.0 or later.
2455 The buildmaster's SSH server will use a different host key than the
2456 normal sshd running on a typical unix host. This will cause the ssh
2457 client to complain about a ``host key mismatch'', because it does not
2458 realize there are two separate servers running on the same host. To
2459 avoid this, use a clause like the following in your @file{.ssh/config}
2460 file:
2462 @example
2463 Host remotehost-buildbot
2464  HostName remotehost
2465  HostKeyAlias remotehost-buildbot
2466  Port 9999
2467  # use 'user' if you use PasswordManhole and your name is not 'admin'.
2468  # if you use AuthorizedKeysManhole, this probably doesn't matter.
2469  User admin
2470 @end example
2473 @node Getting Source Code Changes, Build Process, Configuration, Top
2474 @chapter Getting Source Code Changes
2476 The most common way to use the Buildbot is centered around the idea of
2477 @code{Source Trees}: a directory tree filled with source code of some form
2478 which can be compiled and/or tested. Some projects use languages that don't
2479 involve any compilation step: nevertheless there may be a @code{build} phase
2480 where files are copied or rearranged into a form that is suitable for
2481 installation. Some projects do not have unit tests, and the Buildbot is
2482 merely helping to make sure that the sources can compile correctly. But in
2483 all of these cases, the thing-being-tested is a single source tree.
2485 A Version Control System mantains a source tree, and tells the
2486 buildmaster when it changes. The first step of each Build is typically
2487 to acquire a copy of some version of this tree.
2489 This chapter describes how the Buildbot learns about what Changes have
2490 occurred. For more information on VC systems and Changes, see
2491 @ref{Version Control Systems}.
2494 @menu
2495 * Change Sources::              
2496 * Choosing ChangeSources::      
2497 * CVSToys - PBService::         
2498 * Mail-parsing ChangeSources::  
2499 * PBChangeSource::              
2500 * P4Source::                    
2501 * BonsaiPoller::                
2502 * SVNPoller::                   
2503 * MercurialHook::               
2504 @end menu
2508 @node Change Sources, Choosing ChangeSources, Getting Source Code Changes, Getting Source Code Changes
2509 @section Change Sources
2511 @c TODO: rework this, the one-buildmaster-one-tree thing isn't quite
2512 @c so narrow-minded anymore
2514 Each Buildmaster watches a single source tree. Changes can be provided
2515 by a variety of ChangeSource types, however any given project will
2516 typically have only a single ChangeSource active. This section
2517 provides a description of all available ChangeSource types and
2518 explains how to set up each of them.
2520 There are a variety of ChangeSources available, some of which are
2521 meant to be used in conjunction with other tools to deliver Change
2522 events from the VC repository to the buildmaster.
2524 @itemize @bullet
2526 @item CVSToys
2527 This ChangeSource opens a TCP connection from the buildmaster to a
2528 waiting FreshCVS daemon that lives on the repository machine, and
2529 subscribes to hear about Changes.
2531 @item MaildirSource
2532 This one watches a local maildir-format inbox for email sent out by
2533 the repository when a change is made. When a message arrives, it is
2534 parsed to create the Change object. A variety of parsing functions are
2535 available to accomodate different email-sending tools.
2537 @item PBChangeSource
2538 This ChangeSource listens on a local TCP socket for inbound
2539 connections from a separate tool. Usually, this tool would be run on
2540 the VC repository machine in a commit hook. It is expected to connect
2541 to the TCP socket and send a Change message over the network
2542 connection. The @command{buildbot sendchange} command is one example
2543 of a tool that knows how to send these messages, so you can write a
2544 commit script for your VC system that calls it to deliver the Change.
2545 There are other tools in the contrib/ directory that use the same
2546 protocol.
2548 @end itemize
2550 As a quick guide, here is a list of VC systems and the ChangeSources
2551 that might be useful with them. All of these ChangeSources are in the
2552 @code{buildbot.changes} module.
2554 @table @code
2555 @item CVS
2557 @itemize @bullet
2558 @item freshcvs.FreshCVSSource (connected via TCP to the freshcvs daemon)
2559 @item mail.FCMaildirSource (watching for email sent by a freshcvs daemon)
2560 @item mail.BonsaiMaildirSource (watching for email sent by Bonsai)
2561 @item mail.SyncmailMaildirSource (watching for email sent by syncmail)
2562 @item pb.PBChangeSource (listening for connections from @code{buildbot
2563 sendchange} run in a loginfo script)
2564 @item pb.PBChangeSource (listening for connections from a long-running
2565 @code{contrib/viewcvspoll.py} polling process which examines the ViewCVS
2566 database directly
2567 @end itemize
2569 @item SVN
2570 @itemize @bullet
2571 @item pb.PBChangeSource (listening for connections from
2572 @code{contrib/svn_buildbot.py} run in a postcommit script)
2573 @item pb.PBChangeSource (listening for connections from a long-running
2574 @code{contrib/svn_watcher.py} or @code{contrib/svnpoller.py} polling
2575 process
2576 @item mail.SVNCommitEmailMaildirSource (watching for email sent by commit-email.pl)
2577 @item svnpoller.SVNPoller (polling the SVN repository)
2578 @end itemize
2580 @item Darcs
2581 @itemize @bullet
2582 @item pb.PBChangeSource (listening for connections from
2583 @code{contrib/darcs_buildbot.py} in a commit script
2584 @end itemize
2586 @item Mercurial
2587 @itemize @bullet
2588 @item pb.PBChangeSource (listening for connections from
2589 @code{contrib/hg_buildbot.py} run in an 'incoming' hook)
2590 @item pb.PBChangeSource (listening for connections from
2591 @code{buildbot/changes/hgbuildbot.py} run as an in-process 'changegroup'
2592 hook)
2593 @end itemize
2595 @item Arch/Bazaar
2596 @itemize @bullet
2597 @item pb.PBChangeSource (listening for connections from
2598 @code{contrib/arch_buildbot.py} run in a commit hook)
2599 @end itemize
2601 @end table
2603 All VC systems can be driven by a PBChangeSource and the
2604 @code{buildbot sendchange} tool run from some form of commit script.
2605 If you write an email parsing function, they can also all be driven by
2606 a suitable @code{MaildirSource}.
2609 @node Choosing ChangeSources, CVSToys - PBService, Change Sources, Getting Source Code Changes
2610 @section Choosing ChangeSources
2612 The @code{master.cfg} configuration file has a dictionary key named
2613 @code{BuildmasterConfig['change_source']}, which holds the active
2614 @code{IChangeSource} object. The config file will typically create an
2615 object from one of the classes described below and stuff it into this
2616 key.
2618 Each buildmaster typically has just a single ChangeSource, since it is
2619 only watching a single source tree. But if, for some reason, you need
2620 multiple sources, just set @code{c['change_source']} to a list of
2621 ChangeSources.. it will accept that too.
2623 @example
2624 s = FreshCVSSourceNewcred(host="host", port=4519,
2625                           user="alice", passwd="secret",
2626                           prefix="Twisted")
2627 BuildmasterConfig['change_source'] = [s]
2628 @end example
2630 Each source tree has a nominal @code{top}. Each Change has a list of
2631 filenames, which are all relative to this top location. The
2632 ChangeSource is responsible for doing whatever is necessary to
2633 accomplish this. Most sources have a @code{prefix} argument: a partial
2634 pathname which is stripped from the front of all filenames provided to
2635 that @code{ChangeSource}. Files which are outside this sub-tree are
2636 ignored by the changesource: it does not generate Changes for those
2637 files.
2640 @node CVSToys - PBService, Mail-parsing ChangeSources, Choosing ChangeSources, Getting Source Code Changes
2641 @section CVSToys - PBService
2643 @csindex buildbot.changes.freshcvs.FreshCVSSource
2645 The @uref{http://purl.net/net/CVSToys, CVSToys} package provides a
2646 server which runs on the machine that hosts the CVS repository it
2647 watches. It has a variety of ways to distribute commit notifications,
2648 and offers a flexible regexp-based way to filter out uninteresting
2649 changes. One of the notification options is named @code{PBService} and
2650 works by listening on a TCP port for clients. These clients subscribe
2651 to hear about commit notifications.
2653 The buildmaster has a CVSToys-compatible @code{PBService} client built
2654 in. There are two versions of it, one for old versions of CVSToys
2655 (1.0.9 and earlier) which used the @code{oldcred} authentication
2656 framework, and one for newer versions (1.0.10 and later) which use
2657 @code{newcred}. Both are classes in the
2658 @code{buildbot.changes.freshcvs} package.
2660 @code{FreshCVSSourceNewcred} objects are created with the following
2661 parameters:
2663 @table @samp
2665 @item @code{host} and @code{port}
2666 these specify where the CVSToys server can be reached
2668 @item @code{user} and @code{passwd}
2669 these specify the login information for the CVSToys server
2670 (@code{freshcvs}). These must match the server's values, which are
2671 defined in the @code{freshCfg} configuration file (which lives in the
2672 CVSROOT directory of the repository).
2674 @item @code{prefix}
2675 this is the prefix to be found and stripped from filenames delivered
2676 by the CVSToys server. Most projects live in sub-directories of the
2677 main repository, as siblings of the CVSROOT sub-directory, so
2678 typically this prefix is set to that top sub-directory name.
2680 @end table
2682 @heading Example
2684 To set up the freshCVS server, add a statement like the following to
2685 your @file{freshCfg} file:
2687 @example
2688 pb = ConfigurationSet([
2689     (None, None, None, PBService(userpass=('foo', 'bar'), port=4519)),
2690     ])
2691 @end example
2693 This will announce all changes to a client which connects to port 4519
2694 using a username of 'foo' and a password of 'bar'.
2696 Then add a clause like this to your buildmaster's @file{master.cfg}:
2698 @example
2699 BuildmasterConfig['change_source'] = FreshCVSSource("cvs.example.com", 4519,
2700                                                     "foo", "bar",
2701                                                     prefix="glib/")
2702 @end example
2704 where "cvs.example.com" is the host that is running the FreshCVS daemon, and
2705 "glib" is the top-level directory (relative to the repository's root) where
2706 all your source code lives. Most projects keep one or more projects in the
2707 same repository (along with CVSROOT/ to hold admin files like loginfo and
2708 freshCfg); the prefix= argument tells the buildmaster to ignore everything
2709 outside that directory, and to strip that common prefix from all pathnames
2710 it handles.
2713 @node Mail-parsing ChangeSources, PBChangeSource, CVSToys - PBService, Getting Source Code Changes
2714 @section Mail-parsing ChangeSources
2716 Many projects publish information about changes to their source tree
2717 by sending an email message out to a mailing list, frequently named
2718 PROJECT-commits or PROJECT-changes. Each message usually contains a
2719 description of the change (who made the change, which files were
2720 affected) and sometimes a copy of the diff. Humans can subscribe to
2721 this list to stay informed about what's happening to the source tree.
2723 The Buildbot can also be subscribed to a -commits mailing list, and
2724 can trigger builds in response to Changes that it hears about. The
2725 buildmaster admin needs to arrange for these email messages to arrive
2726 in a place where the buildmaster can find them, and configure the
2727 buildmaster to parse the messages correctly. Once that is in place,
2728 the email parser will create Change objects and deliver them to the
2729 Schedulers (see @pxref{Scheduler Types}) just like any other
2730 ChangeSource.
2732 There are two components to setting up an email-based ChangeSource.
2733 The first is to route the email messages to the buildmaster, which is
2734 done by dropping them into a ``maildir''. The second is to actually
2735 parse the messages, which is highly dependent upon the tool that was
2736 used to create them. Each VC system has a collection of favorite
2737 change-emailing tools, and each has a slightly different format, so
2738 each has a different parsing function. There is a separate
2739 ChangeSource variant for each parsing function.
2741 Once you've chosen a maildir location and a parsing function, create
2742 the change source and put it in @code{c['change_source']}:
2744 @example
2745 from buildbot.changes.mail import SyncmailMaildirSource
2746 c['change_source'] = SyncmailMaildirSource("~/maildir-buildbot",
2747                                            prefix="/trunk/")
2748 @end example
2750 @menu
2751 * Subscribing the Buildmaster::  
2752 * Using Maildirs::              
2753 * Parsing Email Change Messages::  
2754 @end menu
2756 @node Subscribing the Buildmaster, Using Maildirs, Mail-parsing ChangeSources, Mail-parsing ChangeSources
2757 @subsection Subscribing the Buildmaster
2759 The recommended way to install the buildbot is to create a dedicated
2760 account for the buildmaster. If you do this, the account will probably
2761 have a distinct email address (perhaps
2762 @email{buildmaster@@example.org}). Then just arrange for this
2763 account's email to be delivered to a suitable maildir (described in
2764 the next section).
2766 If the buildbot does not have its own account, ``extension addresses''
2767 can be used to distinguish between email intended for the buildmaster
2768 and email intended for the rest of the account. In most modern MTAs,
2769 the e.g. @code{foo@@example.org} account has control over every email
2770 address at example.org which begins with "foo", such that email
2771 addressed to @email{account-foo@@example.org} can be delivered to a
2772 different destination than @email{account-bar@@example.org}. qmail
2773 does this by using separate .qmail files for the two destinations
2774 (@file{.qmail-foo} and @file{.qmail-bar}, with @file{.qmail}
2775 controlling the base address and @file{.qmail-default} controlling all
2776 other extensions). Other MTAs have similar mechanisms.
2778 Thus you can assign an extension address like
2779 @email{foo-buildmaster@@example.org} to the buildmaster, and retain
2780 @email{foo@@example.org} for your own use.
2783 @node Using Maildirs, Parsing Email Change Messages, Subscribing the Buildmaster, Mail-parsing ChangeSources
2784 @subsection Using Maildirs
2786 A ``maildir'' is a simple directory structure originally developed for
2787 qmail that allows safe atomic update without locking. Create a base
2788 directory with three subdirectories: ``new'', ``tmp'', and ``cur''.
2789 When messages arrive, they are put into a uniquely-named file (using
2790 pids, timestamps, and random numbers) in ``tmp''. When the file is
2791 complete, it is atomically renamed into ``new''. Eventually the
2792 buildmaster notices the file in ``new'', reads and parses the
2793 contents, then moves it into ``cur''. A cronjob can be used to delete
2794 files in ``cur'' at leisure.
2796 Maildirs are frequently created with the @command{maildirmake} tool,
2797 but a simple @command{mkdir -p ~/MAILDIR/@{cur,new,tmp@}} is pretty much
2798 equivalent.
2800 Many modern MTAs can deliver directly to maildirs. The usual .forward
2801 or .procmailrc syntax is to name the base directory with a trailing
2802 slash, so something like @code{~/MAILDIR/} . qmail and postfix are
2803 maildir-capable MTAs, and procmail is a maildir-capable MDA (Mail
2804 Delivery Agent).
2806 For MTAs which cannot put files into maildirs directly, the
2807 ``safecat'' tool can be executed from a .forward file to accomplish
2808 the same thing.
2810 The Buildmaster uses the linux DNotify facility to receive immediate
2811 notification when the maildir's ``new'' directory has changed. When
2812 this facility is not available, it polls the directory for new
2813 messages, every 10 seconds by default.
2815 @node Parsing Email Change Messages,  , Using Maildirs, Mail-parsing ChangeSources
2816 @subsection Parsing Email Change Messages
2818 The second component to setting up an email-based ChangeSource is to
2819 parse the actual notices. This is highly dependent upon the VC system
2820 and commit script in use.
2822 A couple of common tools used to create these change emails are:
2824 @table @samp
2826 @item CVS
2827 @table @samp
2828 @item CVSToys MailNotifier
2829 @ref{FCMaildirSource}
2830 @item Bonsai notification
2831 @ref{BonsaiMaildirSource}
2832 @item syncmail
2833 @ref{SyncmailMaildirSource}
2834 @end table
2836 @item SVN
2837 @table @samp
2838 @item svnmailer
2839 http://opensource.perlig.de/en/svnmailer/
2840 @item commit-email.pl
2841 @ref{SVNCommitEmailMaildirSource}
2842 @end table
2844 @item Mercurial
2845 @table @samp
2846 @item NotifyExtension
2847 http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtension
2848 @end table
2850 @end table
2853 The following sections describe the parsers available for each of
2854 these tools.
2856 Most of these parsers accept a @code{prefix=} argument, which is used
2857 to limit the set of files that the buildmaster pays attention to. This
2858 is most useful for systems like CVS and SVN which put multiple
2859 projects in a single repository (or use repository names to indicate
2860 branches). Each filename that appears in the email is tested against
2861 the prefix: if the filename does not start with the prefix, the file
2862 is ignored. If the filename @emph{does} start with the prefix, that
2863 prefix is stripped from the filename before any further processing is
2864 done. Thus the prefix usually ends with a slash.
2866 @menu
2867 * FCMaildirSource::             
2868 * SyncmailMaildirSource::       
2869 * BonsaiMaildirSource::         
2870 * SVNCommitEmailMaildirSource::  
2871 @end menu
2873 @node FCMaildirSource, SyncmailMaildirSource, Parsing Email Change Messages, Parsing Email Change Messages
2874 @subsubsection FCMaildirSource
2877 @csindex buildbot.changes.mail.FCMaildirSource
2879 http://twistedmatrix.com/users/acapnotic/wares/code/CVSToys/
2881 This parser works with the CVSToys @code{MailNotification} action,
2882 which will send email to a list of recipients for each commit. This
2883 tends to work better than using @code{/bin/mail} from within the
2884 CVSROOT/loginfo file directly, as CVSToys will batch together all
2885 files changed during the same CVS invocation, and can provide more
2886 information (like creating a ViewCVS URL for each file changed).
2888 The Buildbot's @code{FCMaildirSource} knows for to parse these CVSToys
2889 messages and turn them into Change objects. It can be given two
2890 parameters: the directory name of the maildir root, and the prefix to
2891 strip.
2893 @example
2894 from buildbot.changes.mail import FCMaildirSource
2895 c['change_source'] = FCMaildirSource("~/maildir-buildbot")
2896 @end example
2898 @node SyncmailMaildirSource, BonsaiMaildirSource, FCMaildirSource, Parsing Email Change Messages
2899 @subsubsection SyncmailMaildirSource
2901 @csindex buildbot.changes.mail.SyncmailMaildirSource
2903 http://sourceforge.net/projects/cvs-syncmail
2905 @code{SyncmailMaildirSource} knows how to parse the message format used by
2906 the CVS ``syncmail'' script.
2908 @example
2909 from buildbot.changes.mail import SyncmailMaildirSource
2910 c['change_source'] = SyncmailMaildirSource("~/maildir-buildbot")
2911 @end example
2913 @node BonsaiMaildirSource, SVNCommitEmailMaildirSource, SyncmailMaildirSource, Parsing Email Change Messages
2914 @subsubsection BonsaiMaildirSource
2916 @csindex buildbot.changes.mail.BonsaiMaildirSource
2918 http://www.mozilla.org/bonsai.html
2920 @code{BonsaiMaildirSource} parses messages sent out by Bonsai, the CVS
2921 tree-management system built by Mozilla.
2923 @example
2924 from buildbot.changes.mail import BonsaiMaildirSource
2925 c['change_source'] = BonsaiMaildirSource("~/maildir-buildbot")
2926 @end example
2928 @node SVNCommitEmailMaildirSource,  , BonsaiMaildirSource, Parsing Email Change Messages
2929 @subsubsection SVNCommitEmailMaildirSource
2931 @csindex buildbot.changes.mail.SVNCommitEmailMaildirSource
2933 @code{SVNCommitEmailMaildirSource} parses message sent out by the
2934 @code{commit-email.pl} script, which is included in the Subversion
2935 distribution.
2937 It does not currently handle branches: all of the Change objects that
2938 it creates will be associated with the default (i.e. trunk) branch.
2940 @example
2941 from buildbot.changes.mail import SVNCommitEmailMaildirSource
2942 c['change_source'] = SVNCommitEmailMaildirSource("~/maildir-buildbot")
2943 @end example
2946 @node PBChangeSource, P4Source, Mail-parsing ChangeSources, Getting Source Code Changes
2947 @section PBChangeSource
2949 @csindex buildbot.changes.pb.PBChangeSource
2951 The last kind of ChangeSource actually listens on a TCP port for
2952 clients to connect and push change notices @emph{into} the
2953 Buildmaster. This is used by the built-in @code{buildbot sendchange}
2954 notification tool, as well as the VC-specific
2955 @file{contrib/svn_buildbot.py}, @file{contrib/arch_buildbot.py},
2956 @file{contrib/hg_buildbot.py} tools, and the
2957 @code{buildbot.changes.hgbuildbot} hook. These tools are run by the
2958 repository (in a commit hook script), and connect to the buildmaster
2959 directly each time a file is comitted. This is also useful for
2960 creating new kinds of change sources that work on a @code{push} model
2961 instead of some kind of subscription scheme, for example a script
2962 which is run out of an email .forward file.
2964 This ChangeSource can be configured to listen on its own TCP port, or
2965 it can share the port that the buildmaster is already using for the
2966 buildslaves to connect. (This is possible because the
2967 @code{PBChangeSource} uses the same protocol as the buildslaves, and
2968 they can be distinguished by the @code{username} attribute used when
2969 the initial connection is established). It might be useful to have it
2970 listen on a different port if, for example, you wanted to establish
2971 different firewall rules for that port. You could allow only the SVN
2972 repository machine access to the @code{PBChangeSource} port, while
2973 allowing only the buildslave machines access to the slave port. Or you
2974 could just expose one port and run everything over it. @emph{Note:
2975 this feature is not yet implemented, the PBChangeSource will always
2976 share the slave port and will always have a @code{user} name of
2977 @code{change}, and a passwd of @code{changepw}. These limitations will
2978 be removed in the future.}.
2981 The @code{PBChangeSource} is created with the following arguments. All
2982 are optional.
2984 @table @samp
2985 @item @code{port}
2986 which port to listen on. If @code{None} (which is the default), it
2987 shares the port used for buildslave connections. @emph{Not
2988 Implemented, always set to @code{None}}.
2990 @item @code{user} and @code{passwd}
2991 The user/passwd account information that the client program must use
2992 to connect. Defaults to @code{change} and @code{changepw}. @emph{Not
2993 Implemented, @code{user} is currently always set to @code{change},
2994 @code{passwd} is always set to @code{changepw}}.
2996 @item @code{prefix}
2997 The prefix to be found and stripped from filenames delivered over the
2998 connection. Any filenames which do not start with this prefix will be
2999 removed. If all the filenames in a given Change are removed, the that
3000 whole Change will be dropped. This string should probably end with a
3001 directory separator.
3003 This is useful for changes coming from version control systems that
3004 represent branches as parent directories within the repository (like
3005 SVN and Perforce). Use a prefix of 'trunk/' or
3006 'project/branches/foobranch/' to only follow one branch and to get
3007 correct tree-relative filenames. Without a prefix, the PBChangeSource
3008 will probably deliver Changes with filenames like @file{trunk/foo.c}
3009 instead of just @file{foo.c}. Of course this also depends upon the
3010 tool sending the Changes in (like @command{buildbot sendchange}) and
3011 what filenames it is delivering: that tool may be filtering and
3012 stripping prefixes at the sending end.
3014 @end table
3016 @node P4Source, BonsaiPoller, PBChangeSource, Getting Source Code Changes
3017 @section P4Source
3019 @csindex buildbot.changes.p4poller.P4Source
3021 The @code{P4Source} periodically polls a @uref{http://www.perforce.com/,
3022 Perforce} depot for changes. It accepts the following arguments:
3024 @table @samp
3025 @item @code{p4base}
3026 The base depot path to watch, without the trailing '/...'.
3028 @item @code{p4port}
3029 The Perforce server to connect to (as host:port).
3031 @item @code{p4user}
3032 The Perforce user.
3034 @item @code{p4passwd}
3035 The Perforce password.
3037 @item @code{split_file}
3038 A function that maps a pathname, without the leading @code{p4base}, to a
3039 (branch, filename) tuple. The default just returns (None, branchfile),
3040 which effectively disables branch support. You should supply a function
3041 which understands your repository structure.
3043 @item @code{pollinterval}
3044 How often to poll, in seconds. Defaults to 600 (10 minutes).
3046 @item @code{histmax}
3047 The maximum number of changes to inspect at a time. If more than this
3048 number occur since the last poll, older changes will be silently
3049 ignored.
3050 @end table
3052 @heading Example
3054 This configuration uses the @code{P4PORT}, @code{P4USER}, and @code{P4PASSWD}
3055 specified in the buildmaster's environment. It watches a project in which the
3056 branch name is simply the next path component, and the file is all path
3057 components after.
3059 @example
3060 import buildbot.changes.p4poller
3061 s = p4poller.P4Source(p4base='//depot/project/',
3062                       split_file=lambda branchfile: branchfile.split('/',1),
3063                      )
3064 c['change_source'] = s
3065 @end example
3067 @node BonsaiPoller, SVNPoller, P4Source, Getting Source Code Changes
3068 @section BonsaiPoller
3070 @csindex buildbot.changes.bonsaipoller.BonsaiPoller
3072 The @code{BonsaiPoller} periodically polls a Bonsai server. This is a
3073 CGI script accessed through a web server that provides information
3074 about a CVS tree, for example the Mozilla bonsai server at
3075 @uref{http://bonsai.mozilla.org}. Bonsai servers are usable by both
3076 humans and machines. In this case, the buildbot's change source forms
3077 a query which asks about any files in the specified branch which have
3078 changed since the last query.
3080 Please take a look at the BonsaiPoller docstring for details about the
3081 arguments it accepts.
3084 @node SVNPoller, MercurialHook, BonsaiPoller, Getting Source Code Changes
3085 @section SVNPoller
3087 @csindex buildbot.changes.svnpoller.SVNPoller
3089 The @code{buildbot.changes.svnpoller.SVNPoller} is a ChangeSource
3090 which periodically polls a @uref{http://subversion.tigris.org/,
3091 Subversion} repository for new revisions, by running the @code{svn
3092 log} command in a subshell. It can watch a single branch or multiple
3093 branches.
3095 @code{SVNPoller} accepts the following arguments:
3097 @table @code
3098 @item svnurl
3099 The base URL path to watch, like
3100 @code{svn://svn.twistedmatrix.com/svn/Twisted/trunk}, or
3101 @code{http://divmod.org/svn/Divmod/}, or even
3102 @code{file:///home/svn/Repository/ProjectA/branches/1.5/}. This must
3103 include the access scheme, the location of the repository (both the
3104 hostname for remote ones, and any additional directory names necessary
3105 to get to the repository), and the sub-path within the repository's
3106 virtual filesystem for the project and branch of interest.
3108 The @code{SVNPoller} will only pay attention to files inside the
3109 subdirectory specified by the complete svnurl.
3111 @item split_file
3112 A function to convert pathnames into (branch, relative_pathname)
3113 tuples. Use this to explain your repository's branch-naming policy to
3114 @code{SVNPoller}. This function must accept a single string and return
3115 a two-entry tuple. There are a few utility functions in
3116 @code{buildbot.changes.svnpoller} that can be used as a
3117 @code{split_file} function, see below for details.
3119 The default value always returns (None, path), which indicates that
3120 all files are on the trunk.
3122 Subclasses of @code{SVNPoller} can override the @code{split_file}
3123 method instead of using the @code{split_file=} argument.
3125 @item svnuser
3126 An optional string parameter. If set, the @code{--user} argument will
3127 be added to all @code{svn} commands. Use this if you have to
3128 authenticate to the svn server before you can do @code{svn info} or
3129 @code{svn log} commands.
3131 @item svnpasswd
3132 Like @code{svnuser}, this will cause a @code{--password} argument to
3133 be passed to all svn commands.
3135 @item pollinterval
3136 How often to poll, in seconds. Defaults to 600 (checking once every 10
3137 minutes). Lower this if you want the buildbot to notice changes
3138 faster, raise it if you want to reduce the network and CPU load on
3139 your svn server. Please be considerate of public SVN repositories by
3140 using a large interval when polling them.
3142 @item histmax
3143 The maximum number of changes to inspect at a time. Every POLLINTERVAL
3144 seconds, the @code{SVNPoller} asks for the last HISTMAX changes and
3145 looks through them for any ones it does not already know about. If
3146 more than HISTMAX revisions have been committed since the last poll,
3147 older changes will be silently ignored. Larger values of histmax will
3148 cause more time and memory to be consumed on each poll attempt.
3149 @code{histmax} defaults to 100.
3151 @item svnbin
3152 This controls the @code{svn} executable to use. If subversion is
3153 installed in a weird place on your system (outside of the
3154 buildmaster's @code{$PATH}), use this to tell @code{SVNPoller} where
3155 to find it. The default value of ``svn'' will almost always be
3156 sufficient.
3158 @end table
3160 @heading Branches
3162 Each source file that is tracked by a Subversion repository has a
3163 fully-qualified SVN URL in the following form:
3164 (REPOURL)(PROJECT-plus-BRANCH)(FILEPATH). When you create the
3165 @code{SVNPoller}, you give it a @code{svnurl} value that includes all
3166 of the REPOURL and possibly some portion of the PROJECT-plus-BRANCH
3167 string. The @code{SVNPoller} is responsible for producing Changes that
3168 contain a branch name and a FILEPATH (which is relative to the top of
3169 a checked-out tree). The details of how these strings are split up
3170 depend upon how your repository names its branches.
3172 @subheading PROJECT/BRANCHNAME/FILEPATH repositories
3174 One common layout is to have all the various projects that share a
3175 repository get a single top-level directory each. Then under a given
3176 project's directory, you get two subdirectories, one named ``trunk''
3177 and another named ``branches''. Under ``branches'' you have a bunch of
3178 other directories, one per branch, with names like ``1.5.x'' and
3179 ``testing''. It is also common to see directories like ``tags'' and
3180 ``releases'' next to ``branches'' and ``trunk''.
3182 For example, the Twisted project has a subversion server on
3183 ``svn.twistedmatrix.com'' that hosts several sub-projects. The
3184 repository is available through a SCHEME of ``svn:''. The primary
3185 sub-project is Twisted, of course, with a repository root of
3186 ``svn://svn.twistedmatrix.com/svn/Twisted''. Another sub-project is
3187 Informant, with a root of
3188 ``svn://svn.twistedmatrix.com/svn/Informant'', etc. Inside any
3189 checked-out Twisted tree, there is a file named bin/trial (which is
3190 used to run unit test suites).
3192 The trunk for Twisted is in
3193 ``svn://svn.twistedmatrix.com/svn/Twisted/trunk'', and the
3194 fully-qualified SVN URL for the trunk version of @code{trial} would be
3195 ``svn://svn.twistedmatrix.com/svn/Twisted/trunk/bin/trial''. The same
3196 SVNURL for that file on a branch named ``1.5.x'' would be
3197 ``svn://svn.twistedmatrix.com/svn/Twisted/branches/1.5.x/bin/trial''.
3199 To set up a @code{SVNPoller} that watches the Twisted trunk (and
3200 nothing else), we would use the following:
3202 @example
3203 from buildbot.changes.svnpoller import SVNPoller
3204 c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted/trunk")
3205 @end example
3207 In this case, every Change that our @code{SVNPoller} produces will
3208 have @code{.branch=None}, to indicate that the Change is on the trunk.
3209 No other sub-projects or branches will be tracked.
3211 If we want our ChangeSource to follow multiple branches, we have to do
3212 two things. First we have to change our @code{svnurl=} argument to
3213 watch more than just ``.../Twisted/trunk''. We will set it to
3214 ``.../Twisted'' so that we'll see both the trunk and all the branches.
3215 Second, we have to tell @code{SVNPoller} how to split the
3216 (PROJECT-plus-BRANCH)(FILEPATH) strings it gets from the repository
3217 out into (BRANCH) and (FILEPATH) pairs.
3219 We do the latter by providing a ``split_file'' function. This function
3220 is responsible for splitting something like
3221 ``branches/1.5.x/bin/trial'' into @code{branch}=''branches/1.5.x'' and
3222 @code{filepath}=''bin/trial''. This function is always given a string
3223 that names a file relative to the subdirectory pointed to by the
3224 @code{SVNPoller}'s @code{svnurl=} argument. It is expected to return a
3225 (BRANCHNAME, FILEPATH) tuple (in which FILEPATH is relative to the
3226 branch indicated), or None to indicate that the file is outside any
3227 project of interest.
3229 (note that we want to see ``branches/1.5.x'' rather than just
3230 ``1.5.x'' because when we perform the SVN checkout, we will probably
3231 append the branch name to the baseURL, which requires that we keep the
3232 ``branches'' component in there. Other VC schemes use a different
3233 approach towards branches and may not require this artifact.)
3235 If your repository uses this same PROJECT/BRANCH/FILEPATH naming
3236 scheme, the following function will work:
3238 @example
3239 def split_file_branches(path):
3240     pieces = path.split('/')
3241     if pieces[0] == 'trunk':
3242         return (None, '/'.join(pieces[1:]))
3243     elif pieces[0] == 'branches':
3244         return ('/'.join(pieces[0:2]),
3245                 '/'.join(pieces[2:]))
3246     else:
3247         return None
3248 @end example
3250 This function is provided as
3251 @code{buildbot.changes.svnpoller.split_file_branches} for your
3252 convenience. So to have our Twisted-watching @code{SVNPoller} follow
3253 multiple branches, we would use this:
3255 @example
3256 from buildbot.changes.svnpoller import SVNPoller, split_file_branches
3257 c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted",
3258                                split_file=split_file_branches)
3259 @end example
3261 Changes for all sorts of branches (with names like ``branches/1.5.x'',
3262 and None to indicate the trunk) will be delivered to the Schedulers.
3263 Each Scheduler is then free to use or ignore each branch as it sees
3264 fit.
3266 @subheading BRANCHNAME/PROJECT/FILEPATH repositories
3268 Another common way to organize a Subversion repository is to put the
3269 branch name at the top, and the projects underneath. This is
3270 especially frequent when there are a number of related sub-projects
3271 that all get released in a group.
3273 For example, Divmod.org hosts a project named ``Nevow'' as well as one
3274 named ``Quotient''. In a checked-out Nevow tree there is a directory
3275 named ``formless'' that contains a python source file named
3276 ``webform.py''. This repository is accessible via webdav (and thus
3277 uses an ``http:'' scheme) through the divmod.org hostname. There are
3278 many branches in this repository, and they use a
3279 (BRANCHNAME)/(PROJECT) naming policy.
3281 The fully-qualified SVN URL for the trunk version of webform.py is
3282 @code{http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.py}.
3283 You can do an @code{svn co} with that URL and get a copy of the latest
3284 version. The 1.5.x branch version of this file would have a URL of
3285 @code{http://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.py}.
3286 The whole Nevow trunk would be checked out with
3287 @code{http://divmod.org/svn/Divmod/trunk/Nevow}, while the Quotient
3288 trunk would be checked out using
3289 @code{http://divmod.org/svn/Divmod/trunk/Quotient}.
3291 Now suppose we want to have an @code{SVNPoller} that only cares about
3292 the Nevow trunk. This case looks just like the PROJECT/BRANCH layout
3293 described earlier:
3295 @example
3296 from buildbot.changes.svnpoller import SVNPoller
3297 c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")
3298 @end example
3300 But what happens when we want to track multiple Nevow branches? We
3301 have to point our @code{svnurl=} high enough to see all those
3302 branches, but we also don't want to include Quotient changes (since
3303 we're only building Nevow). To accomplish this, we must rely upon the
3304 @code{split_file} function to help us tell the difference between
3305 files that belong to Nevow and those that belong to Quotient, as well
3306 as figuring out which branch each one is on.
3308 @example
3309 from buildbot.changes.svnpoller import SVNPoller
3310 c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod",
3311                                split_file=my_file_splitter)
3312 @end example
3314 The @code{my_file_splitter} function will be called with
3315 repository-relative pathnames like:
3317 @table @code
3318 @item trunk/Nevow/formless/webform.py
3319 This is a Nevow file, on the trunk. We want the Change that includes this
3320 to see a filename of @code{formless/webform.py"}, and a branch of None
3322 @item branches/1.5.x/Nevow/formless/webform.py
3323 This is a Nevow file, on a branch. We want to get
3324 branch=''branches/1.5.x'' and filename=''formless/webform.py''.
3326 @item trunk/Quotient/setup.py
3327 This is a Quotient file, so we want to ignore it by having
3328 @code{my_file_splitter} return None.
3330 @item branches/1.5.x/Quotient/setup.py
3331 This is also a Quotient file, which should be ignored.
3332 @end table
3334 The following definition for @code{my_file_splitter} will do the job:
3336 @example
3337 def my_file_splitter(path):
3338     pieces = path.split('/')
3339     if pieces[0] == 'trunk':
3340         branch = None
3341         pieces.pop(0) # remove 'trunk'
3342     elif pieces[0] == 'branches':
3343         pieces.pop(0) # remove 'branches'
3344         # grab branch name
3345         branch = 'branches/' + pieces.pop(0)
3346     else:
3347         return None # something weird
3348     projectname = pieces.pop(0)
3349     if projectname != 'Nevow':
3350         return None # wrong project
3351     return (branch, '/'.join(pieces))
3352 @end example
3354 @node MercurialHook,  , SVNPoller, Getting Source Code Changes
3355 @section MercurialHook
3357 Since Mercurial is written in python, the hook script can invoke
3358 Buildbot's @code{sendchange} function directly, rather than having to
3359 spawn an external process. This function delivers the same sort of
3360 changes as @code{buildbot sendchange} and the various hook scripts in
3361 contrib/, so you'll need to add a @code{pb.PBChangeSource} to your
3362 buildmaster to receive these changes.
3364 To set this up, first choose a Mercurial repository that represents
3365 your central ``official'' source tree. This will be the same
3366 repository that your buildslaves will eventually pull from. Install
3367 Buildbot on the machine that hosts this repository, using the same
3368 version of python as Mercurial is using (so that the Mercurial hook
3369 can import code from buildbot). Then add the following to the
3370 @code{.hg/hgrc} file in that repository, replacing the buildmaster
3371 hostname/portnumber as appropriate for your buildbot:
3373 @example
3374 [hooks]
3375 changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook
3377 [hgbuildbot]
3378 master = buildmaster.example.org:9987
3379 @end example
3381 (Note that Mercurial lets you define multiple @code{changegroup} hooks
3382 by giving them distinct names, like @code{changegroup.foo} and
3383 @code{changegroup.bar}, which is why we use
3384 @code{changegroup.buildbot} in this example. There is nothing magical
3385 about the ``buildbot'' suffix in the hook name. The
3386 @code{[hgbuildbot]} section @emph{is} special, however, as it is the
3387 only section that the buildbot hook pays attention to.)
3389 Also note that this runs as a @code{changegroup} hook, rather than as
3390 an @code{incoming} hook. The @code{changegroup} hook is run with
3391 multiple revisions at a time (say, if multiple revisions are being
3392 pushed to this repository in a single @command{hg push} command),
3393 whereas the @code{incoming} hook is run with just one revision at a
3394 time. The @code{hgbuildbot.hook} function will only work with the
3395 @code{changegroup} hook.
3397 The @code{[hgbuildbot]} section has two other parameters that you
3398 might specify, both of which control the name of the branch that is
3399 attached to the changes coming from this hook.
3401 One common branch naming policy for Mercurial repositories is to use
3402 it just like Darcs: each branch goes into a separate repository, and
3403 all the branches for a single project share a common parent directory.
3404 For example, you might have @file{/var/repos/PROJECT/trunk/} and
3405 @file{/var/repos/PROJECT/release}. To use this style, use the
3406 @code{branchtype = dirname} setting, which simply uses the last
3407 component of the repository's enclosing directory as the branch name:
3409 @example
3410 [hgbuildbot]
3411 master = buildmaster.example.org:9987
3412 branchtype = dirname
3413 @end example
3415 Another approach is to use Mercurial's built-in branches (the kind
3416 created with @command{hg branch} and listed with @command{hg
3417 branches}). This feature associates persistent names with particular
3418 lines of descent within a single repository. (note that the buildbot
3419 @code{source.Mercurial} checkout step does not yet support this kind
3420 of branch). To have the commit hook deliver this sort of branch name
3421 with the Change object, use @code{branchtype = inrepo}:
3423 @example
3424 [hgbuildbot]
3425 master = buildmaster.example.org:9987
3426 branchtype = inrepo
3427 @end example
3429 Finally, if you want to simply specify the branchname directly, for
3430 all changes, use @code{branch = BRANCHNAME}. This overrides
3431 @code{branchtype}:
3433 @example
3434 [hgbuildbot]
3435 master = buildmaster.example.org:9987
3436 branch = trunk
3437 @end example
3439 If you use @code{branch=} like this, you'll need to put a separate
3440 .hgrc in each repository. If you use @code{branchtype=}, you may be
3441 able to use the same .hgrc for all your repositories, stored in
3442 @file{~/.hgrc} or @file{/etc/mercurial/hgrc}.
3445 @node Build Process, Status Delivery, Getting Source Code Changes, Top
3446 @chapter Build Process
3448 A @code{Build} object is responsible for actually performing a build.
3449 It gets access to a remote @code{SlaveBuilder} where it may run
3450 commands, and a @code{BuildStatus} object where it must emit status
3451 events. The @code{Build} is created by the Builder's
3452 @code{BuildFactory}.
3454 The default @code{Build} class is made up of a fixed sequence of
3455 @code{BuildSteps}, executed one after another until all are complete
3456 (or one of them indicates that the build should be halted early). The
3457 default @code{BuildFactory} creates instances of this @code{Build}
3458 class with a list of @code{BuildSteps}, so the basic way to configure
3459 the build is to provide a list of @code{BuildSteps} to your
3460 @code{BuildFactory}.
3462 More complicated @code{Build} subclasses can make other decisions:
3463 execute some steps only if certain files were changed, or if certain
3464 previous steps passed or failed. The base class has been written to
3465 allow users to express basic control flow without writing code, but
3466 you can always subclass and customize to achieve more specialized
3467 behavior.
3469 @menu
3470 * Build Steps::                 
3471 * Interlocks::                  
3472 * Build Factories::             
3473 @end menu
3475 @node Build Steps, Interlocks, Build Process, Build Process
3476 @section Build Steps
3478 @code{BuildStep}s are usually specified in the buildmaster's
3479 configuration file, in a list that goes into the @code{BuildFactory}.
3480 The @code{BuildStep} instances in this list are used as templates to
3481 construct new independent copies for each build (so that state can be
3482 kept on the @code{BuildStep} in one build without affecting a later
3483 build). Each @code{BuildFactory} can be created with a list of steps,
3484 or the factory can be created empty and then steps added to it using
3485 the @code{addStep} method:
3487 @example
3488 from buildbot.steps import source, shell
3489 from buildbot.process import factory
3491 f = factory.BuildFactory()
3492 f.addStep(source.SVN(svnurl="http://svn.example.org/Trunk/"))
3493 f.addStep(shell.ShellCommand(command=["make", "all"]))
3494 f.addStep(shell.ShellCommand(command=["make", "test"]))
3495 @end example
3497 In earlier versions (0.7.5 and older), these steps were specified with
3498 a tuple of (step_class, keyword_arguments). Steps can still be
3499 specified this way, but the preferred form is to pass actual
3500 @code{BuildStep} instances to @code{addStep}, because that gives the
3501 @code{BuildStep} class a chance to do some validation on the
3502 arguments.
3504 The rest of this section lists all the standard BuildStep objects
3505 available for use in a Build, and the parameters which can be used to
3506 control each.
3508 @menu
3509 * Common Parameters::           
3510 * Source Checkout::             
3511 * ShellCommand::                
3512 * Simple ShellCommand Subclasses::  
3513 * Python BuildSteps::           
3514 * Transferring Files::          
3515 * Writing New BuildSteps::      
3516 @end menu
3518 @node Common Parameters, Source Checkout, Build Steps, Build Steps
3519 @subsection Common Parameters
3521 The standard @code{Build} runs a series of @code{BuildStep}s in order,
3522 only stopping when it runs out of steps or if one of them requests
3523 that the build be halted. It collects status information from each one
3524 to create an overall build status (of SUCCESS, WARNINGS, or FAILURE).
3526 All BuildSteps accept some common parameters. Some of these control
3527 how their individual status affects the overall build. Others are used
3528 to specify which @code{Locks} (see @pxref{Interlocks}) should be
3529 acquired before allowing the step to run.
3531 Arguments common to all @code{BuildStep} subclasses:
3534 @table @code
3535 @item name
3536 the name used to describe the step on the status display. It is also
3537 used to give a name to any LogFiles created by this step.
3539 @item haltOnFailure
3540 if True, a FAILURE of this build step will cause the build to halt
3541 immediately with an overall result of FAILURE.
3543 @item flunkOnWarnings
3544 when True, a WARNINGS or FAILURE of this build step will mark the
3545 overall build as FAILURE. The remaining steps will still be executed.
3547 @item flunkOnFailure
3548 when True, a FAILURE of this build step will mark the overall build as
3549 a FAILURE. The remaining steps will still be executed.
3551 @item warnOnWarnings
3552 when True, a WARNINGS or FAILURE of this build step will mark the
3553 overall build as having WARNINGS. The remaining steps will still be
3554 executed.
3556 @item warnOnFailure
3557 when True, a FAILURE of this build step will mark the overall build as
3558 having WARNINGS. The remaining steps will still be executed.
3560 @item locks
3561 a list of Locks (instances of @code{buildbot.locks.SlaveLock} or
3562 @code{buildbot.locks.MasterLock}) that should be acquired before
3563 starting this Step. The Locks will be released when the step is
3564 complete. Note that this is a list of actual Lock instances, not
3565 names. Also note that all Locks must have unique names.
3567 @end table
3570 @node Source Checkout, ShellCommand, Common Parameters, Build Steps
3571 @subsection Source Checkout
3573 The first step of any build is typically to acquire the source code
3574 from which the build will be performed. There are several classes to
3575 handle this, one for each of the different source control system that
3576 Buildbot knows about. For a description of how Buildbot treats source
3577 control in general, see @ref{Version Control Systems}.
3579 All source checkout steps accept some common parameters to control how
3580 they get the sources and where they should be placed. The remaining
3581 per-VC-system parameters are mostly to specify where exactly the
3582 sources are coming from.
3584 @table @code
3585 @item mode
3587 a string describing the kind of VC operation that is desired. Defaults
3588 to @code{update}.
3590 @table @code
3591 @item update
3592 specifies that the CVS checkout/update should be performed directly
3593 into the workdir. Each build is performed in the same directory,
3594 allowing for incremental builds. This minimizes disk space, bandwidth,
3595 and CPU time. However, it may encounter problems if the build process
3596 does not handle dependencies properly (sometimes you must do a ``clean
3597 build'' to make sure everything gets compiled), or if source files are
3598 deleted but generated files can influence test behavior (e.g. python's
3599 .pyc files), or when source directories are deleted but generated
3600 files prevent CVS from removing them. Builds ought to be correct
3601 regardless of whether they are done ``from scratch'' or incrementally,
3602 but it is useful to test both kinds: this mode exercises the
3603 incremental-build style.
3605 @item copy
3606 specifies that the CVS workspace should be maintained in a separate
3607 directory (called the 'copydir'), using checkout or update as
3608 necessary. For each build, a new workdir is created with a copy of the
3609 source tree (rm -rf workdir; cp -r copydir workdir). This doubles the
3610 disk space required, but keeps the bandwidth low (update instead of a
3611 full checkout). A full 'clean' build is performed each time. This
3612 avoids any generated-file build problems, but is still occasionally
3613 vulnerable to CVS problems such as a repository being manually
3614 rearranged, causing CVS errors on update which are not an issue with a
3615 full checkout.
3617 @c TODO: something is screwy about this, revisit. Is it the source
3618 @c directory or the working directory that is deleted each time?
3620 @item clobber
3621 specifes that the working directory should be deleted each time,
3622 necessitating a full checkout for each build. This insures a clean
3623 build off a complete checkout, avoiding any of the problems described
3624 above. This mode exercises the ``from-scratch'' build style.
3626 @item export
3627 this is like @code{clobber}, except that the 'cvs export' command is
3628 used to create the working directory. This command removes all CVS
3629 metadata files (the CVS/ directories) from the tree, which is
3630 sometimes useful for creating source tarballs (to avoid including the
3631 metadata in the tar file).
3632 @end table
3634 @item workdir
3635 like all Steps, this indicates the directory where the build will take
3636 place. Source Steps are special in that they perform some operations
3637 outside of the workdir (like creating the workdir itself).
3639 @item alwaysUseLatest
3640 if True, bypass the usual ``update to the last Change'' behavior, and
3641 always update to the latest changes instead.
3643 @item retry
3644 If set, this specifies a tuple of @code{(delay, repeats)} which means
3645 that when a full VC checkout fails, it should be retried up to
3646 @var{repeats} times, waiting @var{delay} seconds between attempts. If
3647 you don't provide this, it defaults to @code{None}, which means VC
3648 operations should not be retried. This is provided to make life easier
3649 for buildslaves which are stuck behind poor network connections.
3651 @end table
3654 My habit as a developer is to do a @code{cvs update} and @code{make} each
3655 morning. Problems can occur, either because of bad code being checked in, or
3656 by incomplete dependencies causing a partial rebuild to fail where a
3657 complete from-scratch build might succeed. A quick Builder which emulates
3658 this incremental-build behavior would use the @code{mode='update'}
3659 setting.
3661 On the other hand, other kinds of dependency problems can cause a clean
3662 build to fail where a partial build might succeed. This frequently results
3663 from a link step that depends upon an object file that was removed from a
3664 later version of the tree: in the partial tree, the object file is still
3665 around (even though the Makefiles no longer know how to create it).
3667 ``official'' builds (traceable builds performed from a known set of
3668 source revisions) are always done as clean builds, to make sure it is
3669 not influenced by any uncontrolled factors (like leftover files from a
3670 previous build). A ``full'' Builder which behaves this way would want
3671 to use the @code{mode='clobber'} setting.
3673 Each VC system has a corresponding source checkout class: their
3674 arguments are described on the following pages.
3677 @menu
3678 * CVS::                         
3679 * SVN::                         
3680 * Darcs::                       
3681 * Mercurial::                   
3682 * Arch::                        
3683 * Bazaar::                      
3684 * Bzr::                         
3685 * P4::                          
3686 @end menu
3688 @node CVS, SVN, Source Checkout, Source Checkout
3689 @subsubsection CVS
3690 @cindex CVS Checkout
3691 @bsindex buildbot.steps.source.CVS
3694 The @code{CVS} build step performs a @uref{http://www.nongnu.org/cvs/,
3695 CVS} checkout or update. It takes the following arguments:
3697 @table @code
3698 @item cvsroot
3699 (required): specify the CVSROOT value, which points to a CVS
3700 repository, probably on a remote machine. For example, the cvsroot
3701 value you would use to get a copy of the Buildbot source code is
3702 @code{:pserver:anonymous@@cvs.sourceforge.net:/cvsroot/buildbot}
3704 @item cvsmodule
3705 (required): specify the cvs @code{module}, which is generally a
3706 subdirectory of the CVSROOT. The cvsmodule for the Buildbot source
3707 code is @code{buildbot}.
3709 @item branch
3710 a string which will be used in a @code{-r} argument. This is most
3711 useful for specifying a branch to work on. Defaults to @code{HEAD}.
3713 @item global_options
3714 a list of flags to be put before the verb in the CVS command.
3716 @item checkoutDelay
3717 if set, the number of seconds to put between the timestamp of the last
3718 known Change and the value used for the @code{-D} option. Defaults to
3719 half of the parent Build's treeStableTimer.
3721 @end table
3724 @node SVN, Darcs, CVS, Source Checkout
3725 @subsubsection SVN
3727 @cindex SVN Checkout
3728 @bsindex buildbot.steps.source.SVN
3731 The @code{SVN} build step performs a
3732 @uref{http://subversion.tigris.org, Subversion} checkout or update.
3733 There are two basic ways of setting up the checkout step, depending
3734 upon whether you are using multiple branches or not.
3736 If all of your builds use the same branch, then you should create the
3737 @code{SVN} step with the @code{svnurl} argument:
3739 @table @code
3740 @item svnurl
3741 (required): this specifies the @code{URL} argument that will be given
3742 to the @code{svn checkout} command. It dictates both where the
3743 repository is located and which sub-tree should be extracted. In this
3744 respect, it is like a combination of the CVS @code{cvsroot} and
3745 @code{cvsmodule} arguments. For example, if you are using a remote
3746 Subversion repository which is accessible through HTTP at a URL of
3747 @code{http://svn.example.com/repos}, and you wanted to check out the
3748 @code{trunk/calc} sub-tree, you would use
3749 @code{svnurl="http://svn.example.com/repos/trunk/calc"} as an argument
3750 to your @code{SVN} step.
3751 @end table
3753 If, on the other hand, you are building from multiple branches, then
3754 you should create the @code{SVN} step with the @code{baseURL} and
3755 @code{defaultBranch} arguments instead:
3757 @table @code
3758 @item baseURL
3759 (required): this specifies the base repository URL, to which a branch
3760 name will be appended. It should probably end in a slash.
3762 @item defaultBranch
3763 this specifies the name of the branch to use when a Build does not
3764 provide one of its own. This will be appended to @code{baseURL} to
3765 create the string that will be passed to the @code{svn checkout}
3766 command.
3767 @end table
3769 If you are using branches, you must also make sure your
3770 @code{ChangeSource} will report the correct branch names.
3772 @heading branch example
3774 Let's suppose that the ``MyProject'' repository uses branches for the
3775 trunk, for various users' individual development efforts, and for
3776 several new features that will require some amount of work (involving
3777 multiple developers) before they are ready to merge onto the trunk.
3778 Such a repository might be organized as follows:
3780 @example
3781 svn://svn.example.org/MyProject/trunk
3782 svn://svn.example.org/MyProject/branches/User1/foo
3783 svn://svn.example.org/MyProject/branches/User1/bar
3784 svn://svn.example.org/MyProject/branches/User2/baz
3785 svn://svn.example.org/MyProject/features/newthing
3786 svn://svn.example.org/MyProject/features/otherthing
3787 @end example
3789 Further assume that we want the Buildbot to run tests against the
3790 trunk and against all the feature branches (i.e., do a
3791 checkout/compile/build of branch X when a file has been changed on
3792 branch X, when X is in the set [trunk, features/newthing,
3793 features/otherthing]). We do not want the Buildbot to automatically
3794 build any of the user branches, but it should be willing to build a
3795 user branch when explicitly requested (most likely by the user who
3796 owns that branch).
3798 There are three things that need to be set up to accomodate this
3799 system. The first is a ChangeSource that is capable of identifying the
3800 branch which owns any given file. This depends upon a user-supplied
3801 function, in an external program that runs in the SVN commit hook and
3802 connects to the buildmaster's @code{PBChangeSource} over a TCP
3803 connection. (you can use the ``@code{buildbot sendchange}'' utility
3804 for this purpose, but you will still need an external program to
3805 decide what value should be passed to the @code{--branch=} argument).
3806 For example, a change to a file with the SVN url of
3807 ``svn://svn.example.org/MyProject/features/newthing/src/foo.c'' should
3808 be broken down into a Change instance with
3809 @code{branch='features/newthing'} and @code{file='src/foo.c'}.
3811 The second piece is an @code{AnyBranchScheduler} which will pay
3812 attention to the desired branches. It will not pay attention to the
3813 user branches, so it will not automatically start builds in response
3814 to changes there. The AnyBranchScheduler class requires you to
3815 explicitly list all the branches you want it to use, but it would not
3816 be difficult to write a subclass which used
3817 @code{branch.startswith('features/'} to remove the need for this
3818 explicit list. Or, if you want to build user branches too, you can use
3819 AnyBranchScheduler with @code{branches=None} to indicate that you want
3820 it to pay attention to all branches.
3822 The third piece is an @code{SVN} checkout step that is configured to
3823 handle the branches correctly, with a @code{baseURL} value that
3824 matches the way the ChangeSource splits each file's URL into base,
3825 branch, and file.
3827 @example
3828 from buildbot.changes.pb import PBChangeSource
3829 from buildbot.scheduler import AnyBranchScheduler
3830 from buildbot.process import source, factory
3831 from buildbot.steps import source, shell
3833 c['change_source'] = PBChangeSource()
3834 s1 = AnyBranchScheduler('main',
3835                         ['trunk', 'features/newthing', 'features/otherthing'],
3836                         10*60, ['test-i386', 'test-ppc'])
3837 c['schedulers'] = [s1]
3839 f = factory.BuildFactory()
3840 f.addStep(source.SVN(mode='update',
3841                      baseURL='svn://svn.example.org/MyProject/',
3842                      defaultBranch='trunk'))
3843 f.addStep(shell.Compile(command="make all"))
3844 f.addStep(shell.Test(command="make test"))
3846 c['builders'] = [
3847   @{'name':'test-i386', 'slavename':'bot-i386', 'builddir':'test-i386',
3848                        'factory':f @},
3849   @{'name':'test-ppc', 'slavename':'bot-ppc', 'builddir':'test-ppc',
3850                       'factory':f @},
3852 @end example
3854 In this example, when a change arrives with a @code{branch} attribute
3855 of ``trunk'', the resulting build will have an SVN step that
3856 concatenates ``svn://svn.example.org/MyProject/'' (the baseURL) with
3857 ``trunk'' (the branch name) to get the correct svn command. If the
3858 ``newthing'' branch has a change to ``src/foo.c'', then the SVN step
3859 will concatenate ``svn://svn.example.org/MyProject/'' with
3860 ``features/newthing'' to get the svnurl for checkout.
3862 @node Darcs, Mercurial, SVN, Source Checkout
3863 @subsubsection Darcs
3865 @cindex Darcs Checkout
3866 @bsindex buildbot.steps.source.Darcs
3869 The @code{Darcs} build step performs a
3870 @uref{http://darcs.net/, Darcs} checkout or update.
3872 Like @xref{SVN}, this step can either be configured to always check
3873 out a specific tree, or set up to pull from a particular branch that
3874 gets specified separately for each build. Also like SVN, the
3875 repository URL given to Darcs is created by concatenating a
3876 @code{baseURL} with the branch name, and if no particular branch is
3877 requested, it uses a @code{defaultBranch}. The only difference in
3878 usage is that each potential Darcs repository URL must point to a
3879 fully-fledged repository, whereas SVN URLs usually point to sub-trees
3880 of the main Subversion repository. In other words, doing an SVN
3881 checkout of @code{baseURL} is legal, but silly, since you'd probably
3882 wind up with a copy of every single branch in the whole repository.
3883 Doing a Darcs checkout of @code{baseURL} is just plain wrong, since
3884 the parent directory of a collection of Darcs repositories is not
3885 itself a valid repository.
3887 The Darcs step takes the following arguments:
3889 @table @code
3890 @item repourl
3891 (required unless @code{baseURL} is provided): the URL at which the
3892 Darcs source repository is available.
3894 @item baseURL
3895 (required unless @code{repourl} is provided): the base repository URL,
3896 to which a branch name will be appended. It should probably end in a
3897 slash.
3899 @item defaultBranch
3900 (allowed if and only if @code{baseURL} is provided): this specifies
3901 the name of the branch to use when a Build does not provide one of its
3902 own. This will be appended to @code{baseURL} to create the string that
3903 will be passed to the @code{darcs get} command.
3904 @end table
3906 @node Mercurial, Arch, Darcs, Source Checkout
3907 @subsubsection Mercurial
3909 @cindex Mercurial Checkout
3910 @bsindex buildbot.steps.source.Mercurial
3913 The @code{Mercurial} build step performs a
3914 @uref{http://selenic.com/mercurial, Mercurial} (aka ``hg'') checkout
3915 or update.
3917 Branches are handled just like @xref{Darcs}.
3919 The Mercurial step takes the following arguments:
3921 @table @code
3922 @item repourl
3923 (required unless @code{baseURL} is provided): the URL at which the
3924 Mercurial source repository is available.
3926 @item baseURL
3927 (required unless @code{repourl} is provided): the base repository URL,
3928 to which a branch name will be appended. It should probably end in a
3929 slash.
3931 @item defaultBranch
3932 (allowed if and only if @code{baseURL} is provided): this specifies
3933 the name of the branch to use when a Build does not provide one of its
3934 own. This will be appended to @code{baseURL} to create the string that
3935 will be passed to the @code{hg clone} command.
3936 @end table
3939 @node Arch, Bazaar, Mercurial, Source Checkout
3940 @subsubsection Arch
3942 @cindex Arch Checkout
3943 @bsindex buildbot.steps.source.Arch
3946 The @code{Arch} build step performs an @uref{http://gnuarch.org/,
3947 Arch} checkout or update using the @code{tla} client. It takes the
3948 following arguments:
3950 @table @code
3951 @item url
3952 (required): this specifies the URL at which the Arch source archive is
3953 available.
3955 @item version
3956 (required): this specifies which ``development line'' (like a branch)
3957 should be used. This provides the default branch name, but individual
3958 builds may specify a different one.
3960 @item archive
3961 (optional): Each repository knows its own archive name. If this
3962 parameter is provided, it must match the repository's archive name.
3963 The parameter is accepted for compatibility with the @code{Bazaar}
3964 step, below.
3966 @end table
3968 @node Bazaar, Bzr, Arch, Source Checkout
3969 @subsubsection Bazaar
3971 @cindex Bazaar Checkout
3972 @bsindex buildbot.steps.source.Bazaar
3975 @code{Bazaar} is an alternate implementation of the Arch VC system,
3976 which uses a client named @code{baz}. The checkout semantics are just
3977 different enough from @code{tla} that there is a separate BuildStep for
3980 It takes exactly the same arguments as @code{Arch}, except that the
3981 @code{archive=} parameter is required. (baz does not emit the archive
3982 name when you do @code{baz register-archive}, so we must provide it
3983 ourselves).
3986 @node Bzr, P4, Bazaar, Source Checkout
3987 @subsubsection Bzr
3989 @cindex Bzr Checkout
3990 @bsindex buildbot.steps.source.Bzr
3992 @code{bzr} is a descendant of Arch/Baz, and is frequently referred to
3993 as simply ``Bazaar''. The repository-vs-workspace model is similar to
3994 Darcs, but it uses a strictly linear sequence of revisions (one
3995 history per branch) like Arch. Branches are put in subdirectories.
3996 This makes it look very much like Mercurial, so it takes the same
3997 arguments:
3999 @table @code
4001 @item repourl
4002 (required unless @code{baseURL} is provided): the URL at which the
4003 Bzr source repository is available.
4005 @item baseURL
4006 (required unless @code{repourl} is provided): the base repository URL,
4007 to which a branch name will be appended. It should probably end in a
4008 slash.
4010 @item defaultBranch
4011 (allowed if and only if @code{baseURL} is provided): this specifies
4012 the name of the branch to use when a Build does not provide one of its
4013 own. This will be appended to @code{baseURL} to create the string that
4014 will be passed to the @code{bzr checkout} command.
4015 @end table
4019 @node P4,  , Bzr, Source Checkout
4020 @subsubsection P4
4022 @cindex Perforce Update
4023 @bsindex buildbot.steps.source.P4
4024 @c TODO @bsindex buildbot.steps.source.P4Sync
4027 The @code{P4} build step creates a @uref{http://www.perforce.com/,
4028 Perforce} client specification and performs an update.
4030 @table @code
4031 @item p4base
4032 A view into the Perforce depot without branch name or trailing "...".
4033 Typically "//depot/proj/".
4034 @item defaultBranch
4035 A branch name to append on build requests if none is specified.
4036 Typically "trunk".
4037 @item p4port
4038 (optional): the host:port string describing how to get to the P4 Depot
4039 (repository), used as the -p argument for all p4 commands.
4040 @item p4user
4041 (optional): the Perforce user, used as the -u argument to all p4
4042 commands.
4043 @item p4passwd
4044 (optional): the Perforce password, used as the -p argument to all p4
4045 commands.
4046 @item p4extra_views
4047 (optional): a list of (depotpath, clientpath) tuples containing extra
4048 views to be mapped into the client specification. Both will have
4049 "/..." appended automatically. The client name and source directory
4050 will be prepended to the client path.
4051 @item p4client
4052 (optional): The name of the client to use. In mode='copy' and
4053 mode='update', it's particularly important that a unique name is used
4054 for each checkout directory to avoid incorrect synchronization. For
4055 this reason, Python percent substitution will be performed on this value
4056 to replace %(slave)s with the slave name and %(builder)s with the
4057 builder name. The default is "buildbot_%(slave)s_%(build)s".
4058 @end table
4060 @node ShellCommand, Simple ShellCommand Subclasses, Source Checkout, Build Steps
4061 @subsection ShellCommand
4063 @bsindex buildbot.steps.shell.ShellCommand
4064 @c TODO @bsindex buildbot.steps.shell.TreeSize
4066 This is a useful base class for just about everything you might want
4067 to do during a build (except for the initial source checkout). It runs
4068 a single command in a child shell on the buildslave. All stdout/stderr
4069 is recorded into a LogFile. The step finishes with a status of FAILURE
4070 if the command's exit code is non-zero, otherwise it has a status of
4071 SUCCESS.
4073 The preferred way to specify the command is with a list of argv strings,
4074 since this allows for spaces in filenames and avoids doing any fragile
4075 shell-escaping. You can also specify the command with a single string, in
4076 which case the string is given to '/bin/sh -c COMMAND' for parsing.
4078 All ShellCommands are run by default in the ``workdir'', which
4079 defaults to the ``@file{build}'' subdirectory of the slave builder's
4080 base directory. The absolute path of the workdir will thus be the
4081 slave's basedir (set as an option to @code{buildbot create-slave},
4082 @pxref{Creating a buildslave}) plus the builder's basedir (set in the
4083 builder's @code{c['builddir']} key in master.cfg) plus the workdir
4084 itself (a class-level attribute of the BuildFactory, defaults to
4085 ``@file{build}'').
4087 @code{ShellCommand} arguments:
4089 @table @code
4090 @item command
4091 a list of strings (preferred) or single string (discouraged) which
4092 specifies the command to be run. A list of strings is preferred
4093 because it can be used directly as an argv array. Using a single
4094 string (with embedded spaces) requires the buildslave to pass the
4095 string to /bin/sh for interpretation, which raises all sorts of
4096 difficult questions about how to escape or interpret shell
4097 metacharacters.
4099 @item env
4100 a dictionary of environment strings which will be added to the child
4101 command's environment. For example, to run tests with a different i18n
4102 language setting, you might use
4104 @example
4105 f.addStep(ShellCommand, command=["make", "test"],
4106           env=@{'LANG': 'fr_FR'@})
4107 @end example
4109 These variable settings will override any existing ones in the
4110 buildslave's environment. The exception is PYTHONPATH, which is merged
4111 with (actually prepended to) any existing $PYTHONPATH setting. The
4112 value is treated as a list of directories to prepend, and a single
4113 string is treated like a one-item list. For example, to prepend both
4114 @file{/usr/local/lib/python2.3} and @file{/home/buildbot/lib/python}
4115 to any existing $PYTHONPATH setting, you would do something like the
4116 following:
4118 @example
4119 f.addStep(ShellCommand, command=["make", "test"],
4120           env=@{'PYTHONPATH': ["/usr/local/lib/python2.3",
4121                               "/home/buildbot/lib/python"] @})
4122 @end example
4124 @item want_stdout
4125 if False, stdout from the child process is discarded rather than being
4126 sent to the buildmaster for inclusion in the step's LogFile.
4128 @item want_stderr
4129 like @code{want_stdout} but for stderr. Note that commands run through
4130 a PTY do not have separate stdout/stderr streams: both are merged into
4131 stdout.
4133 @item logfiles
4134 Sometimes commands will log interesting data to a local file, rather
4135 than emitting everything to stdout or stderr. For example, Twisted's
4136 ``trial'' command (which runs unit tests) only presents summary
4137 information to stdout, and puts the rest into a file named
4138 @file{_trial_temp/test.log}. It is often useful to watch these files
4139 as the command runs, rather than using @command{/bin/cat} to dump
4140 their contents afterwards.
4142 The @code{logfiles=} argument allows you to collect data from these
4143 secondary logfiles in near-real-time, as the step is running. It
4144 accepts a dictionary which maps from a local Log name (which is how
4145 the log data is presented in the build results) to a remote filename
4146 (interpreted relative to the build's working directory). Each named
4147 file will be polled on a regular basis (every couple of seconds) as
4148 the build runs, and any new text will be sent over to the buildmaster.
4150 @example
4151 f.addStep(ShellCommand, command=["make", "test"],
4152           logfiles=@{"triallog": "_trial_temp/test.log"@})
4153 @end example
4156 @item timeout
4157 if the command fails to produce any output for this many seconds, it
4158 is assumed to be locked up and will be killed.
4160 @item description
4161 This will be used to describe the command (on the Waterfall display)
4162 while the command is still running. It should be a single
4163 imperfect-tense verb, like ``compiling'' or ``testing''. The preferred
4164 form is a list of short strings, which allows the HTML Waterfall
4165 display to create narrower columns by emitting a <br> tag between each
4166 word. You may also provide a single string.
4168 @item descriptionDone
4169 This will be used to describe the command once it has finished. A
4170 simple noun like ``compile'' or ``tests'' should be used. Like
4171 @code{description}, this may either be a list of short strings or a
4172 single string.
4174 If neither @code{description} nor @code{descriptionDone} are set, the
4175 actual command arguments will be used to construct the description.
4176 This may be a bit too wide to fit comfortably on the Waterfall
4177 display.
4179 @example
4180 f.addStep(ShellCommand, command=["make", "test"],
4181           description=["testing"],
4182           descriptionDone=["tests"])
4183 @end example
4185 @end table
4187 @node Simple ShellCommand Subclasses, Python BuildSteps, ShellCommand, Build Steps
4188 @subsection Simple ShellCommand Subclasses
4190 Several subclasses of ShellCommand are provided as starting points for
4191 common build steps. These are all very simple: they just override a few
4192 parameters so you don't have to specify them yourself, making the master.cfg
4193 file less verbose.
4195 @menu
4196 * Configure::                   
4197 * Compile::                     
4198 * Test::                        
4199 * Build Properties::            
4200 @end menu
4202 @node Configure, Compile, Simple ShellCommand Subclasses, Simple ShellCommand Subclasses
4203 @subsubsection Configure
4205 @bsindex buildbot.steps.shell.Configure
4207 This is intended to handle the @code{./configure} step from
4208 autoconf-style projects, or the @code{perl Makefile.PL} step from perl
4209 MakeMaker.pm-style modules. The default command is @code{./configure}
4210 but you can change this by providing a @code{command=} parameter.
4212 @node Compile, Test, Configure, Simple ShellCommand Subclasses
4213 @subsubsection Compile
4215 @bsindex buildbot.steps.shell.Compile
4217 This is meant to handle compiling or building a project written in C. The
4218 default command is @code{make all}. When the compile is finished, the
4219 log file is scanned for GCC error/warning messages and a summary log is
4220 created with any problems that were seen (TODO: the summary is not yet
4221 created).
4223 @node Test, Build Properties, Compile, Simple ShellCommand Subclasses
4224 @subsubsection Test
4226 @bsindex buildbot.steps.shell.Test
4228 This is meant to handle unit tests. The default command is @code{make
4229 test}, and the @code{warnOnFailure} flag is set.
4233 @node Build Properties,  , Test, Simple ShellCommand Subclasses
4234 @subsubsection Build Properties
4236 @cindex build properties
4238 Each build has a set of ``Build Properties'', which can be used by its
4239 BuildStep to modify their actions. For example, the SVN revision
4240 number of the source code being built is available as a build
4241 property, and a ShellCommand step could incorporate this number into a
4242 command which create a numbered release tarball.
4244 Some build properties are set when the build starts, such as the
4245 SourceStamp information. Other properties can be set by BuildSteps as
4246 they run, for example the various Source steps will set the
4247 @code{got_revision} property to the source revision that was actually
4248 checked out (which can be useful when the SourceStamp in use merely
4249 requested the ``latest revision'': @code{got_revision} will tell you
4250 what was actually built).
4252 In custom BuildSteps, you can get and set the build properties with
4253 the @code{getProperty}/@code{setProperty} methods. Each takes a string
4254 for the name of the property, and returns or accepts an
4255 arbitrary@footnote{Build properties are serialized along with the
4256 build results, so they must be serializable. For this reason, the
4257 value of any build property should be simple inert data: strings,
4258 numbers, lists, tuples, and dictionaries. They should not contain
4259 class instances.} object. For example:
4261 @example
4262 class MakeTarball(ShellCommand):
4263     def start(self):
4264         self.setCommand(["tar", "czf",
4265                          "build-%s.tar.gz" % self.getProperty("revision"),
4266                          "source"])
4267         ShellCommand.start(self)
4268 @end example
4270 @cindex WithProperties
4272 You can use build properties in ShellCommands by using the
4273 @code{WithProperties} wrapper when setting the arguments of the
4274 ShellCommand. This interpolates the named build properties into the
4275 generated shell command. You can also use a @code{WithProperties} as
4276 the @code{workdir=} argument: this allows the working directory for a
4277 command to be varied for each build, depending upon various build
4278 properties.
4280 @example
4281 from buildbot.steps.shell import ShellCommand, WithProperties
4283 f.addStep(ShellCommand,
4284           command=["tar", "czf",
4285                    WithProperties("build-%s.tar.gz", "revision"),
4286                    "source"])
4287 @end example
4289 If this BuildStep were used in a tree obtained from Subversion, it
4290 would create a tarball with a name like @file{build-1234.tar.gz}.
4292 The @code{WithProperties} function does @code{printf}-style string
4293 interpolation, using strings obtained by calling
4294 @code{build.getProperty(propname)}. Note that for every @code{%s} (or
4295 @code{%d}, etc), you must have exactly one additional argument to
4296 indicate which build property you want to insert.
4299 You can also use python dictionary-style string interpolation by using
4300 the @code{%(propname)s} syntax. In this form, the property name goes
4301 in the parentheses, and WithProperties takes @emph{no} additional
4302 arguments:
4304 @example
4305 f.addStep(ShellCommand,
4306           command=["tar", "czf",
4307                    WithProperties("build-%(revision)s.tar.gz"),
4308                    "source"])
4309 @end example
4311 Don't forget the extra ``s'' after the closing parenthesis! This is
4312 the cause of many confusing errors. Also note that you can only use
4313 WithProperties in the list form of the command= definition. You cannot
4314 currently use it in the (discouraged) @code{command="stuff"}
4315 single-string form. However, you can use something like
4316 @code{command=["/bin/sh", "-c", "stuff", WithProperties(stuff)]} to
4317 use both shell expansion and WithProperties interpolation.
4319 Note that, like python, you can either do positional-argument
4320 interpolation @emph{or} keyword-argument interpolation, not both. Thus
4321 you cannot use a string like
4322 @code{WithProperties("foo-%(revision)s-%s", "branch")}.
4324 At the moment, the only way to set build properties is by writing a
4325 custom BuildStep.
4327 @heading Common Build Properties
4329 The following build properties are set when the build is started, and
4330 are available to all steps.
4332 @table @code
4333 @item branch
4335 This comes from the build's SourceStamp, and describes which branch is
4336 being checked out. This will be @code{None} (which interpolates into
4337 @code{WithProperties} as an empty string) if the build is on the
4338 default branch, which is generally the trunk. Otherwise it will be a
4339 string like ``branches/beta1.4''. The exact syntax depends upon the VC
4340 system being used.
4342 @item revision
4344 This also comes from the SourceStamp, and is the revision of the
4345 source code tree that was requested from the VC system. When a build
4346 is requested of a specific revision (as is generally the case when the
4347 build is triggered by Changes), this will contain the revision
4348 specification. The syntax depends upon the VC system in use: for SVN
4349 it is an integer, for Mercurial it is a short string, for Darcs it is
4350 a rather large string, etc.
4352 If the ``force build'' button was pressed, the revision will be
4353 @code{None}, which means to use the most recent revision available.
4354 This is a ``trunk build''. This will be interpolated as an empty
4355 string.
4357 @item got_revision
4359 This is set when a Source step checks out the source tree, and
4360 provides the revision that was actually obtained from the VC system.
4361 In general this should be the same as @code{revision}, except for
4362 trunk builds, where @code{got_revision} indicates what revision was
4363 current when the checkout was performed. This can be used to rebuild
4364 the same source code later.
4366 Note that for some VC systems (Darcs in particular), the revision is a
4367 large string containing newlines, and is not suitable for
4368 interpolation into a filename.
4370 @item buildername
4372 This is a string that indicates which Builder the build was a part of.
4373 The combination of buildername and buildnumber uniquely identify a
4374 build.
4376 @item buildnumber
4378 Each build gets a number, scoped to the Builder (so the first build
4379 performed on any given Builder will have a build number of 0). This
4380 integer property contains the build's number.
4382 @item slavename
4384 This is a string which identifies which buildslave the build is
4385 running on.
4387 @end table
4389 @node Python BuildSteps, Transferring Files, Simple ShellCommand Subclasses, Build Steps
4390 @subsection Python BuildSteps
4392 Here are some BuildSteps that are specifcally useful for projects
4393 implemented in Python.
4395 @menu
4396 * BuildEPYDoc::                 
4397 * PyFlakes::                    
4398 @end menu
4400 @node BuildEPYDoc, PyFlakes, Python BuildSteps, Python BuildSteps
4401 @subsubsection BuildEPYDoc
4403 @bsindex buildbot.steps.python.BuildEPYDoc
4405 @url{http://epydoc.sourceforge.net/, epydoc} is a tool for generating
4406 API documentation for Python modules from their docstrings. It reads
4407 all the .py files from your source tree, processes the docstrings
4408 therein, and creates a large tree of .html files (or a single .pdf
4409 file).
4411 The @code{buildbot.steps.python.BuildEPYDoc} step will run
4412 @command{epydoc} to produce this API documentation, and will count the
4413 errors and warnings from its output.
4415 You must supply the command line to be used. The default is
4416 @command{make epydocs}, which assumes that your project has a Makefile
4417 with an ``epydocs'' target. You might wish to use something like
4418 @command{epydoc -o apiref source/PKGNAME} instead. You might also want
4419 to add @command{--pdf} to generate a PDF file instead of a large tree
4420 of HTML files.
4422 The API docs are generated in-place in the build tree (under the
4423 workdir, in the subdirectory controlled by the ``-o'' argument). To
4424 make them useful, you will probably have to copy them to somewhere
4425 they can be read. A command like @command{rsync -ad apiref/
4426 dev.example.com:~public_html/current-apiref/} might be useful. You
4427 might instead want to bundle them into a tarball and publish it in the
4428 same place where the generated install tarball is placed.
4430 @example
4431 from buildbot.steps.python import BuildEPYDoc
4434 f.addStep(BuildEPYDoc, command=["epydoc", "-o", "apiref", "source/mypkg"])
4435 @end example
4438 @node PyFlakes,  , BuildEPYDoc, Python BuildSteps
4439 @subsubsection PyFlakes
4441 @bsindex buildbot.steps.python.PyFlakes
4443 @url{http://divmod.org/trac/wiki/DivmodPyflakes, PyFlakes} is a tool
4444 to perform basic static analysis of Python code to look for simple
4445 errors, like missing imports and references of undefined names. It is
4446 like a fast and simple form of the C ``lint'' program. Other tools
4447 (like pychecker) provide more detailed results but take longer to run.
4449 The @code{buildbot.steps.python.PyFlakes} step will run pyflakes and
4450 count the various kinds of errors and warnings it detects.
4452 You must supply the command line to be used. The default is
4453 @command{make pyflakes}, which assumes you have a top-level Makefile
4454 with a ``pyflakes'' target. You might want to use something like
4455 @command{pyflakes .} or @command{pyflakes src}.
4457 @example
4458 from buildbot.steps.python import PyFlakes
4461 f.addStep(PyFlakes, command=["pyflakes", "src"])
4462 @end example
4465 @node Transferring Files, Writing New BuildSteps, Python BuildSteps, Build Steps
4466 @subsection Transferring Files
4468 @cindex File Transfer
4469 @bsindex buildbot.steps.transfer.FileUpload
4470 @bsindex buildbot.steps.transfer.FileDownload
4472 Most of the work involved in a build will take place on the
4473 buildslave. But occasionally it is useful to do some work on the
4474 buildmaster side. The most basic way to involve the buildmaster is
4475 simply to move a file from the slave to the master, or vice versa.
4476 There are a pair of BuildSteps named @code{FileUpload} and
4477 @code{FileDownload} to provide this functionality. @code{FileUpload}
4478 moves a file @emph{up to} the master, while @code{FileDownload} moves
4479 a file @emph{down from} the master.
4481 As an example, let's assume that there is a step which produces an
4482 HTML file within the source tree that contains some sort of generated
4483 project documentation. We want to move this file to the buildmaster,
4484 into a @file{~/public_html} directory, so it can be visible to
4485 developers. This file will wind up in the slave-side working directory
4486 under the name @file{docs/reference.html}. We want to put it into the
4487 master-side @file{~/public_html/ref.html}.
4489 @example
4490 from buildbot.steps.shell import ShellCommand
4491 from buildbot.steps.transfer import FileUpload
4493 f.addStep(ShellCommand, command=["make", "docs"])
4494 f.addStep(FileUpload,
4495           slavesrc="docs/reference.html",
4496           masterdest="~/public_html/ref.html")
4497 @end example
4499 The @code{masterdest=} argument will be passed to os.path.expanduser,
4500 so things like ``~'' will be expanded properly. Non-absolute paths
4501 will be interpreted relative to the buildmaster's base directory.
4502 Likewise, the @code{slavesrc=} argument will be expanded and
4503 interpreted relative to the builder's working directory.
4506 To move a file from the master to the slave, use the
4507 @code{FileDownload} command. For example, let's assume that some step
4508 requires a configuration file that, for whatever reason, could not be
4509 recorded in the source code repository or generated on the buildslave
4510 side:
4512 @example
4513 from buildbot.steps.shell import ShellCommand
4514 from buildbot.steps.transfer import FileUpload
4516 f.addStep(FileDownload
4517           mastersrc="~/todays_build_config.txt",
4518           slavedest="build_config.txt")
4519 f.addStep(ShellCommand, command=["make", "config"])
4520 @end example
4522 Like @code{FileUpload}, the @code{mastersrc=} argument is interpreted
4523 relative to the buildmaster's base directory, and the
4524 @code{slavedest=} argument is relative to the builder's working
4525 directory. If the buildslave is running in @file{~buildslave}, and the
4526 builder's ``builddir'' is something like @file{tests-i386}, then the
4527 workdir is going to be @file{~buildslave/tests-i386/build}, and a
4528 @code{slavedest=} of @file{foo/bar.html} will get put in
4529 @file{~buildslave/tests-i386/build/foo/bar.html}. Remember that
4530 neither of these commands will create missing directories for you.
4533 @subheading Other Parameters
4535 The @code{maxsize=} argument lets you set a maximum size for the file
4536 to be transferred. This may help to avoid surprises: transferring a
4537 100MB coredump when you were expecting to move a 10kB status file
4538 might take an awfully long time. The @code{blocksize=} argument
4539 controls how the file is sent over the network: larger blocksizes are
4540 slightly more efficient but also consume more memory on each end, and
4541 there is a hard-coded limit of about 640kB.
4543 The @code{mode=} argument allows you to control the access permissions
4544 of the target file, traditionally expressed as an octal integer. The
4545 most common value is probably 0755, which sets the ``x'' executable
4546 bit on the file (useful for shell scripts and the like). The default
4547 value for @code{mode=} is None, which means the permission bits will
4548 default to whatever the umask of the writing process is. The default
4549 umask tends to be fairly restrictive, but at least on the buildslave
4550 you can make it less restrictive with a --umask command-line option at
4551 creation time (@pxref{Buildslave Options}).
4554 @node Writing New BuildSteps,  , Transferring Files, Build Steps
4555 @subsection Writing New BuildSteps
4557 While it is a good idea to keep your build process self-contained in
4558 the source code tree, sometimes it is convenient to put more
4559 intelligence into your Buildbot configuration. One was to do this is
4560 to write a custom BuildStep. Once written, this Step can be used in
4561 the @file{master.cfg} file.
4563 The best reason for writing a custom BuildStep is to better parse the
4564 results of the command being run. For example, a BuildStep that knows
4565 about JUnit could look at the logfiles to determine which tests had
4566 been run, how many passed and how many failed, and then report more
4567 detailed information than a simple @code{rc==0} -based ``good/bad''
4568 decision.
4570 TODO: add more description of BuildSteps.
4572 @menu
4573 * BuildStep LogFiles::          
4574 * Reading Logfiles::            
4575 * Adding LogObservers::         
4576 * BuildStep URLs::              
4577 @end menu
4579 @node BuildStep LogFiles, Reading Logfiles, Writing New BuildSteps, Writing New BuildSteps
4580 @subsubsection BuildStep LogFiles
4582 Each BuildStep has a collection of ``logfiles''. Each one has a short
4583 name, like ``stdio'' or ``warnings''. Each LogFile contains an
4584 arbitrary amount of text, usually the contents of some output file
4585 generated during a build or test step, or a record of everything that
4586 was printed to stdout/stderr during the execution of some command.
4588 These LogFiles are stored to disk, so they can be retrieved later.
4590 Each can contain multiple ``channels'', generally limited to three
4591 basic ones: stdout, stderr, and ``headers''. For example, when a
4592 ShellCommand runs, it writes a few lines to the ``headers'' channel to
4593 indicate the exact argv strings being run, which directory the command
4594 is being executed in, and the contents of the current environment
4595 variables. Then, as the command runs, it adds a lot of ``stdout'' and
4596 ``stderr'' messages. When the command finishes, a final ``header''
4597 line is added with the exit code of the process.
4599 Status display plugins can format these different channels in
4600 different ways. For example, the web page shows LogFiles as text/html,
4601 with header lines in blue text, stdout in black, and stderr in red. A
4602 different URL is available which provides a text/plain format, in
4603 which stdout and stderr are collapsed together, and header lines are
4604 stripped completely. This latter option makes it easy to save the
4605 results to a file and run @command{grep} or whatever against the
4606 output.
4608 Each BuildStep contains a mapping (implemented in a python dictionary)
4609 from LogFile name to the actual LogFile objects. Status plugins can
4610 get a list of LogFiles to display, for example, a list of HREF links
4611 that, when clicked, provide the full contents of the LogFile.
4613 @heading Using LogFiles in custom BuildSteps
4615 The most common way for a custom BuildStep to use a LogFile is to
4616 summarize the results of a ShellCommand (after the command has
4617 finished running). For example, a compile step with thousands of lines
4618 of output might want to create a summary of just the warning messages.
4619 If you were doing this from a shell, you would use something like:
4621 @example
4622 grep "warning:" output.log >warnings.log
4623 @end example
4625 In a custom BuildStep, you could instead create a ``warnings'' LogFile
4626 that contained the same text. To do this, you would add code to your
4627 @code{createSummary} method that pulls lines from the main output log
4628 and creates a new LogFile with the results:
4630 @example
4631     def createSummary(self, log):
4632         warnings = []
4633         for line in log.readlines():
4634             if "warning:" in line:
4635                 warnings.append()
4636         self.addCompleteLog('warnings', "".join(warnings))
4637 @end example
4639 This example uses the @code{addCompleteLog} method, which creates a
4640 new LogFile, puts some text in it, and then ``closes'' it, meaning
4641 that no further contents will be added. This LogFile will appear in
4642 the HTML display under an HREF with the name ``warnings'', since that
4643 is the name of the LogFile.
4645 You can also use @code{addHTMLLog} to create a complete (closed)
4646 LogFile that contains HTML instead of plain text. The normal LogFile
4647 will be HTML-escaped if presented through a web page, but the HTML
4648 LogFile will not. At the moment this is only used to present a pretty
4649 HTML representation of an otherwise ugly exception traceback when
4650 something goes badly wrong during the BuildStep.
4652 In contrast, you might want to create a new LogFile at the beginning
4653 of the step, and add text to it as the command runs. You can create
4654 the LogFile and attach it to the build by calling @code{addLog}, which
4655 returns the LogFile object. You then add text to this LogFile by
4656 calling methods like @code{addStdout} and @code{addHeader}. When you
4657 are done, you must call the @code{finish} method so the LogFile can be
4658 closed. It may be useful to create and populate a LogFile like this
4659 from a LogObserver method @xref{Adding LogObservers}.
4661 The @code{logfiles=} argument to @code{ShellCommand} (see
4662 @pxref{ShellCommand}) creates new LogFiles and fills them in realtime
4663 by asking the buildslave to watch a actual file on disk. The
4664 buildslave will look for additions in the target file and report them
4665 back to the BuildStep. These additions will be added to the LogFile by
4666 calling @code{addStdout}. These secondary LogFiles can be used as the
4667 source of a LogObserver just like the normal ``stdio'' LogFile.
4669 @node Reading Logfiles, Adding LogObservers, BuildStep LogFiles, Writing New BuildSteps
4670 @subsubsection Reading Logfiles
4672 Once a LogFile has been added to a BuildStep with @code{addLog()},
4673 @code{addCompleteLog()}, @code{addHTMLLog()}, or @code{logfiles=},
4674 your BuildStep can retrieve it by using @code{getLog()}:
4676 @example
4677 class MyBuildStep(ShellCommand):
4678     logfiles = @{ "nodelog": "_test/node.log" @}
4680     def evaluateCommand(self, cmd):
4681         nodelog = self.getLog("nodelog")
4682         if "STARTED" in nodelog.getText():
4683             return SUCCESS
4684         else:
4685             return FAILURE
4686 @end example
4688 For a complete list of the methods you can call on a LogFile, please
4689 see the docstrings on the @code{IStatusLog} class in
4690 @file{buildbot/interfaces.py}.
4693 @node Adding LogObservers, BuildStep URLs, Reading Logfiles, Writing New BuildSteps
4694 @subsubsection Adding LogObservers
4696 @cindex LogObserver
4697 @cindex LogLineObserver
4699 Most shell commands emit messages to stdout or stderr as they operate,
4700 especially if you ask them nicely with a @code{--verbose} flag of some
4701 sort. They may also write text to a log file while they run. Your
4702 BuildStep can watch this output as it arrives, to keep track of how
4703 much progress the command has made. You can get a better measure of
4704 progress by counting the number of source files compiled or test cases
4705 run than by merely tracking the number of bytes that have been written
4706 to stdout. This improves the accuracy and the smoothness of the ETA
4707 display.
4709 To accomplish this, you will need to attach a @code{LogObserver} to
4710 one of the log channels, most commonly to the ``stdio'' channel but
4711 perhaps to another one which tracks a log file. This observer is given
4712 all text as it is emitted from the command, and has the opportunity to
4713 parse that output incrementally. Once the observer has decided that
4714 some event has occurred (like a source file being compiled), it can
4715 use the @code{setProgress} method to tell the BuildStep about the
4716 progress that this event represents.
4718 There are a number of pre-built @code{LogObserver} classes that you
4719 can choose from (defined in @code{buildbot.process.buildstep}, and of
4720 course you can subclass them to add further customization. The
4721 @code{LogLineObserver} class handles the grunt work of buffering and
4722 scanning for end-of-line delimiters, allowing your parser to operate
4723 on complete stdout/stderr lines.
4725 For example, let's take a look at the @code{TrialTestCaseCounter},
4726 which is used by the Trial step to count test cases as they are run.
4727 As Trial executes, it emits lines like the following:
4729 @example
4730 buildbot.test.test_config.ConfigTest.testDebugPassword ... [OK]
4731 buildbot.test.test_config.ConfigTest.testEmpty ... [OK]
4732 buildbot.test.test_config.ConfigTest.testIRC ... [FAIL]
4733 buildbot.test.test_config.ConfigTest.testLocks ... [OK]
4734 @end example
4736 When the tests are finished, trial emits a long line of ``======'' and
4737 then some lines which summarize the tests that failed. We want to
4738 avoid parsing these trailing lines, because their format is less
4739 well-defined than the ``[OK]'' lines.
4741 The parser class looks like this:
4743 @example
4744 from buildbot.process.buildstep import LogLineObserver
4746 class TrialTestCaseCounter(LogLineObserver):
4747     _line_re = re.compile(r'^([\w\.]+) \.\.\. \[([^\]]+)\]$')
4748     numTests = 0
4749     finished = False
4751     def outLineReceived(self, line):
4752         if self.finished:
4753             return
4754         if line.startswith("=" * 40):
4755             self.finished = True
4756             return
4758         m = self._line_re.search(line.strip())
4759         if m:
4760             testname, result = m.groups()
4761             self.numTests += 1
4762             self.step.setProgress('tests', self.numTests)
4763 @end example
4765 This parser only pays attention to stdout, since that's where trial
4766 writes the progress lines. It has a mode flag named @code{finished} to
4767 ignore everything after the ``===='' marker, and a scary-looking
4768 regular expression to match each line while hopefully ignoring other
4769 messages that might get displayed as the test runs.
4771 Each time it identifies a test has been completed, it increments its
4772 counter and delivers the new progress value to the step with
4773 @code{self.step.setProgress}. This class is specifically measuring
4774 progress along the ``tests'' metric, in units of test cases (as
4775 opposed to other kinds of progress like the ``output'' metric, which
4776 measures in units of bytes). The Progress-tracking code uses each
4777 progress metric separately to come up with an overall completion
4778 percentage and an ETA value.
4780 To connect this parser into the @code{Trial} BuildStep,
4781 @code{Trial.__init__} ends with the following clause:
4783 @example
4784         # this counter will feed Progress along the 'test cases' metric
4785         counter = TrialTestCaseCounter()
4786         self.addLogObserver('stdio', counter)
4787 @end example
4789 This creates a TrialTestCaseCounter and tells the step that the
4790 counter wants to watch the ``stdio'' log. The observer is
4791 automatically given a reference to the step in its @code{.step}
4792 attribute.
4794 @subheading A Somewhat Whimsical Example
4796 Let's say that we've got some snazzy new unit-test framework called
4797 Framboozle. It's the hottest thing since sliced bread. It slices, it
4798 dices, it runs unit tests like there's no tomorrow. Plus if your unit
4799 tests fail, you can use its name for a Web 2.1 startup company, make
4800 millions of dollars, and hire engineers to fix the bugs for you, while
4801 you spend your afternoons lazily hang-gliding along a scenic pacific
4802 beach, blissfully unconcerned about the state of your
4803 tests.@footnote{framboozle.com is still available. Remember, I get 10%
4804 :).}
4806 To run a Framboozle-enabled test suite, you just run the 'framboozler'
4807 command from the top of your source code tree. The 'framboozler'
4808 command emits a bunch of stuff to stdout, but the most interesting bit
4809 is that it emits the line "FNURRRGH!" every time it finishes running a
4810 test case@footnote{Framboozle gets very excited about running unit
4811 tests.}. You'd like to have a test-case counting LogObserver that
4812 watches for these lines and counts them, because counting them will
4813 help the buildbot more accurately calculate how long the build will
4814 take, and this will let you know exactly how long you can sneak out of
4815 the office for your hang-gliding lessons without anyone noticing that
4816 you're gone.
4818 This will involve writing a new BuildStep (probably named
4819 "Framboozle") which inherits from ShellCommand. The BuildStep class
4820 definition itself will look something like this:
4822 @example
4823 # START
4824 from buildbot.steps.shell import ShellCommand
4825 from buildbot.process.buildstep import LogLineObserver
4827 class FNURRRGHCounter(LogLineObserver):
4828     numTests = 0
4829     def outLineReceived(self, line):
4830         if "FNURRRGH!" in line:
4831             self.numTests += 1
4832             self.step.setProgress('tests', self.numTests)
4834 class Framboozle(ShellCommand):
4835     command = ["framboozler"]
4837     def __init__(self, **kwargs):
4838         ShellCommand.__init__(self, **kwargs)   # always upcall!
4839         counter = FNURRRGHCounter())
4840         self.addLogObserver(counter)
4841 # FINISH
4842 @end example
4844 So that's the code that we want to wind up using. How do we actually
4845 deploy it?
4847 You have a couple of different options.
4849 Option 1: The simplest technique is to simply put this text
4850 (everything from START to FINISH) in your master.cfg file, somewhere
4851 before the BuildFactory definition where you actually use it in a
4852 clause like:
4854 @example
4855 f = BuildFactory()
4856 f.addStep(SVN(svnurl="stuff"))
4857 f.addStep(Framboozle())
4858 @end example
4860 Remember that master.cfg is secretly just a python program with one
4861 job: populating the BuildmasterConfig dictionary. And python programs
4862 are allowed to define as many classes as they like. So you can define
4863 classes and use them in the same file, just as long as the class is
4864 defined before some other code tries to use it.
4866 This is easy, and it keeps the point of definition very close to the
4867 point of use, and whoever replaces you after that unfortunate
4868 hang-gliding accident will appreciate being able to easily figure out
4869 what the heck this stupid "Framboozle" step is doing anyways. The
4870 downside is that every time you reload the config file, the Framboozle
4871 class will get redefined, which means that the buildmaster will think
4872 that you've reconfigured all the Builders that use it, even though
4873 nothing changed. Bleh.
4875 Option 2: Instead, we can put this code in a separate file, and import
4876 it into the master.cfg file just like we would the normal buildsteps
4877 like ShellCommand and SVN.
4879 Create a directory named ~/lib/python, put everything from START to
4880 FINISH in ~/lib/python/framboozle.py, and run your buildmaster using:
4882 @example
4883  PYTHONPATH=~/lib/python buildbot start MASTERDIR
4884 @end example
4886 or use the @file{Makefile.buildbot} to control the way
4887 @command{buildbot start} works. Or add something like this to
4888 something like your ~/.bashrc or ~/.bash_profile or ~/.cshrc:
4890 @example
4891  export PYTHONPATH=~/lib/python
4892 @end example
4894 Once we've done this, our master.cfg can look like:
4896 @example
4897 from framboozle import Framboozle
4898 f = BuildFactory()
4899 f.addStep(SVN(svnurl="stuff"))
4900 f.addStep(Framboozle())
4901 @end example
4905 @example
4906 import framboozle
4907 f = BuildFactory()
4908 f.addStep(SVN(svnurl="stuff"))
4909 f.addStep(framboozle.Framboozle())
4910 @end example
4912 (check out the python docs for details about how "import" and "from A
4913 import B" work).
4915 What we've done here is to tell python that every time it handles an
4916 "import" statement for some named module, it should look in our
4917 ~/lib/python/ for that module before it looks anywhere else. After our
4918 directories, it will try in a bunch of standard directories too
4919 (including the one where buildbot is installed). By setting the
4920 PYTHONPATH environment variable, you can add directories to the front
4921 of this search list.
4923 Python knows that once it "import"s a file, it doesn't need to
4924 re-import it again. This means that reconfiguring the buildmaster
4925 (with "buildbot reconfig", for example) won't make it think the
4926 Framboozle class has changed every time, so the Builders that use it
4927 will not be spuriously restarted. On the other hand, you either have
4928 to start your buildmaster in a slightly weird way, or you have to
4929 modify your environment to set the PYTHONPATH variable.
4932 Option 3: Install this code into a standard python library directory
4934 Find out what your python's standard include path is by asking it:
4936 @example
4937 80:warner@@luther% python
4938 Python 2.4.4c0 (#2, Oct  2 2006, 00:57:46) 
4939 [GCC 4.1.2 20060928 (prerelease) (Debian 4.1.1-15)] on linux2
4940 Type "help", "copyright", "credits" or "license" for more information.
4941 >>> import sys
4942 >>> print sys.path
4943 ['', '/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']
4944 >>> 
4945 @end example
4947 In this case, putting the code into
4948 /usr/local/lib/python2.4/site-packages/framboozle.py would work just
4949 fine. We can use the same master.cfg "import framboozle" statement as
4950 in Option 2. By putting it in a standard include directory (instead of
4951 the decidedly non-standard ~/lib/python), we don't even have to set
4952 PYTHONPATH to anything special. The downside is that you probably have
4953 to be root to write to one of those standard include directories.
4956 Option 4: Submit the code for inclusion in the Buildbot distribution
4958 Contribute the code in an Enhancement Request on SourceForge, via
4959 http://buildbot.sf.net . Lobby, convince, coerce, bribe, badger,
4960 harass, threaten, or otherwise encourage the author to accept the
4961 patch. This lets you do something like:
4963 @example
4964 from buildbot.steps import framboozle
4965 f = BuildFactory()
4966 f.addStep(SVN(svnurl="stuff"))
4967 f.addStep(framboozle.Framboozle())
4968 @end example
4970 And then you don't even have to install framboozle.py anywhere on your
4971 system, since it will ship with Buildbot. You don't have to be root,
4972 you don't have to set PYTHONPATH. But you do have to make a good case
4973 for Framboozle being worth going into the main distribution, you'll
4974 probably have to provide docs and some unit test cases, you'll need to
4975 figure out what kind of beer the author likes, and then you'll have to
4976 wait until the next release. But in some environments, all this is
4977 easier than getting root on your buildmaster box, so the tradeoffs may
4978 actually be worth it.
4982 Putting the code in master.cfg (1) makes it available to that
4983 buildmaster instance. Putting it in a file in a personal library
4984 directory (2) makes it available for any buildmasters you might be
4985 running. Putting it in a file in a system-wide shared library
4986 directory (3) makes it available for any buildmasters that anyone on
4987 that system might be running. Getting it into the buildbot's upstream
4988 repository (4) makes it available for any buildmasters that anyone in
4989 the world might be running. It's all a matter of how widely you want
4990 to deploy that new class.
4994 @node BuildStep URLs,  , Adding LogObservers, Writing New BuildSteps
4995 @subsubsection BuildStep URLs
4997 @cindex links
4998 @cindex BuildStep URLs
4999 @cindex addURL
5001 Each BuildStep has a collection of ``links''. Like its collection of
5002 LogFiles, each link has a name and a target URL. The web status page
5003 creates HREFs for each link in the same box as it does for LogFiles,
5004 except that the target of the link is the external URL instead of an
5005 internal link to a page that shows the contents of the LogFile.
5007 These external links can be used to point at build information hosted
5008 on other servers. For example, the test process might produce an
5009 intricate description of which tests passed and failed, or some sort
5010 of code coverage data in HTML form, or a PNG or GIF image with a graph
5011 of memory usage over time. The external link can provide an easy way
5012 for users to navigate from the buildbot's status page to these
5013 external web sites or file servers. Note that the step itself is
5014 responsible for insuring that there will be a document available at
5015 the given URL (perhaps by using @command{scp} to copy the HTML output
5016 to a @file{~/public_html/} directory on a remote web server). Calling
5017 @code{addURL} does not magically populate a web server.
5019 To set one of these links, the BuildStep should call the @code{addURL}
5020 method with the name of the link and the target URL. Multiple URLs can
5021 be set.
5023 In this example, we assume that the @command{make test} command causes
5024 a collection of HTML files to be created and put somewhere on the
5025 coverage.example.org web server, in a filename that incorporates the
5026 build number.
5028 @example
5029 class TestWithCodeCoverage(BuildStep):
5030     command = ["make", "test",
5031                WithProperties("buildnum=%s" % "buildnumber")]
5033     def createSummary(self, log):
5034         buildnumber = self.getProperty("buildnumber")
5035         url = "http://coverage.example.org/builds/%s.html" % buildnumber
5036         self.addURL("coverage", url)
5037 @end example
5039 You might also want to extract the URL from some special message
5040 output by the build process itself:
5042 @example
5043 class TestWithCodeCoverage(BuildStep):
5044     command = ["make", "test",
5045                WithProperties("buildnum=%s" % "buildnumber")]
5047     def createSummary(self, log):
5048         output = StringIO(log.getText())
5049         for line in output.readlines():
5050             if line.startswith("coverage-url:"):
5051                 url = line[len("coverage-url:"):].strip()
5052                 self.addURL("coverage", url)
5053                 return
5054 @end example
5056 Note that a build process which emits both stdout and stderr might
5057 cause this line to be split or interleaved between other lines. It
5058 might be necessary to restrict the getText() call to only stdout with
5059 something like this:
5061 @example
5062         output = StringIO("".join([c[1]
5063                                    for c in log.getChunks()
5064                                    if c[0] == LOG_CHANNEL_STDOUT]))
5065 @end example
5067 Of course if the build is run under a PTY, then stdout and stderr will
5068 be merged before the buildbot ever sees them, so such interleaving
5069 will be unavoidable.
5072 @node Interlocks, Build Factories, Build Steps, Build Process
5073 @section Interlocks
5075 @cindex locks
5076 @slindex buildbot.locks.MasterLock
5077 @slindex buildbot.locks.SlaveLock
5079 For various reasons, you may want to prevent certain Steps (or perhaps
5080 entire Builds) from running simultaneously. Limited CPU speed or
5081 network bandwidth to the VC server, problems with simultaneous access
5082 to a database server used by unit tests, or multiple Builds which
5083 access shared state may all require some kind of interlock to prevent
5084 corruption, confusion, or resource overload. These resources might
5085 require completely exclusive access, or it might be sufficient to
5086 establish a limit of two or three simultaneous builds.
5088 @code{Locks} are the mechanism used to express these kinds of
5089 constraints on when Builds or Steps can be run. There are two kinds of
5090 @code{Locks}, each with their own scope: @code{MasterLock} instances
5091 are scoped to the buildbot as a whole, while @code{SlaveLock}s are
5092 scoped to a single buildslave. This means that each buildslave has a
5093 separate copy of each @code{SlaveLock}, which could enforce a
5094 one-Build-at-a-time limit for each machine, but still allow as many
5095 simultaneous builds as there are machines.
5097 Each @code{Lock} is created with a unique name. Each lock gets a count
5098 of how many owners it may have: how many processes can claim it at ths
5099 same time. This limit defaults to one, and is controllable through the
5100 @code{maxCount} argument. On @code{SlaveLock}s you can set the owner
5101 count on a per-slave basis by providing a dictionary (that maps from
5102 slavename to maximum owner count) to its @code{maxCountForSlave}
5103 argument. Any buildslaves that aren't mentioned in
5104 @code{maxCountForSlave} get their owner count from @code{maxCount}.
5106 To use a lock, simply include it in the @code{locks=} argument of the
5107 @code{BuildStep} object that should obtain the lock before it runs.
5108 This argument accepts a list of @code{Lock} objects: the Step will
5109 acquire all of them before it runs.
5111 To claim a lock for the whole Build, add a @code{'locks'} key to the
5112 builder specification dictionary with the same list of @code{Lock}
5113 objects. (This is the dictionary that has the @code{'name'},
5114 @code{'slavename'}, @code{'builddir'}, and @code{'factory'} keys). The
5115 @code{Build} object also accepts a @code{locks=} argument, but unless
5116 you are writing your own @code{BuildFactory} subclass then it will be
5117 easier to set the locks in the builder dictionary.
5119 Note that there are no partial-acquire or partial-release semantics:
5120 this prevents deadlocks caused by two Steps each waiting for a lock
5121 held by the other@footnote{Also note that a clever buildmaster admin
5122 could still create the opportunity for deadlock: Build A obtains Lock
5123 1, inside which Step A.two tries to acquire Lock 2 at the Step level.
5124 Meanwhile Build B obtains Lock 2, and has a Step B.two which wants to
5125 acquire Lock 1 at the Step level. Don't Do That.}. This also means
5126 that waiting to acquire a @code{Lock} can take an arbitrarily long
5127 time: if the buildmaster is very busy, a Step or Build which requires
5128 only one @code{Lock} may starve another that is waiting for that
5129 @code{Lock} plus some others.
5132 In the following example, we run the same build on three different
5133 platforms. The unit-test steps of these builds all use a common
5134 database server, and would interfere with each other if allowed to run
5135 simultaneously. The @code{Lock} prevents more than one of these builds
5136 from happening at the same time.
5138 @example
5139 from buildbot import locks
5140 from buildbot.steps import source, shell
5141 from buildbot.process import factory
5143 db_lock = locks.MasterLock("database")
5144 f = factory.BuildFactory()
5145 f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk"))
5146 f.addStep(shell.ShellCommand(command="make all"))
5147 f.addStep(shell.ShellCommand(command="make test", locks=[db_lock]))
5148 b1 = @{'name': 'full1', 'slavename': 'bot-1', builddir='f1', 'factory': f@}
5149 b2 = @{'name': 'full2', 'slavename': 'bot-2', builddir='f2', 'factory': f@}
5150 b3 = @{'name': 'full3', 'slavename': 'bot-3', builddir='f3', 'factory': f@}
5151 c['builders'] = [b1, b2, b3]
5152 @end example
5154 In the next example, we have one buildslave hosting three separate
5155 Builders (each running tests against a different version of Python).
5156 The machine which hosts this buildslave is not particularly fast, so
5157 we want to prevent all three builds from all happening at the same
5158 time. (Assume we've experimentally determined that one build leaves
5159 unused CPU capacity, three builds causes a lot of disk thrashing, but
5160 two builds at a time is Just Right). We use a @code{SlaveLock} because
5161 the builds happening on this one slow slave should not affect builds
5162 running on other slaves, and we use the lock on the build as a whole
5163 because the slave is so slow that even multiple simultaneous SVN
5164 checkouts would be too taxing. We set @code{maxCount=2} to achieve our
5165 goal of two simultaneous builds per slave.
5167 @example
5168 from buildbot import locks
5169 from buildbot.steps import source
5170 from buildbot.process import s, factory
5172 slow_lock = locks.SlaveLock("cpu", maxCount=2)
5173 source = s(source.SVN, svnurl="http://example.org/svn/Trunk")
5174 f22 = factory.Trial(source, trialpython=["python2.2"])
5175 f23 = factory.Trial(source, trialpython=["python2.3"])
5176 f24 = factory.Trial(source, trialpython=["python2.4"])
5177 b1 = @{'name': 'p22', 'slavename': 'bot-1', builddir='p22', 'factory': f22,
5178       'locks': [slow_lock] @}
5179 b2 = @{'name': 'p23', 'slavename': 'bot-1', builddir='p23', 'factory': f23,
5180       'locks': [slow_lock] @}
5181 b3 = @{'name': 'p24', 'slavename': 'bot-1', builddir='p24', 'factory': f24,
5182       'locks': [slow_lock] @}
5183 c['builders'] = [b1, b2, b3]
5184 @end example
5186 In the last example, we use two Locks at the same time. In this case,
5187 we're concerned about both of the previous constraints, but we'll say
5188 that only the tests are computationally intensive, and that they have
5189 been split into those which use the database and those which do not.
5190 In addition, two of the Builds run on a fast machine which does not
5191 need to worry about the cpu lock, but which still must be prevented
5192 from simultaneous database access. We use @code{maxCountForSlave} to
5193 limit the slow machine to one simultanous build, but allow practically
5194 unlimited concurrent builds on the fast machine.
5196 @example
5197 from buildbot import locks
5198 from buildbot.steps import source, shell
5199 from buildbot.process import factory
5201 db_lock = locks.MasterLock("database")
5202 slavecounts = @{"bot-slow": 1, "bot-fast": 100@}
5203 cpu_lock = locks.SlaveLock("cpu", maxCountForSlave=slavecounts)
5204 f = factory.BuildFactory()
5205 f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk"))
5206 f.addStep(shell.ShellCommand(command="make all", locks=[cpu_lock]))
5207 f.addStep(shell.ShellCommand(command="make test", locks=[cpu_lock]))
5208 f.addStep(shell.ShellCommand(command="make db-test", locks=[db_lock, cpu_lock]))
5210 b1 = @{'name': 'full1', 'slavename': 'bot-slow', builddir='full1',
5211       'factory': f@}
5212 b2 = @{'name': 'full2', 'slavename': 'bot-slow', builddir='full2',
5213       'factory': f@}
5214 b3 = @{'name': 'full3', 'slavename': 'bot-fast', builddir='full3',
5215       'factory': f@}
5216 b4 = @{'name': 'full4', 'slavename': 'bot-fast', builddir='full4',
5217       'factory': f@}
5218 c['builders'] = [b1, b2, b3, b4]
5219 @end example
5221 As a final note, remember that a unit test system which breaks when
5222 multiple people run it at the same time is fragile and should be
5223 fixed. Asking your human developers to serialize themselves when
5224 running unit tests will just discourage them from running the unit
5225 tests at all. Find a way to fix this: change the database tests to
5226 create a new (uniquely-named) user or table for each test run, don't
5227 use fixed listening TCP ports for network tests (instead listen on
5228 port 0 to let the kernel choose a port for you and then query the
5229 socket to find out what port was allocated). @code{MasterLock}s can be
5230 used to accomodate broken test systems like this, but are really
5231 intended for other purposes: build processes that store or retrieve
5232 products in shared directories, or which do things that human
5233 developers would not (or which might slow down or break in ways that
5234 require human attention to deal with).
5236 @code{SlaveLocks}s can be used to keep automated performance tests
5237 from interfering with each other, when there are multiple Builders all
5238 using the same buildslave. But they can't prevent other users from
5239 running CPU-intensive jobs on that host while the tests are running.
5241 @node Build Factories,  , Interlocks, Build Process
5242 @section Build Factories
5245 Each Builder is equipped with a ``build factory'', which is
5246 responsible for producing the actual @code{Build} objects that perform
5247 each build. This factory is created in the configuration file, and
5248 attached to a Builder through the @code{factory} element of its
5249 dictionary.
5251 The standard @code{BuildFactory} object creates @code{Build} objects
5252 by default. These Builds will each execute a collection of BuildSteps
5253 in a fixed sequence. Each step can affect the results of the build,
5254 but in general there is little intelligence to tie the different steps
5255 together. You can create subclasses of @code{Build} to implement more
5256 sophisticated build processes, and then use a subclass of
5257 @code{BuildFactory} (or simply set the @code{buildClass} attribute) to
5258 create instances of your new Build subclass.
5261 @menu
5262 * BuildStep Objects::           
5263 * BuildFactory::                
5264 * Process-Specific build factories::  
5265 @end menu
5267 @node BuildStep Objects, BuildFactory, Build Factories, Build Factories
5268 @subsection BuildStep Objects
5270 The steps used by these builds are all subclasses of @code{BuildStep}.
5271 The standard ones provided with Buildbot are documented later,
5272 @xref{Build Steps}. You can also write your own subclasses to use in
5273 builds.
5275 The basic behavior for a @code{BuildStep} is to:
5277 @itemize @bullet
5278 @item
5279 run for a while, then stop
5280 @item
5281 possibly invoke some RemoteCommands on the attached build slave
5282 @item
5283 possibly produce a set of log files
5284 @item
5285 finish with a status described by one of four values defined in
5286 buildbot.status.builder: SUCCESS, WARNINGS, FAILURE, SKIPPED
5287 @item
5288 provide a list of short strings to describe the step
5289 @item
5290 define a color (generally green, orange, or red) with which the
5291 step should be displayed
5292 @end itemize
5295 More sophisticated steps may produce additional information and
5296 provide it to later build steps, or store it in the factory to provide
5297 to later builds.
5300 @menu
5301 * BuildFactory Attributes::     
5302 * Quick builds::                
5303 @end menu
5305 @node BuildFactory, Process-Specific build factories, BuildStep Objects, Build Factories
5306 @subsection BuildFactory
5308 @bfindex buildbot.process.factory.BuildFactory
5309 @bfindex buildbot.process.factory.BasicBuildFactory
5310 @c TODO: what is BasicSVN anyway?
5311 @bfindex buildbot.process.factory.BasicSVN
5313 The default @code{BuildFactory}, provided in the
5314 @code{buildbot.process.factory} module, contains an internal list of
5315 ``BuildStep specifications'': a list of @code{(step_class, kwargs)}
5316 tuples for each. These specification tuples are constructed when the
5317 config file is read, by asking the instances passed to @code{addStep}
5318 for their subclass and arguments.
5320 When asked to create a Build, the @code{BuildFactory} puts a copy of
5321 the list of step specifications into the new Build object. When the
5322 Build is actually started, these step specifications are used to
5323 create the actual set of BuildSteps, which are then executed one at a
5324 time. This serves to give each Build an independent copy of each step.
5325 For example, a build which consists of a CVS checkout followed by a
5326 @code{make build} would be constructed as follows:
5328 @example
5329 from buildbot.steps import source, shell
5330 from buildbot.process import factory
5332 f = factory.BuildFactory()
5333 f.addStep(source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"))
5334 f.addStep(shell.Compile(command=["make", "build"]))
5335 @end example
5337 (To support config files from buildbot-0.7.5 and earlier,
5338 @code{addStep} also accepts the @code{f.addStep(shell.Compile,
5339 command=["make","build"])} form, although its use is discouraged
5340 because then the @code{Compile} step doesn't get to validate or
5341 complain about its arguments until build time. The modern
5342 pass-by-instance approach allows this validation to occur while the
5343 config file is being loaded, where the admin has a better chance of
5344 noticing problems).
5346 It is also possible to pass a list of steps into the
5347 @code{BuildFactory} when it is created. Using @code{addStep} is
5348 usually simpler, but there are cases where is is more convenient to
5349 create the list of steps ahead of time.:
5351 @example
5352 from buildbot.steps import source, shell
5353 from buildbot.process import factory
5355 all_steps = [source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"),
5356              shell.Compile(command=["make", "build"]),
5357             ]
5358 f = factory.BuildFactory(all_steps)
5359 @end example
5362 Each step can affect the build process in the following ways:
5364 @itemize @bullet
5365 @item
5366 If the step's @code{haltOnFailure} attribute is True, then a failure
5367 in the step (i.e. if it completes with a result of FAILURE) will cause
5368 the whole build to be terminated immediately: no further steps will be
5369 executed. This is useful for setup steps upon which the rest of the
5370 build depends: if the CVS checkout or @code{./configure} process
5371 fails, there is no point in trying to compile or test the resulting
5372 tree.
5374 @item
5375 If the @code{flunkOnFailure} or @code{flunkOnWarnings} flag is set,
5376 then a result of FAILURE or WARNINGS will mark the build as a whole as
5377 FAILED. However, the remaining steps will still be executed. This is
5378 appropriate for things like multiple testing steps: a failure in any
5379 one of them will indicate that the build has failed, however it is
5380 still useful to run them all to completion.
5382 @item
5383 Similarly, if the @code{warnOnFailure} or @code{warnOnWarnings} flag
5384 is set, then a result of FAILURE or WARNINGS will mark the build as
5385 having WARNINGS, and the remaining steps will still be executed. This
5386 may be appropriate for certain kinds of optional build or test steps.
5387 For example, a failure experienced while building documentation files
5388 should be made visible with a WARNINGS result but not be serious
5389 enough to warrant marking the whole build with a FAILURE.
5391 @end itemize
5393 In addition, each Step produces its own results, may create logfiles,
5394 etc. However only the flags described above have any effect on the
5395 build as a whole.
5397 The pre-defined BuildSteps like @code{CVS} and @code{Compile} have
5398 reasonably appropriate flags set on them already. For example, without
5399 a source tree there is no point in continuing the build, so the
5400 @code{CVS} class has the @code{haltOnFailure} flag set to True. Look
5401 in @file{buildbot/steps/*.py} to see how the other Steps are
5402 marked.
5404 Each Step is created with an additional @code{workdir} argument that
5405 indicates where its actions should take place. This is specified as a
5406 subdirectory of the slave builder's base directory, with a default
5407 value of @code{build}. This is only implemented as a step argument (as
5408 opposed to simply being a part of the base directory) because the
5409 CVS/SVN steps need to perform their checkouts from the parent
5410 directory.
5412 @menu
5413 * BuildFactory Attributes::     
5414 * Quick builds::                
5415 @end menu
5417 @node BuildFactory Attributes, Quick builds, BuildFactory, BuildFactory
5418 @subsubsection BuildFactory Attributes
5420 Some attributes from the BuildFactory are copied into each Build.
5422 @cindex treeStableTimer
5424 @table @code
5425 @item useProgress
5426 (defaults to True): if True, the buildmaster keeps track of how long
5427 each step takes, so it can provide estimates of how long future builds
5428 will take. If builds are not expected to take a consistent amount of
5429 time (such as incremental builds in which a random set of files are
5430 recompiled or tested each time), this should be set to False to
5431 inhibit progress-tracking.
5433 @end table
5436 @node Quick builds,  , BuildFactory Attributes, BuildFactory
5437 @subsubsection Quick builds
5439 @bfindex buildbot.process.factory.QuickBuildFactory
5441 The difference between a ``full build'' and a ``quick build'' is that
5442 quick builds are generally done incrementally, starting with the tree
5443 where the previous build was performed. That simply means that the
5444 source-checkout step should be given a @code{mode='update'} flag, to
5445 do the source update in-place.
5447 In addition to that, the @code{useProgress} flag should be set to
5448 False. Incremental builds will (or at least the ought to) compile as
5449 few files as necessary, so they will take an unpredictable amount of
5450 time to run. Therefore it would be misleading to claim to predict how
5451 long the build will take.
5454 @node Process-Specific build factories,  , BuildFactory, Build Factories
5455 @subsection Process-Specific build factories
5457 Many projects use one of a few popular build frameworks to simplify
5458 the creation and maintenance of Makefiles or other compilation
5459 structures. Buildbot provides several pre-configured BuildFactory
5460 subclasses which let you build these projects with a minimum of fuss.
5462 @menu
5463 * GNUAutoconf::                 
5464 * CPAN::                        
5465 * Python distutils::            
5466 * Python/Twisted/trial projects::  
5467 @end menu
5469 @node GNUAutoconf, CPAN, Process-Specific build factories, Process-Specific build factories
5470 @subsubsection GNUAutoconf
5472 @bfindex buildbot.process.factory.GNUAutoconf
5474 @uref{http://www.gnu.org/software/autoconf/, GNU Autoconf} is a
5475 software portability tool, intended to make it possible to write
5476 programs in C (and other languages) which will run on a variety of
5477 UNIX-like systems. Most GNU software is built using autoconf. It is
5478 frequently used in combination with GNU automake. These tools both
5479 encourage a build process which usually looks like this:
5481 @example
5482 % CONFIG_ENV=foo ./configure --with-flags
5483 % make all
5484 % make check
5485 # make install
5486 @end example
5488 (except of course the Buildbot always skips the @code{make install}
5489 part).
5491 The Buildbot's @code{buildbot.process.factory.GNUAutoconf} factory is
5492 designed to build projects which use GNU autoconf and/or automake. The
5493 configuration environment variables, the configure flags, and command
5494 lines used for the compile and test are all configurable, in general
5495 the default values will be suitable.
5497 Example:
5499 @example
5500 # use the s() convenience function defined earlier
5501 f = factory.GNUAutoconf(source=s(step.SVN, svnurl=URL, mode="copy"),
5502                         flags=["--disable-nls"])
5503 @end example
5505 Required Arguments:
5507 @table @code
5508 @item source
5509 This argument must be a step specification tuple that provides a
5510 BuildStep to generate the source tree.
5511 @end table
5513 Optional Arguments:
5515 @table @code
5516 @item configure
5517 The command used to configure the tree. Defaults to
5518 @code{./configure}. Accepts either a string or a list of shell argv
5519 elements.
5521 @item configureEnv
5522 The environment used for the initial configuration step. This accepts
5523 a dictionary which will be merged into the buildslave's normal
5524 environment. This is commonly used to provide things like
5525 @code{CFLAGS="-O2 -g"} (to turn off debug symbols during the compile).
5526 Defaults to an empty dictionary.
5528 @item configureFlags
5529 A list of flags to be appended to the argument list of the configure
5530 command. This is commonly used to enable or disable specific features
5531 of the autoconf-controlled package, like @code{["--without-x"]} to
5532 disable windowing support. Defaults to an empty list.
5534 @item compile
5535 this is a shell command or list of argv values which is used to
5536 actually compile the tree. It defaults to @code{make all}. If set to
5537 None, the compile step is skipped.
5539 @item test
5540 this is a shell command or list of argv values which is used to run
5541 the tree's self-tests. It defaults to @code{make check}. If set to
5542 None, the test step is skipped.
5544 @end table
5547 @node CPAN, Python distutils, GNUAutoconf, Process-Specific build factories
5548 @subsubsection CPAN
5550 @bfindex buildbot.process.factory.CPAN
5552 Most Perl modules available from the @uref{http://www.cpan.org/, CPAN}
5553 archive use the @code{MakeMaker} module to provide configuration,
5554 build, and test services. The standard build routine for these modules
5555 looks like:
5557 @example
5558 % perl Makefile.PL
5559 % make
5560 % make test
5561 # make install
5562 @end example
5564 (except again Buildbot skips the install step)
5566 Buildbot provides a @code{CPAN} factory to compile and test these
5567 projects.
5570 Arguments:
5571 @table @code
5572 @item source
5573 (required): A step specification tuple, that that used by GNUAutoconf.
5575 @item perl
5576 A string which specifies the @code{perl} executable to use. Defaults
5577 to just @code{perl}.
5579 @end table
5582 @node Python distutils, Python/Twisted/trial projects, CPAN, Process-Specific build factories
5583 @subsubsection Python distutils
5585 @bfindex buildbot.process.factory.Distutils
5587 Most Python modules use the @code{distutils} package to provide
5588 configuration and build services. The standard build process looks
5589 like:
5591 @example
5592 % python ./setup.py build
5593 % python ./setup.py install
5594 @end example
5596 Unfortunately, although Python provides a standard unit-test framework
5597 named @code{unittest}, to the best of my knowledge @code{distutils}
5598 does not provide a standardized target to run such unit tests. (please
5599 let me know if I'm wrong, and I will update this factory).
5601 The @code{Distutils} factory provides support for running the build
5602 part of this process. It accepts the same @code{source=} parameter as
5603 the other build factories.
5606 Arguments:
5607 @table @code
5608 @item source
5609 (required): A step specification tuple, that that used by GNUAutoconf.
5610   
5611 @item python
5612 A string which specifies the @code{python} executable to use. Defaults
5613 to just @code{python}.
5615 @item test
5616 Provides a shell command which runs unit tests. This accepts either a
5617 string or a list. The default value is None, which disables the test
5618 step (since there is no common default command to run unit tests in
5619 distutils modules).
5621 @end table
5624 @node Python/Twisted/trial projects,  , Python distutils, Process-Specific build factories
5625 @subsubsection Python/Twisted/trial projects
5627 @bfindex buildbot.process.factory.Trial
5628 @c TODO: document these steps better
5629 @bsindex buildbot.steps.python_twisted.HLint
5630 @bsindex buildbot.steps.python_twisted.Trial
5631 @bsindex buildbot.steps.python_twisted.ProcessDocs
5632 @bsindex buildbot.steps.python_twisted.BuildDebs
5633 @bsindex buildbot.steps.python_twisted.RemovePYCs
5635 Twisted provides a unit test tool named @code{trial} which provides a
5636 few improvements over Python's built-in @code{unittest} module. Many
5637 python projects which use Twisted for their networking or application
5638 services also use trial for their unit tests. These modules are
5639 usually built and tested with something like the following:
5641 @example
5642 % python ./setup.py build
5643 % PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test
5644 % python ./setup.py install
5645 @end example
5647 Unfortunately, the @file{build/lib} directory into which the
5648 built/copied .py files are placed is actually architecture-dependent,
5649 and I do not yet know of a simple way to calculate its value. For many
5650 projects it is sufficient to import their libraries ``in place'' from
5651 the tree's base directory (@code{PYTHONPATH=.}).
5653 In addition, the @var{PROJECTNAME} value where the test files are
5654 located is project-dependent: it is usually just the project's
5655 top-level library directory, as common practice suggests the unit test
5656 files are put in the @code{test} sub-module. This value cannot be
5657 guessed, the @code{Trial} class must be told where to find the test
5658 files.
5660 The @code{Trial} class provides support for building and testing
5661 projects which use distutils and trial. If the test module name is
5662 specified, trial will be invoked. The library path used for testing
5663 can also be set.
5665 One advantage of trial is that the Buildbot happens to know how to
5666 parse trial output, letting it identify which tests passed and which
5667 ones failed. The Buildbot can then provide fine-grained reports about
5668 how many tests have failed, when individual tests fail when they had
5669 been passing previously, etc.
5671 Another feature of trial is that you can give it a series of source
5672 .py files, and it will search them for special @code{test-case-name}
5673 tags that indicate which test cases provide coverage for that file.
5674 Trial can then run just the appropriate tests. This is useful for
5675 quick builds, where you want to only run the test cases that cover the
5676 changed functionality.
5678 Arguments:
5679 @table @code
5680 @item source
5681 (required): A step specification tuple, like that used by GNUAutoconf.
5683 @item buildpython
5684 A list (argv array) of strings which specifies the @code{python}
5685 executable to use when building the package. Defaults to just
5686 @code{['python']}. It may be useful to add flags here, to supress
5687 warnings during compilation of extension modules. This list is
5688 extended with @code{['./setup.py', 'build']} and then executed in a
5689 ShellCommand.
5691 @item testpath
5692 Provides a directory to add to @code{PYTHONPATH} when running the unit
5693 tests, if tests are being run. Defaults to @code{.} to include the
5694 project files in-place. The generated build library is frequently
5695 architecture-dependent, but may simply be @file{build/lib} for
5696 pure-python modules.
5698 @item trialpython
5699 Another list of strings used to build the command that actually runs
5700 trial. This is prepended to the contents of the @code{trial} argument
5701 below. It may be useful to add @code{-W} flags here to supress
5702 warnings that occur while tests are being run. Defaults to an empty
5703 list, meaning @code{trial} will be run without an explicit
5704 interpreter, which is generally what you want if you're using
5705 @file{/usr/bin/trial} instead of, say, the @file{./bin/trial} that
5706 lives in the Twisted source tree.
5708 @item trial
5709 provides the name of the @code{trial} command. It is occasionally
5710 useful to use an alternate executable, such as @code{trial2.2} which
5711 might run the tests under an older version of Python. Defaults to
5712 @code{trial}.
5714 @item tests
5715 Provides a module name or names which contain the unit tests for this
5716 project. Accepts a string, typically @code{PROJECTNAME.test}, or a
5717 list of strings. Defaults to None, indicating that no tests should be
5718 run. You must either set this or @code{useTestCaseNames} to do anyting
5719 useful with the Trial factory.
5721 @item useTestCaseNames
5722 Tells the Step to provide the names of all changed .py files to trial,
5723 so it can look for test-case-name tags and run just the matching test
5724 cases. Suitable for use in quick builds. Defaults to False.
5726 @item randomly
5727 If @code{True}, tells Trial (with the @code{--random=0} argument) to
5728 run the test cases in random order, which sometimes catches subtle
5729 inter-test dependency bugs. Defaults to @code{False}.
5731 @item recurse
5732 If @code{True}, tells Trial (with the @code{--recurse} argument) to
5733 look in all subdirectories for additional test cases. It isn't clear
5734 to me how this works, but it may be useful to deal with the
5735 unknown-PROJECTNAME problem described above, and is currently used in
5736 the Twisted buildbot to accomodate the fact that test cases are now
5737 distributed through multiple twisted.SUBPROJECT.test directories.
5739 @end table  
5741 Unless one of @code{trialModule} or @code{useTestCaseNames}
5742 are set, no tests will be run.
5744 Some quick examples follow. Most of these examples assume that the
5745 target python code (the ``code under test'') can be reached directly
5746 from the root of the target tree, rather than being in a @file{lib/}
5747 subdirectory.
5749 @example
5750 #  Trial(source, tests="toplevel.test") does:
5751 #   python ./setup.py build
5752 #   PYTHONPATH=. trial -to toplevel.test
5754 #  Trial(source, tests=["toplevel.test", "other.test"]) does:
5755 #   python ./setup.py build
5756 #   PYTHONPATH=. trial -to toplevel.test other.test
5758 #  Trial(source, useTestCaseNames=True) does:
5759 #   python ./setup.py build
5760 #   PYTHONPATH=. trial -to --testmodule=foo/bar.py..  (from Changes)
5762 #  Trial(source, buildpython=["python2.3", "-Wall"], tests="foo.tests"):
5763 #   python2.3 -Wall ./setup.py build
5764 #   PYTHONPATH=. trial -to foo.tests
5766 #  Trial(source, trialpython="python2.3", trial="/usr/bin/trial",
5767 #        tests="foo.tests") does:
5768 #   python2.3 -Wall ./setup.py build
5769 #   PYTHONPATH=. python2.3 /usr/bin/trial -to foo.tests
5771 # For running trial out of the tree being tested (only useful when the
5772 # tree being built is Twisted itself):
5773 #  Trial(source, trialpython=["python2.3", "-Wall"], trial="./bin/trial",
5774 #        tests="foo.tests") does:
5775 #   python2.3 -Wall ./setup.py build
5776 #   PYTHONPATH=. python2.3 -Wall ./bin/trial -to foo.tests
5777 @end example
5779 If the output directory of @code{./setup.py build} is known, you can
5780 pull the python code from the built location instead of the source
5781 directories. This should be able to handle variations in where the
5782 source comes from, as well as accomodating binary extension modules:
5784 @example
5785 # Trial(source,tests="toplevel.test",testpath='build/lib.linux-i686-2.3')
5786 # does:
5787 #  python ./setup.py build
5788 #  PYTHONPATH=build/lib.linux-i686-2.3 trial -to toplevel.test
5789 @end example
5792 @node Status Delivery, Command-line tool, Build Process, Top
5793 @chapter Status Delivery
5795 More details are available in the docstrings for each class, use
5796 @code{pydoc buildbot.status.html.Waterfall} to see them. Most status
5797 delivery objects take a @code{categories=} argument, which can contain
5798 a list of ``category'' names: in this case, it will only show status
5799 for Builders that are in one of the named categories.
5801 (implementor's note: each of these objects should be a
5802 service.MultiService which will be attached to the BuildMaster object
5803 when the configuration is processed. They should use
5804 @code{self.parent.getStatus()} to get access to the top-level IStatus
5805 object, either inside @code{startService} or later. They may call
5806 @code{status.subscribe()} in @code{startService} to receive
5807 notifications of builder events, in which case they must define
5808 @code{builderAdded} and related methods. See the docstrings in
5809 @file{buildbot/interfaces.py} for full details.)
5811 @menu
5812 * HTML Waterfall::              
5813 * IRC Bot::                     
5814 * PBListener::                  
5815 * Writing New Status Plugins::  
5816 @end menu
5818 @c @node Email Delivery,  , Status Delivery, Status Delivery
5819 @c @subsection Email Delivery
5821 @c DOCUMENT THIS
5823 @node HTML Waterfall, IRC Bot, Status Delivery, Status Delivery
5824 @section HTML Waterfall
5826 @cindex Waterfall
5827 @stindex buildbot.status.html.Waterfall
5830 @example
5831 from buildbot.status import html
5832 w = html.Waterfall(http_port=8080)
5833 c['status'].append(w)
5834 @end example
5836 The @code{buildbot.status.html.Waterfall} status target creates an
5837 HTML ``waterfall display'', which shows a time-based chart of events.
5838 This display provides detailed information about all steps of all
5839 recent builds, and provides hyperlinks to look at individual build
5840 logs and source changes. If the @code{http_port} argument is provided,
5841 it provides a strports specification for the port that the web server
5842 should listen on. This can be a simple port number, or a string like
5843 @code{tcp:8080:interface=127.0.0.1} (to limit connections to the
5844 loopback interface, and therefore to clients running on the same
5845 host)@footnote{It may even be possible to provide SSL access by using
5846 a specification like
5847 @code{"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"}, but this is
5848 completely untested}.
5850 If instead (or in addition) you provide the @code{distrib_port}
5851 argument, a twisted.web distributed server will be started either on a
5852 TCP port (if @code{distrib_port} is like @code{"tcp:12345"}) or more
5853 likely on a UNIX socket (if @code{distrib_port} is like
5854 @code{"unix:/path/to/socket"}).
5856 The @code{distrib_port} option means that, on a host with a
5857 suitably-configured twisted-web server, you do not need to consume a
5858 separate TCP port for the buildmaster's status web page. When the web
5859 server is constructed with @code{mktap web --user}, URLs that point to
5860 @code{http://host/~username/} are dispatched to a sub-server that is
5861 listening on a UNIX socket at @code{~username/.twisted-web-pb}. On
5862 such a system, it is convenient to create a dedicated @code{buildbot}
5863 user, then set @code{distrib_port} to
5864 @code{"unix:"+os.path.expanduser("~/.twistd-web-pb")}. This
5865 configuration will make the HTML status page available at
5866 @code{http://host/~buildbot/} . Suitable URL remapping can make it
5867 appear at @code{http://host/buildbot/}, and the right virtual host
5868 setup can even place it at @code{http://buildbot.host/} .
5870 Other arguments:
5872 @table @code
5873 @item allowForce
5874 If set to True (the default), then the web page will provide a ``Force
5875 Build'' button that allows visitors to manually trigger builds. This
5876 is useful for developers to re-run builds that have failed because of
5877 intermittent problems in the test suite, or because of libraries that
5878 were not installed at the time of the previous build. You may not wish
5879 to allow strangers to cause a build to run: in that case, set this to
5880 False to remove these buttons.
5882 @item favicon
5883 If set to a string, this will be interpreted as a filename containing
5884 a ``favicon'': a small image that contains an icon for the web site.
5885 This is returned to browsers that request the @code{favicon.ico} file,
5886 and should point to a .png or .ico image file. The default value uses
5887 the buildbot/buildbot.png image (a small hex nut) contained in the
5888 buildbot distribution. You can set this to None to avoid using a
5889 favicon at all.
5891 @item robots_txt
5892 If set to a string, this will be interpreted as a filename containing
5893 the contents of ``robots.txt''. Many search engine spiders request
5894 this file before indexing the site. Setting it to a file which
5895 contains:
5896 @example
5897 User-agent: *
5898 Disallow: /
5899 @end example
5900 will prevent most search engines from trawling the (voluminous)
5901 generated status pages.
5903 @end table
5906 @node WebStatus, IRC Bot, HTML Waterfall, Status Delivery
5907 @section WebStatus
5909 @cindex WebStatus
5910 @stindex buildbot.status.web.baseweb.WebStatus
5912 The Waterfall object is actually a subset of the views available with
5913 the more generalized @code{WebStatus} target. When you use
5914 @code{WebStatus}, you can put HTML files, CSS stylesheets, robots.txt,
5915 and other resources in a @file{public_html/} directory for use by the
5916 built-in webserver.
5918 When the buildmaster is created, a subdirectory named
5919 @file{public_html/} is created in its base directory. @code{WebStatus}
5920 will serve files from this directory: for example, when a user points
5921 their browser at the buildbot's @code{WebStatus} URL, they will see
5922 the contents of the @file{public_html/index.html} file. Likewise,
5923 @file{public_html/robots.txt} and @file{public_html/buildbot.css} are
5924 useful things to create.
5926 All URLs that start with @file{_buildbot/} will be handled by code
5927 internal to the buildbot. The pages available in this space provide
5928 various views into the buildbot status, each with a different focus.
5929 These pages can be configured further by adding query arguments, for
5930 example to restrict the page to only display certain Builders, or
5931 limit it to builds of a specific branch.
5933 In addition, if you are familiar with twisted.web @emph{Resource
5934 Trees}, you can write code to add additional pages at places inside
5935 this web space. Just use @code{webstatus.root.putChild} to places
5936 these resources.
5939 @node Buildbot Web Resources, XMLRPC server, WebStatus, WebStatus
5940 @subsection Buildbot Web Resources
5942 All URLs that start with @file{_buildbot/} are handled by various
5943 classes in the @file{buildbot.status.web} package. The most common way
5944 to access these pages is for the buildmaster admin to write or modify
5945 the @file{index.html} page to contain links to them. Of course other
5946 project web pages can contain links to these buildbot pages as well.
5948 Each page can be modified by adding query arguments to the URL. For
5949 example, a page which shows the results of the most recent build
5950 normally does this for all builders at once. But by appending
5951 ``?builder=i386'' to the end of the URL, the page will show only the
5952 results for the ``i386'' builder. When used in this way, you can add
5953 multiple ``builder='' arguments to see multiple builders. Remembering
5954 that URL query arguments are separated @emph{from each other} with
5955 ampersands, a URL that ends in ``?builder=i386&builder=ppc'' would
5956 show builds for just those two Builders.
5958 Some pages may include the Builder name or the build number in the
5959 main part of the URL itself. For example, a page that describes Build
5960 #7 of the ``i386'' builder might live at
5961 @file{_buildbot/builders/i386/builds/7}.
5963 The table below lists all of the internal pages and the URLs that can
5964 be used to access them.
5966 @table @code
5968 @item /_buildbot/timeline
5970 This provides a chronologically-oriented display of the activity of
5971 all builders. It is the same display used by the Waterfall display.
5973 By adding one or more ``builder='' arguments, the Waterfall is
5974 restricted to only showing information about the given Builders.
5976 @item /_buildbot/one_line_per_build
5978 This page shows one line of text for each build, merging information
5979 from all Builders@footnote{Apparently this is the same way
5980 http://buildd.debian.org displays build status}. Each line specifies
5981 the name of the Builder, the number of the Build, what revision it
5982 used, and a summary of the results. Successful builds are in green,
5983 while failing builds are in red. The date and time of the build are
5984 added to the right-hand edge of the line.
5986 One of more ``builder='' arguments can be used to restrict the list.
5987 In addition, a ``numbuilds='' argument will control how many lines are
5988 displayed (20 by default).
5990 @item /_buildbot/one_line_per_build/$BUILDERNAME
5992 By adding the name of a single Builder to the URL, the
5993 one_line_per_build display is restricted to just that one Builder. The
5994 ``numbuilds='' argument is still relevant.
5996 @item SlaveStatusTimeline
5998 This provides a chronological display of configuration and operational
5999 events: master startup/shutdown, slave connect/disconnect, and
6000 config-file changes. When a config-file reload is abandoned because of
6001 an error in the config file, the error is displayed on this page.
6003 This page does not show any builds.
6006 @item LastBuild
6008 This shows one box per Builder, showing the results of the most recent
6009 complete build. It does not show the individual steps, or the current
6010 status.
6012 There are some options to limit the boxes displayed:
6014 @itemize @bullet
6015 @item
6016 branches: only show builds of specific branches
6017 @item only show specific builders
6018 @end itemize
6021 @item LastBuildImage
6023 This returns a PNG image that describes the results of the most recent
6024 build, which can be referenced in an IMG tag by other pages, perhaps
6025 from a completely different site. Use it as you would a webcounter.
6027 @end table
6029 There are also a set of web-status resources that are intended for use
6030 by other programs, rather than humans.
6032 @table @code
6034 @item RSS
6036 This provides an RSS feed of recent builds.
6038 @item /_buildbot/xmlrpc
6040 This runs an XML-RPC server which can be used to query status
6041 information about various builds. See @xref{XMLRPC server} for more
6042 details.
6044 @end table
6046 @node XMLRPC server,  , Buildbot Web Resources, WebStatus
6047 @subsection XMLRPC server
6049 When using WebStatus, the buildbot runs an XML-RPC server at
6050 @file{/_buildbot/xmlrpc} that can be used by other programs to query
6051 build status. The following table lists the methods that can be
6052 invoked using this interface.
6054 @table @code
6056 @end table
6059 @node IRC Bot, PBListener, HTML Waterfall, Status Delivery
6060 @section IRC Bot
6062 @cindex IRC
6063 @stindex buildbot.status.words.IRC
6066 The @code{buildbot.status.words.IRC} status target creates an IRC bot
6067 which will attach to certain channels and be available for status
6068 queries. It can also be asked to announce builds as they occur, or be
6069 told to shut up.
6071 @example
6072 from twisted.status import words
6073 irc = words.IRC("irc.example.org", "botnickname", 
6074                 channels=["channel1", "channel2"],
6075                 password="mysecretpassword")
6076 c['status'].append(irc)
6077 @end example
6079 Take a look at the docstring for @code{words.IRC} for more details on
6080 configuring this service. The @code{password} argument, if provided,
6081 will be sent to Nickserv to claim the nickname: some IRC servers will
6082 not allow clients to send private messages until they have logged in
6083 with a password.
6085 To use the service, you address messages at the buildbot, either
6086 normally (@code{botnickname: status}) or with private messages
6087 (@code{/msg botnickname status}). The buildbot will respond in kind.
6089 Some of the commands currently available:
6091 @table @code
6093 @item list builders
6094 Emit a list of all configured builders
6095 @item status BUILDER
6096 Announce the status of a specific Builder: what it is doing right now.
6097 @item status all
6098 Announce the status of all Builders
6099 @item watch BUILDER
6100 If the given Builder is currently running, wait until the Build is
6101 finished and then announce the results.
6102 @item last BUILDER
6103 Return the results of the last build to run on the given Builder.
6105 @item help COMMAND
6106 Describe a command. Use @code{help commands} to get a list of known
6107 commands.
6108 @item source
6109 Announce the URL of the Buildbot's home page.
6110 @item version
6111 Announce the version of this Buildbot.
6112 @end table
6114 If the @code{allowForce=True} option was used, some addtional commands
6115 will be available:
6117 @table @code
6118 @item force build BUILDER REASON
6119 Tell the given Builder to start a build of the latest code. The user
6120 requesting the build and REASON are recorded in the Build status. The
6121 buildbot will announce the build's status when it finishes.
6123 @item stop build BUILDER REASON
6124 Terminate any running build in the given Builder. REASON will be added
6125 to the build status to explain why it was stopped. You might use this
6126 if you committed a bug, corrected it right away, and don't want to
6127 wait for the first build (which is destined to fail) to complete
6128 before starting the second (hopefully fixed) build.
6129 @end table
6131 @node PBListener, Writing New Status Plugins, IRC Bot, Status Delivery
6132 @section PBListener
6134 @cindex PBListener
6135 @stindex buildbot.status.client.PBListener
6138 @example
6139 import buildbot.status.client
6140 pbl = buildbot.status.client.PBListener(port=int, user=str,
6141                                         passwd=str)
6142 c['status'].append(pbl)
6143 @end example
6145 This sets up a PB listener on the given TCP port, to which a PB-based
6146 status client can connect and retrieve status information.
6147 @code{buildbot statusgui} (@pxref{statusgui}) is an example of such a
6148 status client. The @code{port} argument can also be a strports
6149 specification string.
6151 @node Writing New Status Plugins,  , PBListener, Status Delivery
6152 @section Writing New Status Plugins
6154 TODO: this needs a lot more examples
6156 Each status plugin is an object which provides the
6157 @code{twisted.application.service.IService} interface, which creates a
6158 tree of Services with the buildmaster at the top [not strictly true].
6159 The status plugins are all children of an object which implements
6160 @code{buildbot.interfaces.IStatus}, the main status object. From this
6161 object, the plugin can retrieve anything it wants about current and
6162 past builds. It can also subscribe to hear about new and upcoming
6163 builds.
6165 Status plugins which only react to human queries (like the Waterfall
6166 display) never need to subscribe to anything: they are idle until
6167 someone asks a question, then wake up and extract the information they
6168 need to answer it, then they go back to sleep. Plugins which need to
6169 act spontaneously when builds complete (like the Mail plugin) need to
6170 subscribe to hear about new builds.
6172 If the status plugin needs to run network services (like the HTTP
6173 server used by the Waterfall plugin), they can be attached as Service
6174 children of the plugin itself, using the @code{IServiceCollection}
6175 interface.
6179 @node Command-line tool, Resources, Status Delivery, Top
6180 @chapter Command-line tool
6182 The @command{buildbot} command-line tool can be used to start or stop a
6183 buildmaster or buildbot, and to interact with a running buildmaster.
6184 Some of its subcommands are intended for buildmaster admins, while
6185 some are for developers who are editing the code that the buildbot is
6186 monitoring.
6188 @menu
6189 * Administrator Tools::         
6190 * Developer Tools::             
6191 * Other Tools::                 
6192 * .buildbot config directory::  
6193 @end menu
6195 @node Administrator Tools, Developer Tools, Command-line tool, Command-line tool
6196 @section Administrator Tools
6198 The following @command{buildbot} sub-commands are intended for
6199 buildmaster administrators:
6201 @heading create-master
6203 This creates a new directory and populates it with files that allow it
6204 to be used as a buildmaster's base directory.
6206 @example
6207 buildbot create-master BASEDIR
6208 @end example
6210 @heading create-slave
6212 This creates a new directory and populates it with files that let it
6213 be used as a buildslave's base directory. You must provide several
6214 arguments, which are used to create the initial @file{buildbot.tac}
6215 file.
6217 @example
6218 buildbot create-slave @var{BASEDIR} @var{MASTERHOST}:@var{PORT} @var{SLAVENAME} @var{PASSWORD}
6219 @end example
6221 @heading start
6223 This starts a buildmaster or buildslave which was already created in
6224 the given base directory. The daemon is launched in the background,
6225 with events logged to a file named @file{twistd.log}.
6227 @example
6228 buildbot start BASEDIR
6229 @end example
6231 @heading stop
6233 This terminates the daemon (either buildmaster or buildslave) running
6234 in the given directory.
6236 @example
6237 buildbot stop BASEDIR
6238 @end example
6240 @heading sighup
6242 This sends a SIGHUP to the buildmaster running in the given directory,
6243 which causes it to re-read its @file{master.cfg} file.
6245 @example
6246 buildbot sighup BASEDIR
6247 @end example
6249 @node Developer Tools, Other Tools, Administrator Tools, Command-line tool
6250 @section Developer Tools
6252 These tools are provided for use by the developers who are working on
6253 the code that the buildbot is monitoring.
6255 @menu
6256 * statuslog::                   
6257 * statusgui::                   
6258 * try::                         
6259 @end menu
6261 @node statuslog, statusgui, Developer Tools, Developer Tools
6262 @subsection statuslog
6264 @example
6265 buildbot statuslog --master @var{MASTERHOST}:@var{PORT}
6266 @end example
6268 This command starts a simple text-based status client, one which just
6269 prints out a new line each time an event occurs on the buildmaster.
6271 The @option{--master} option provides the location of the
6272 @code{buildbot.status.client.PBListener} status port, used to deliver
6273 build information to realtime status clients. The option is always in
6274 the form of a string, with hostname and port number separated by a
6275 colon (@code{HOSTNAME:PORTNUM}). Note that this port is @emph{not} the
6276 same as the slaveport (although a future version may allow the same
6277 port number to be used for both purposes). If you get an error message
6278 to the effect of ``Failure: twisted.cred.error.UnauthorizedLogin:'',
6279 this may indicate that you are connecting to the slaveport rather than
6280 a @code{PBListener} port.
6282 The @option{--master} option can also be provided by the
6283 @code{masterstatus} name in @file{.buildbot/options} (@pxref{.buildbot
6284 config directory}).
6286 @node statusgui, try, statuslog, Developer Tools
6287 @subsection statusgui
6289 @cindex statusgui
6291 If you have set up a PBListener (@pxref{PBListener}), you will be able
6292 to monitor your Buildbot using a simple Gtk+ application invoked with
6293 the @code{buildbot statusgui} command:
6295 @example
6296 buildbot statusgui --master @var{MASTERHOST}:@var{PORT}
6297 @end example
6299 This command starts a simple Gtk+-based status client, which contains
6300 a few boxes for each Builder that change color as events occur. It
6301 uses the same @option{--master} argument as the @command{buildbot
6302 statuslog} command (@pxref{statuslog}).
6304 @node try,  , statusgui, Developer Tools
6305 @subsection try
6307 This lets a developer to ask the question ``What would happen if I
6308 committed this patch right now?''. It runs the unit test suite (across
6309 multiple build platforms) on the developer's current code, allowing
6310 them to make sure they will not break the tree when they finally
6311 commit their changes.
6313 The @command{buildbot try} command is meant to be run from within a
6314 developer's local tree, and starts by figuring out the base revision
6315 of that tree (what revision was current the last time the tree was
6316 updated), and a patch that can be applied to that revision of the tree
6317 to make it match the developer's copy. This (revision, patch) pair is
6318 then sent to the buildmaster, which runs a build with that
6319 SourceStamp. If you want, the tool will emit status messages as the
6320 builds run, and will not terminate until the first failure has been
6321 detected (or the last success).
6323 There is an alternate form which accepts a pre-made patch file
6324 (typically the output of a command like 'svn diff'). This ``--diff''
6325 form does not require a local tree to run from. See @xref{try --diff}.
6327 For this command to work, several pieces must be in place:
6330 @heading TryScheduler
6332 @slindex buildbot.scheduler.Try_Jobdir
6333 @slindex buildbot.scheduler.Try_Userpass
6335 The buildmaster must have a @code{scheduler.Try} instance in
6336 the config file's @code{c['schedulers']} list. This lets the
6337 administrator control who may initiate these ``trial'' builds, which
6338 branches are eligible for trial builds, and which Builders should be
6339 used for them.
6341 The @code{TryScheduler} has various means to accept build requests:
6342 all of them enforce more security than the usual buildmaster ports do.
6343 Any source code being built can be used to compromise the buildslave
6344 accounts, but in general that code must be checked out from the VC
6345 repository first, so only people with commit privileges can get
6346 control of the buildslaves. The usual force-build control channels can
6347 waste buildslave time but do not allow arbitrary commands to be
6348 executed by people who don't have those commit privileges. However,
6349 the source code patch that is provided with the trial build does not
6350 have to go through the VC system first, so it is important to make
6351 sure these builds cannot be abused by a non-committer to acquire as
6352 much control over the buildslaves as a committer has. Ideally, only
6353 developers who have commit access to the VC repository would be able
6354 to start trial builds, but unfortunately the buildmaster does not, in
6355 general, have access to VC system's user list.
6357 As a result, the @code{TryScheduler} requires a bit more
6358 configuration. There are currently two ways to set this up:
6360 @table @strong
6361 @item jobdir (ssh)
6363 This approach creates a command queue directory, called the
6364 ``jobdir'', in the buildmaster's working directory. The buildmaster
6365 admin sets the ownership and permissions of this directory to only
6366 grant write access to the desired set of developers, all of whom must
6367 have accounts on the machine. The @code{buildbot try} command creates
6368 a special file containing the source stamp information and drops it in
6369 the jobdir, just like a standard maildir. When the buildmaster notices
6370 the new file, it unpacks the information inside and starts the builds.
6372 The config file entries used by 'buildbot try' either specify a local
6373 queuedir (for which write and mv are used) or a remote one (using scp
6374 and ssh).
6376 The advantage of this scheme is that it is quite secure, the
6377 disadvantage is that it requires fiddling outside the buildmaster
6378 config (to set the permissions on the jobdir correctly). If the
6379 buildmaster machine happens to also house the VC repository, then it
6380 can be fairly easy to keep the VC userlist in sync with the
6381 trial-build userlist. If they are on different machines, this will be
6382 much more of a hassle. It may also involve granting developer accounts
6383 on a machine that would not otherwise require them.
6385 To implement this, the buildslave invokes 'ssh -l username host
6386 buildbot tryserver ARGS', passing the patch contents over stdin. The
6387 arguments must include the inlet directory and the revision
6388 information.
6390 @item user+password (PB)
6392 In this approach, each developer gets a username/password pair, which
6393 are all listed in the buildmaster's configuration file. When the
6394 developer runs @code{buildbot try}, their machine connects to the
6395 buildmaster via PB and authenticates themselves using that username
6396 and password, then sends a PB command to start the trial build.
6398 The advantage of this scheme is that the entire configuration is
6399 performed inside the buildmaster's config file. The disadvantages are
6400 that it is less secure (while the ``cred'' authentication system does
6401 not expose the password in plaintext over the wire, it does not offer
6402 most of the other security properties that SSH does). In addition, the
6403 buildmaster admin is responsible for maintaining the username/password
6404 list, adding and deleting entries as developers come and go.
6406 @end table
6409 For example, to set up the ``jobdir'' style of trial build, using a
6410 command queue directory of @file{MASTERDIR/jobdir} (and assuming that
6411 all your project developers were members of the @code{developers} unix
6412 group), you would first create that directory (with @command{mkdir
6413 MASTERDIR/jobdir MASTERDIR/jobdir/new MASTERDIR/jobdir/cur
6414 MASTERDIR/jobdir/tmp; chgrp developers MASTERDIR/jobdir
6415 MASTERDIR/jobdir/*; chmod g+rwx,o-rwx MASTERDIR/jobdir
6416 MASTERDIR/jobdir/*}), and then use the following scheduler in the
6417 buildmaster's config file:
6419 @example
6420 from buildbot.scheduler import Try_Jobdir
6421 s = Try_Jobdir("try1", ["full-linux", "full-netbsd", "full-OSX"],
6422                jobdir="jobdir")
6423 c['schedulers'] = [s]
6424 @end example
6426 Note that you must create the jobdir before telling the buildmaster to
6427 use this configuration, otherwise you will get an error. Also remember
6428 that the buildmaster must be able to read and write to the jobdir as
6429 well. Be sure to watch the @file{twistd.log} file (@pxref{Logfiles})
6430 as you start using the jobdir, to make sure the buildmaster is happy
6431 with it.
6433 To use the username/password form of authentication, create a
6434 @code{Try_Userpass} instance instead. It takes the same
6435 @code{builderNames} argument as the @code{Try_Jobdir} form, but
6436 accepts an addtional @code{port} argument (to specify the TCP port to
6437 listen on) and a @code{userpass} list of username/password pairs to
6438 accept. Remember to use good passwords for this: the security of the
6439 buildslave accounts depends upon it:
6441 @example
6442 from buildbot.scheduler import Try_Userpass
6443 s = Try_Userpass("try2", ["full-linux", "full-netbsd", "full-OSX"],
6444                  port=8031, userpass=[("alice","pw1"), ("bob", "pw2")] )
6445 c['schedulers'] = [s]
6446 @end example
6448 Like most places in the buildbot, the @code{port} argument takes a
6449 strports specification. See @code{twisted.application.strports} for
6450 details.
6453 @heading locating the master
6455 The @command{try} command needs to be told how to connect to the
6456 @code{TryScheduler}, and must know which of the authentication
6457 approaches described above is in use by the buildmaster. You specify
6458 the approach by using @option{--connect=ssh} or @option{--connect=pb}
6459 (or @code{try_connect = 'ssh'} or @code{try_connect = 'pb'} in
6460 @file{.buildbot/options}).
6462 For the PB approach, the command must be given a @option{--master}
6463 argument (in the form HOST:PORT) that points to TCP port that you
6464 picked in the @code{Try_Userpass} scheduler. It also takes a
6465 @option{--username} and @option{--passwd} pair of arguments that match
6466 one of the entries in the buildmaster's @code{userpass} list. These
6467 arguments can also be provided as @code{try_master},
6468 @code{try_username}, and @code{try_password} entries in the
6469 @file{.buildbot/options} file.
6471 For the SSH approach, the command must be given @option{--tryhost},
6472 @option{--username}, and optionally @option{--password} (TODO:
6473 really?) to get to the buildmaster host. It must also be given
6474 @option{--trydir}, which points to the inlet directory configured
6475 above. The trydir can be relative to the user's home directory, but
6476 most of the time you will use an explicit path like
6477 @file{~buildbot/project/trydir}. These arguments can be provided in
6478 @file{.buildbot/options} as @code{try_host}, @code{try_username},
6479 @code{try_password}, and @code{try_dir}.
6481 In addition, the SSH approach needs to connect to a PBListener status
6482 port, so it can retrieve and report the results of the build (the PB
6483 approach uses the existing connection to retrieve status information,
6484 so this step is not necessary). This requires a @option{--master}
6485 argument, or a @code{masterstatus} entry in @file{.buildbot/options},
6486 in the form of a HOSTNAME:PORT string.
6489 @heading choosing the Builders
6491 A trial build is performed on multiple Builders at the same time, and
6492 the developer gets to choose which Builders are used (limited to a set
6493 selected by the buildmaster admin with the TryScheduler's
6494 @code{builderNames=} argument). The set you choose will depend upon
6495 what your goals are: if you are concerned about cross-platform
6496 compatibility, you should use multiple Builders, one from each
6497 platform of interest. You might use just one builder if that platform
6498 has libraries or other facilities that allow better test coverage than
6499 what you can accomplish on your own machine, or faster test runs.
6501 The set of Builders to use can be specified with multiple
6502 @option{--builder} arguments on the command line. It can also be
6503 specified with a single @code{try_builders} option in
6504 @file{.buildbot/options} that uses a list of strings to specify all
6505 the Builder names:
6507 @example
6508 try_builders = ["full-OSX", "full-win32", "full-linux"]
6509 @end example
6511 @heading specifying the VC system
6513 The @command{try} command also needs to know how to take the
6514 developer's current tree and extract the (revision, patch)
6515 source-stamp pair. Each VC system uses a different process, so you
6516 start by telling the @command{try} command which VC system you are
6517 using, with an argument like @option{--vc=cvs} or @option{--vc=tla}.
6518 This can also be provided as @code{try_vc} in
6519 @file{.buildbot/options}.
6521 The following names are recognized: @code{cvs} @code{svn} @code{baz}
6522 @code{tla} @code{hg} @code{darcs}
6525 @heading finding the top of the tree
6527 Some VC systems (notably CVS and SVN) track each directory
6528 more-or-less independently, which means the @command{try} command
6529 needs to move up to the top of the project tree before it will be able
6530 to construct a proper full-tree patch. To accomplish this, the
6531 @command{try} command will crawl up through the parent directories
6532 until it finds a marker file. The default name for this marker file is
6533 @file{.buildbot-top}, so when you are using CVS or SVN you should
6534 @code{touch .buildbot-top} from the top of your tree before running
6535 @command{buildbot try}. Alternatively, you can use a filename like
6536 @file{ChangeLog} or @file{README}, since many projects put one of
6537 these files in their top-most directory (and nowhere else). To set
6538 this filename, use @option{--try-topfile=ChangeLog}, or set it in the
6539 options file with @code{try_topfile = 'ChangeLog'}.
6541 You can also manually set the top of the tree with
6542 @option{--try-topdir=~/trees/mytree}, or @code{try_topdir =
6543 '~/trees/mytree'}. If you use @code{try_topdir}, in a
6544 @file{.buildbot/options} file, you will need a separate options file
6545 for each tree you use, so it may be more convenient to use the
6546 @code{try_topfile} approach instead.
6548 Other VC systems which work on full projects instead of individual
6549 directories (tla, baz, darcs, monotone, mercurial) do not require
6550 @command{try} to know the top directory, so the @option{--try-topfile}
6551 and @option{--try-topdir} arguments will be ignored.
6552 @c is this true? I think I currently require topdirs all the time.
6554 If the @command{try} command cannot find the top directory, it will
6555 abort with an error message.
6557 @heading determining the branch name
6559 Some VC systems record the branch information in a way that ``try''
6560 can locate it, in particular Arch (both @command{tla} and
6561 @command{baz}). For the others, if you are using something other than
6562 the default branch, you will have to tell the buildbot which branch
6563 your tree is using. You can do this with either the @option{--branch}
6564 argument, or a @option{try_branch} entry in the
6565 @file{.buildbot/options} file.
6567 @heading determining the revision and patch
6569 Each VC system has a separate approach for determining the tree's base
6570 revision and computing a patch.
6572 @table @code
6574 @item CVS
6576 @command{try} pretends that the tree is up to date. It converts the
6577 current time into a @code{-D} time specification, uses it as the base
6578 revision, and computes the diff between the upstream tree as of that
6579 point in time versus the current contents. This works, more or less,
6580 but requires that the local clock be in reasonably good sync with the
6581 repository.
6583 @item SVN
6584 @command{try} does a @code{svn status -u} to find the latest
6585 repository revision number (emitted on the last line in the ``Status
6586 against revision: NN'' message). It then performs an @code{svn diff
6587 -rNN} to find out how your tree differs from the repository version,
6588 and sends the resulting patch to the buildmaster. If your tree is not
6589 up to date, this will result in the ``try'' tree being created with
6590 the latest revision, then @emph{backwards} patches applied to bring it
6591 ``back'' to the version you actually checked out (plus your actual
6592 code changes), but this will still result in the correct tree being
6593 used for the build.
6595 @item baz
6596 @command{try} does a @code{baz tree-id} to determine the
6597 fully-qualified version and patch identifier for the tree
6598 (ARCHIVE/VERSION--patch-NN), and uses the VERSION--patch-NN component
6599 as the base revision. It then does a @code{baz diff} to obtain the
6600 patch.
6602 @item tla
6603 @command{try} does a @code{tla tree-version} to get the
6604 fully-qualified version identifier (ARCHIVE/VERSION), then takes the
6605 first line of @code{tla logs --reverse} to figure out the base
6606 revision. Then it does @code{tla changes --diffs} to obtain the patch.
6608 @item Darcs
6609 @code{darcs changes --context} emits a text file that contains a list
6610 of all patches back to and including the last tag was made. This text
6611 file (plus the location of a repository that contains all these
6612 patches) is sufficient to re-create the tree. Therefore the contents
6613 of this ``context'' file @emph{are} the revision stamp for a
6614 Darcs-controlled source tree.
6616 So @command{try} does a @code{darcs changes --context} to determine
6617 what your tree's base revision is, and then does a @code{darcs diff
6618 -u} to compute the patch relative to that revision.
6620 @item Mercurial
6621 @code{hg identify} emits a short revision ID (basically a truncated
6622 SHA1 hash of the current revision's contents), which is used as the
6623 base revision. @code{hg diff} then provides the patch relative to that
6624 revision. For @command{try} to work, your working directory must only
6625 have patches that are available from the same remotely-available
6626 repository that the build process' @code{step.Mercurial} will use.
6628 @c TODO: monotone, git
6629 @end table
6631 @heading waiting for results
6633 If you provide the @option{--wait} option (or @code{try_wait = True}
6634 in @file{.buildbot/options}), the @command{buildbot try} command will
6635 wait until your changes have either been proven good or bad before
6636 exiting. Unless you use the @option{--quiet} option (or
6637 @code{try_quiet=True}), it will emit a progress message every 60
6638 seconds until the builds have completed.
6640 @menu
6641 * try --diff::                  
6642 @end menu
6644 @node try --diff,  , try, try
6645 @subsubsection try --diff
6647 Sometimes you might have a patch from someone else that you want to
6648 submit to the buildbot. For example, a user may have created a patch
6649 to fix some specific bug and sent it to you by email. You've inspected
6650 the patch and suspect that it might do the job (and have at least
6651 confirmed that it doesn't do anything evil). Now you want to test it
6652 out.
6654 One approach would be to check out a new local tree, apply the patch,
6655 run your local tests, then use ``buildbot try'' to run the tests on
6656 other platforms. An alternate approach is to use the @command{buildbot
6657 try --diff} form to have the buildbot test the patch without using a
6658 local tree.
6660 This form takes a @option{--diff} argument which points to a file that
6661 contains the patch you want to apply. By default this patch will be
6662 applied to the TRUNK revision, but if you give the optional
6663 @option{--baserev} argument, a tree of the given revision will be used
6664 as a starting point instead of TRUNK.
6666 You can also use @command{buildbot try --diff=-} to read the patch
6667 from stdin.
6669 Each patch has a ``patchlevel'' associated with it. This indicates the
6670 number of slashes (and preceding pathnames) that should be stripped
6671 before applying the diff. This exactly corresponds to the @option{-p}
6672 or @option{--strip} argument to the @command{patch} utility. By
6673 default @command{buildbot try --diff} uses a patchlevel of 0, but you
6674 can override this with the @option{-p} argument.
6676 When you use @option{--diff}, you do not need to use any of the other
6677 options that relate to a local tree, specifically @option{--vc},
6678 @option{--try-topfile}, or @option{--try-topdir}. These options will
6679 be ignored. Of course you must still specify how to get to the
6680 buildmaster (with @option{--connect}, @option{--tryhost}, etc).
6683 @node Other Tools, .buildbot config directory, Developer Tools, Command-line tool
6684 @section Other Tools
6686 These tools are generally used by buildmaster administrators.
6688 @menu
6689 * sendchange::                  
6690 * debugclient::                 
6691 @end menu
6693 @node sendchange, debugclient, Other Tools, Other Tools
6694 @subsection sendchange
6696 This command is used to tell the buildmaster about source changes. It
6697 is intended to be used from within a commit script, installed on the
6698 VC server. It requires that you have a PBChangeSource
6699 (@pxref{PBChangeSource}) running in the buildmaster (by being set in
6700 @code{c['change_source']}).
6703 @example
6704 buildbot sendchange --master @var{MASTERHOST}:@var{PORT} --username @var{USER} @var{FILENAMES..}
6705 @end example
6707 There are other (optional) arguments which can influence the
6708 @code{Change} that gets submitted:
6710 @table @code
6711 @item --branch
6712 This provides the (string) branch specifier. If omitted, it defaults
6713 to None, indicating the ``default branch''. All files included in this
6714 Change must be on the same branch.
6716 @item --revision_number
6717 This provides a (numeric) revision number for the change, used for VC systems
6718 that use numeric transaction numbers (like Subversion).
6720 @item --revision
6721 This provides a (string) revision specifier, for VC systems that use
6722 strings (Arch would use something like patch-42 etc).
6724 @item --revision_file
6725 This provides a filename which will be opened and the contents used as
6726 the revision specifier. This is specifically for Darcs, which uses the
6727 output of @command{darcs changes --context} as a revision specifier.
6728 This context file can be a couple of kilobytes long, spanning a couple
6729 lines per patch, and would be a hassle to pass as a command-line
6730 argument.
6732 @item --comments
6733 This provides the change comments as a single argument. You may want
6734 to use @option{--logfile} instead.
6736 @item --logfile
6737 This instructs the tool to read the change comments from the given
6738 file. If you use @code{-} as the filename, the tool will read the
6739 change comments from stdin.
6740 @end table
6743 @node debugclient,  , sendchange, Other Tools
6744 @subsection debugclient
6746 @example
6747 buildbot debugclient --master @var{MASTERHOST}:@var{PORT} --passwd @var{DEBUGPW}
6748 @end example
6750 This launches a small Gtk+/Glade-based debug tool, connecting to the
6751 buildmaster's ``debug port''. This debug port shares the same port
6752 number as the slaveport (@pxref{Setting the slaveport}), but the
6753 @code{debugPort} is only enabled if you set a debug password in the
6754 buildmaster's config file (@pxref{Debug options}). The
6755 @option{--passwd} option must match the @code{c['debugPassword']}
6756 value.
6758 @option{--master} can also be provided in @file{.debug/options} by the
6759 @code{master} key. @option{--passwd} can be provided by the
6760 @code{debugPassword} key.
6762 The @code{Connect} button must be pressed before any of the other
6763 buttons will be active. This establishes the connection to the
6764 buildmaster. The other sections of the tool are as follows:
6766 @table @code
6767 @item Reload .cfg
6768 Forces the buildmaster to reload its @file{master.cfg} file. This is
6769 equivalent to sending a SIGHUP to the buildmaster, but can be done
6770 remotely through the debug port. Note that it is a good idea to be
6771 watching the buildmaster's @file{twistd.log} as you reload the config
6772 file, as any errors which are detected in the config file will be
6773 announced there.
6775 @item Rebuild .py
6776 (not yet implemented). The idea here is to use Twisted's ``rebuild''
6777 facilities to replace the buildmaster's running code with a new
6778 version. Even if this worked, it would only be used by buildbot
6779 developers.
6781 @item poke IRC
6782 This locates a @code{words.IRC} status target and causes it to emit a
6783 message on all the channels to which it is currently connected. This
6784 was used to debug a problem in which the buildmaster lost the
6785 connection to the IRC server and did not attempt to reconnect.
6787 @item Commit
6788 This allows you to inject a Change, just as if a real one had been
6789 delivered by whatever VC hook you are using. You can set the name of
6790 the committed file and the name of the user who is doing the commit.
6791 Optionally, you can also set a revision for the change. If the
6792 revision you provide looks like a number, it will be sent as an
6793 integer, otherwise it will be sent as a string.
6795 @item Force Build
6796 This lets you force a Builder (selected by name) to start a build of
6797 the current source tree.
6799 @item Currently
6800 (obsolete). This was used to manually set the status of the given
6801 Builder, but the status-assignment code was changed in an incompatible
6802 way and these buttons are no longer meaningful.
6804 @end table
6807 @node .buildbot config directory,  , Other Tools, Command-line tool
6808 @section .buildbot config directory
6810 Many of the @command{buildbot} tools must be told how to contact the
6811 buildmaster that they interact with. This specification can be
6812 provided as a command-line argument, but most of the time it will be
6813 easier to set them in an ``options'' file. The @command{buildbot}
6814 command will look for a special directory named @file{.buildbot},
6815 starting from the current directory (where the command was run) and
6816 crawling upwards, eventually looking in the user's home directory. It
6817 will look for a file named @file{options} in this directory, and will
6818 evaluate it as a python script, looking for certain names to be set.
6819 You can just put simple @code{name = 'value'} pairs in this file to
6820 set the options.
6822 For a description of the names used in this file, please see the
6823 documentation for the individual @command{buildbot} sub-commands. The
6824 following is a brief sample of what this file's contents could be.
6826 @example
6827 # for status-reading tools
6828 masterstatus = 'buildbot.example.org:12345'
6829 # for 'sendchange' or the debug port
6830 master = 'buildbot.example.org:18990'
6831 debugPassword = 'eiv7Po'
6832 @end example
6834 @table @code
6835 @item masterstatus
6836 Location of the @code{client.PBListener} status port, used by
6837 @command{statuslog} and @command{statusgui}.
6839 @item master
6840 Location of the @code{debugPort} (for @command{debugclient}). Also the
6841 location of the @code{pb.PBChangeSource} (for @command{sendchange}).
6842 Usually shares the slaveport, but a future version may make it
6843 possible to have these listen on a separate port number.
6845 @item debugPassword
6846 Must match the value of @code{c['debugPassword']}, used to protect the
6847 debug port, for the @command{debugclient} command.
6849 @item username
6850 Provides a default username for the @command{sendchange} command.
6852 @end table
6855 The following options are used by the @code{buildbot try} command
6856 (@pxref{try}):
6858 @table @code
6859 @item try_connect
6860 This specifies how the ``try'' command should deliver its request to
6861 the buildmaster. The currently accepted values are ``ssh'' and ``pb''.
6862 @item try_builders
6863 Which builders should be used for the ``try'' build.
6864 @item try_vc
6865 This specifies the version control system being used.
6866 @item try_branch
6867 This indicates that the current tree is on a non-trunk branch.
6868 @item try_topdir
6869 @item try_topfile
6870 Use @code{try_topdir} to explicitly indicate the top of your working
6871 tree, or @code{try_topfile} to name a file that will only be found in
6872 that top-most directory.
6874 @item try_host
6875 @item try_username
6876 @item try_dir
6877 When try_connect is ``ssh'', the command will pay attention to
6878 @code{try_host}, @code{try_username}, and @code{try_dir}.
6880 @item try_username
6881 @item try_password
6882 @item try_master
6883 Instead, when @code{try_connect} is ``pb'', the command will pay
6884 attention to @code{try_username}, @code{try_password}, and
6885 @code{try_master}.
6887 @item try_wait
6888 @item masterstatus
6889 @code{try_wait} and @code{masterstatus} are used to ask the ``try''
6890 command to wait for the requested build to complete.
6892 @end table
6896 @node Resources, Developer's Appendix, Command-line tool, Top
6897 @chapter Resources
6899 The Buildbot's home page is at @uref{http://buildbot.sourceforge.net/}
6901 For configuration questions and general discussion, please use the
6902 @code{buildbot-devel} mailing list. The subscription instructions and
6903 archives are available at
6904 @uref{http://lists.sourceforge.net/lists/listinfo/buildbot-devel}
6906 @node Developer's Appendix, Index of Useful Classes, Resources, Top
6907 @unnumbered Developer's Appendix
6909 This appendix contains random notes about the implementation of the
6910 Buildbot, and is likely to only be of use to people intending to
6911 extend the Buildbot's internals.
6913 The buildmaster consists of a tree of Service objects, which is shaped
6914 as follows:
6916 @example
6917 BuildMaster
6918  ChangeMaster  (in .change_svc)
6919   [IChangeSource instances]
6920  [IScheduler instances]  (in .schedulers)
6921  BotMaster  (in .botmaster)
6922  [IStatusTarget instances]  (in .statusTargets)
6923 @end example
6925 The BotMaster has a collection of Builder objects as values of its
6926 @code{.builders} dictionary.
6929 @node Index of Useful Classes, Index of master.cfg keys, Developer's Appendix, Top
6930 @unnumbered Index of Useful Classes
6932 This is a list of all user-visible classes. There are the ones that
6933 are useful in @file{master.cfg}, the buildmaster's configuration file.
6934 Classes that are not listed here are generally internal things that
6935 admins are unlikely to have much use for.
6938 @heading Change Sources
6939 @printindex cs
6941 @heading Schedulers and Locks
6942 @printindex sl
6944 @heading Build Factories
6945 @printindex bf
6947 @heading Build Steps
6948 @printindex bs
6950 @c undocumented steps
6951 @bsindex buildbot.steps.source.Git
6952 @bsindex buildbot.steps.maxq.MaxQ
6955 @heading Status Targets
6956 @printindex st
6958 @c TODO: undocumented targets
6959 @stindex buildbot.status.mail.MailNotifier
6961 @node Index of master.cfg keys, Index, Index of Useful Classes, Top
6962 @unnumbered Index of master.cfg keys
6964 This is a list of all of the significant keys in master.cfg . Recall
6965 that master.cfg is effectively a small python program with exactly one
6966 responsibility: create a dictionary named @code{BuildmasterConfig}.
6967 The keys of this dictionary are listed here. The beginning of the
6968 master.cfg file typically starts with something like:
6970 @example
6971 BuildmasterConfig = c = @{@}
6972 @end example
6974 Therefore a config key of @code{change_source} will usually appear in
6975 master.cfg as @code{c['change_source']}.
6977 @printindex bc
6980 @node Index,  , Index of master.cfg keys, Top
6981 @unnumbered Index
6983 @printindex cp
6986 @bye