add arg to send email when buildslaves go missing. Closes #64.
[buildbot.git] / docs / buildbot.texinfo
blobe1feef7c2277b9ff4e9502b680b8707affbdedf5
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 Buildslave Specifiers
145 * When Buildslaves Go Missing::  
147 Getting Source Code Changes
149 * Change Sources::              
150 * Choosing ChangeSources::      
151 * CVSToys - PBService::         
152 * Mail-parsing ChangeSources::  
153 * PBChangeSource::              
154 * P4Source::                    
155 * BonsaiPoller::                
156 * SVNPoller::                   
157 * MercurialHook::               
159 Mail-parsing ChangeSources
161 * Subscribing the Buildmaster::  
162 * Using Maildirs::              
163 * Parsing Email Change Messages::  
165 Parsing Email Change Messages
167 * FCMaildirSource::             
168 * SyncmailMaildirSource::       
169 * BonsaiMaildirSource::         
170 * SVNCommitEmailMaildirSource::  
172 Build Process
174 * Build Steps::                 
175 * Interlocks::                  
176 * Build Factories::             
178 Build Steps
180 * Common Parameters::           
181 * Source Checkout::             
182 * ShellCommand::                
183 * Simple ShellCommand Subclasses::  
184 * Python BuildSteps::           
185 * Transferring Files::          
186 * Writing New BuildSteps::      
188 Source Checkout
190 * CVS::                         
191 * SVN::                         
192 * Darcs::                       
193 * Mercurial::                   
194 * Arch::                        
195 * Bazaar::                      
196 * Bzr::                         
197 * P4::                          
199 Simple ShellCommand Subclasses
201 * Configure::                   
202 * Compile::                     
203 * Test::                        
204 * Build Properties::            
206 Python BuildSteps
208 * BuildEPYDoc::                 
209 * PyFlakes::                    
211 Writing New BuildSteps
213 * BuildStep LogFiles::          
214 * Reading Logfiles::            
215 * Adding LogObservers::         
216 * BuildStep URLs::              
218 Build Factories
220 * BuildStep Objects::           
221 * BuildFactory::                
222 * Process-Specific build factories::  
224 BuildStep Objects
226 * BuildFactory Attributes::     
227 * Quick builds::                
229 BuildFactory
231 * BuildFactory Attributes::     
232 * Quick builds::                
234 Process-Specific build factories
236 * GNUAutoconf::                 
237 * CPAN::                        
238 * Python distutils::            
239 * Python/Twisted/trial projects::  
241 Status Delivery
243 * HTML Waterfall::              
244 * WebStatus::                   
245 * MailNotifier::                
246 * IRC Bot::                     
247 * PBListener::                  
248 * Writing New Status Plugins::  
250 WebStatus
252 * Buildbot Web Resources::      
253 * XMLRPC server::               
255 Command-line tool
257 * Administrator Tools::         
258 * Developer Tools::             
259 * Other Tools::                 
260 * .buildbot config directory::  
262 Developer Tools
264 * statuslog::                   
265 * statusgui::                   
266 * try::                         
268 waiting for results
270 * try --diff::                  
272 Other Tools
274 * sendchange::                  
275 * debugclient::                 
277 @end detailmenu
278 @end menu
280 @node Introduction, Installation, Top, Top
281 @chapter Introduction
283 @cindex introduction
285 The BuildBot is a system to automate the compile/test cycle required by most
286 software projects to validate code changes. By automatically rebuilding and
287 testing the tree each time something has changed, build problems are
288 pinpointed quickly, before other developers are inconvenienced by the
289 failure. The guilty developer can be identified and harassed without human
290 intervention. By running the builds on a variety of platforms, developers
291 who do not have the facilities to test their changes everywhere before
292 checkin will at least know shortly afterwards whether they have broken the
293 build or not. Warning counts, lint checks, image size, compile time, and
294 other build parameters can be tracked over time, are more visible, and
295 are therefore easier to improve.
297 The overall goal is to reduce tree breakage and provide a platform to
298 run tests or code-quality checks that are too annoying or pedantic for
299 any human to waste their time with. Developers get immediate (and
300 potentially public) feedback about their changes, encouraging them to
301 be more careful about testing before checkin.
303 Features:
305 @itemize @bullet
306 @item
307 run builds on a variety of slave platforms
308 @item
309 arbitrary build process: handles projects using C, Python, whatever
310 @item
311 minimal host requirements: python and Twisted
312 @item
313 slaves can be behind a firewall if they can still do checkout
314 @item
315 status delivery through web page, email, IRC, other protocols
316 @item
317 track builds in progress, provide estimated completion time
318 @item
319 flexible configuration by subclassing generic build process classes
320 @item
321 debug tools to force a new build, submit fake Changes, query slave status
322 @item
323 released under the GPL
324 @end itemize
326 @menu
327 * History and Philosophy::      
328 * System Architecture::         
329 * Control Flow::                
330 @end menu
333 @node History and Philosophy, System Architecture, Introduction, Introduction
334 @section History and Philosophy
336 @cindex Philosophy of operation
338 The Buildbot was inspired by a similar project built for a development
339 team writing a cross-platform embedded system. The various components
340 of the project were supposed to compile and run on several flavors of
341 unix (linux, solaris, BSD), but individual developers had their own
342 preferences and tended to stick to a single platform. From time to
343 time, incompatibilities would sneak in (some unix platforms want to
344 use @code{string.h}, some prefer @code{strings.h}), and then the tree
345 would compile for some developers but not others. The buildbot was
346 written to automate the human process of walking into the office,
347 updating a tree, compiling (and discovering the breakage), finding the
348 developer at fault, and complaining to them about the problem they had
349 introduced. With multiple platforms it was difficult for developers to
350 do the right thing (compile their potential change on all platforms);
351 the buildbot offered a way to help.
353 Another problem was when programmers would change the behavior of a
354 library without warning its users, or change internal aspects that
355 other code was (unfortunately) depending upon. Adding unit tests to
356 the codebase helps here: if an application's unit tests pass despite
357 changes in the libraries it uses, you can have more confidence that
358 the library changes haven't broken anything. Many developers
359 complained that the unit tests were inconvenient or took too long to
360 run: having the buildbot run them reduces the developer's workload to
361 a minimum.
363 In general, having more visibility into the project is always good,
364 and automation makes it easier for developers to do the right thing.
365 When everyone can see the status of the project, developers are
366 encouraged to keep the tree in good working order. Unit tests that
367 aren't run on a regular basis tend to suffer from bitrot just like
368 code does: exercising them on a regular basis helps to keep them
369 functioning and useful.
371 The current version of the Buildbot is additionally targeted at
372 distributed free-software projects, where resources and platforms are
373 only available when provided by interested volunteers. The buildslaves
374 are designed to require an absolute minimum of configuration, reducing
375 the effort a potential volunteer needs to expend to be able to
376 contribute a new test environment to the project. The goal is for
377 anyone who wishes that a given project would run on their favorite
378 platform should be able to offer that project a buildslave, running on
379 that platform, where they can verify that their portability code
380 works, and keeps working.
382 @node System Architecture, Control Flow, History and Philosophy, Introduction
383 @comment  node-name,  next,  previous,  up
384 @section System Architecture
386 The Buildbot consists of a single @code{buildmaster} and one or more
387 @code{buildslaves}, connected in a star topology. The buildmaster
388 makes all decisions about what, when, and how to build. It sends
389 commands to be run on the build slaves, which simply execute the
390 commands and return the results. (certain steps involve more local
391 decision making, where the overhead of sending a lot of commands back
392 and forth would be inappropriate, but in general the buildmaster is
393 responsible for everything).
395 The buildmaster is usually fed @code{Changes} by some sort of version
396 control system (@pxref{Change Sources}), which may cause builds to be
397 run. As the builds are performed, various status messages are
398 produced, which are then sent to any registered Status Targets
399 (@pxref{Status Delivery}).
401 @c @image{FILENAME, WIDTH, HEIGHT, ALTTEXT, EXTENSION}
402 @image{images/overview,,,Overview Diagram,}
404 The buildmaster is configured and maintained by the ``buildmaster
405 admin'', who is generally the project team member responsible for
406 build process issues. Each buildslave is maintained by a ``buildslave
407 admin'', who do not need to be quite as involved. Generally slaves are
408 run by anyone who has an interest in seeing the project work well on
409 their favorite platform.
411 @menu
412 * BuildSlave Connections::      
413 * Buildmaster Architecture::    
414 * Status Delivery Architecture::  
415 @end menu
417 @node BuildSlave Connections, Buildmaster Architecture, System Architecture, System Architecture
418 @subsection BuildSlave Connections
420 The buildslaves are typically run on a variety of separate machines,
421 at least one per platform of interest. These machines connect to the
422 buildmaster over a TCP connection to a publically-visible port. As a
423 result, the buildslaves can live behind a NAT box or similar
424 firewalls, as long as they can get to buildmaster. The TCP connections
425 are initiated by the buildslave and accepted by the buildmaster, but
426 commands and results travel both ways within this connection. The
427 buildmaster is always in charge, so all commands travel exclusively
428 from the buildmaster to the buildslave.
430 To perform builds, the buildslaves must typically obtain source code
431 from a CVS/SVN/etc repository. Therefore they must also be able to
432 reach the repository. The buildmaster provides instructions for
433 performing builds, but does not provide the source code itself.
435 @image{images/slaves,,,BuildSlave Connections,}
437 @node Buildmaster Architecture, Status Delivery Architecture, BuildSlave Connections, System Architecture
438 @subsection Buildmaster Architecture
440 The Buildmaster consists of several pieces:
442 @image{images/master,,,BuildMaster Architecture,}
444 @itemize @bullet
446 @item
447 Change Sources, which create a Change object each time something is
448 modified in the VC repository. Most ChangeSources listen for messages
449 from a hook script of some sort. Some sources actively poll the
450 repository on a regular basis. All Changes are fed to the Schedulers.
452 @item
453 Schedulers, which decide when builds should be performed. They collect
454 Changes into BuildRequests, which are then queued for delivery to
455 Builders until a buildslave is available.
457 @item
458 Builders, which control exactly @emph{how} each build is performed
459 (with a series of BuildSteps, configured in a BuildFactory). Each
460 Build is run on a single buildslave.
462 @item
463 Status plugins, which deliver information about the build results
464 through protocols like HTTP, mail, and IRC.
466 @end itemize
468 @image{images/slavebuilder,,,SlaveBuilders,}
470 Each Builder is configured with a list of BuildSlaves that it will use
471 for its builds. These buildslaves are expected to behave identically:
472 the only reason to use multiple BuildSlaves for a single Builder is to
473 provide a measure of load-balancing.
475 Within a single BuildSlave, each Builder creates its own SlaveBuilder
476 instance. These SlaveBuilders operate independently from each other.
477 Each gets its own base directory to work in. It is quite common to
478 have many Builders sharing the same buildslave. For example, there
479 might be two buildslaves: one for i386, and a second for PowerPC.
480 There may then be a pair of Builders that do a full compile/test run,
481 one for each architecture, and a lone Builder that creates snapshot
482 source tarballs if the full builders complete successfully. The full
483 builders would each run on a single buildslave, whereas the tarball
484 creation step might run on either buildslave (since the platform
485 doesn't matter when creating source tarballs). In this case, the
486 mapping would look like:
488 @example
489 Builder(full-i386)  ->  BuildSlaves(slave-i386)
490 Builder(full-ppc)   ->  BuildSlaves(slave-ppc)
491 Builder(source-tarball) -> BuildSlaves(slave-i386, slave-ppc)
492 @end example
494 and each BuildSlave would have two SlaveBuilders inside it, one for a
495 full builder, and a second for the source-tarball builder.
497 Once a SlaveBuilder is available, the Builder pulls one or more
498 BuildRequests off its incoming queue. (It may pull more than one if it
499 determines that it can merge the requests together; for example, there
500 may be multiple requests to build the current HEAD revision). These
501 requests are merged into a single Build instance, which includes the
502 SourceStamp that describes what exact version of the source code
503 should be used for the build. The Build is then randomly assigned to a
504 free SlaveBuilder and the build begins.
507 @node Status Delivery Architecture,  , Buildmaster Architecture, System Architecture
508 @subsection Status Delivery Architecture
510 The buildmaster maintains a central Status object, to which various
511 status plugins are connected. Through this Status object, a full
512 hierarchy of build status objects can be obtained.
514 @image{images/status,,,Status Delivery,}
516 The configuration file controls which status plugins are active. Each
517 status plugin gets a reference to the top-level Status object. From
518 there they can request information on each Builder, Build, Step, and
519 LogFile. This query-on-demand interface is used by the html.Waterfall
520 plugin to create the main status page each time a web browser hits the
521 main URL.
523 The status plugins can also subscribe to hear about new Builds as they
524 occur: this is used by the MailNotifier to create new email messages
525 for each recently-completed Build.
527 The Status object records the status of old builds on disk in the
528 buildmaster's base directory. This allows it to return information
529 about historical builds.
531 There are also status objects that correspond to Schedulers and
532 BuildSlaves. These allow status plugins to report information about
533 upcoming builds, and the online/offline status of each buildslave.
536 @node Control Flow,  , System Architecture, Introduction
537 @comment  node-name,  next,  previous,  up
538 @section Control Flow
540 A day in the life of the buildbot:
542 @itemize @bullet
544 @item
545 A developer commits some source code changes to the repository. A hook
546 script or commit trigger of some sort sends information about this
547 change to the buildmaster through one of its configured Change
548 Sources. This notification might arrive via email, or over a network
549 connection (either initiated by the buildmaster as it ``subscribes''
550 to changes, or by the commit trigger as it pushes Changes towards the
551 buildmaster). The Change contains information about who made the
552 change, what files were modified, which revision contains the change,
553 and any checkin comments.
555 @item
556 The buildmaster distributes this change to all of its configured
557 Schedulers. Any ``important'' changes cause the ``tree-stable-timer''
558 to be started, and the Change is added to a list of those that will go
559 into a new Build. When the timer expires, a Build is started on each
560 of a set of configured Builders, all compiling/testing the same source
561 code. Unless configured otherwise, all Builds run in parallel on the
562 various buildslaves.
564 @item
565 The Build consists of a series of Steps. Each Step causes some number
566 of commands to be invoked on the remote buildslave associated with
567 that Builder. The first step is almost always to perform a checkout of
568 the appropriate revision from the same VC system that produced the
569 Change. The rest generally perform a compile and run unit tests. As
570 each Step runs, the buildslave reports back command output and return
571 status to the buildmaster.
573 @item
574 As the Build runs, status messages like ``Build Started'', ``Step
575 Started'', ``Build Finished'', etc, are published to a collection of
576 Status Targets. One of these targets is usually the HTML ``Waterfall''
577 display, which shows a chronological list of events, and summarizes
578 the results of the most recent build at the top of each column.
579 Developers can periodically check this page to see how their changes
580 have fared. If they see red, they know that they've made a mistake and
581 need to fix it. If they see green, they know that they've done their
582 duty and don't need to worry about their change breaking anything.
584 @item
585 If a MailNotifier status target is active, the completion of a build
586 will cause email to be sent to any developers whose Changes were
587 incorporated into this Build. The MailNotifier can be configured to
588 only send mail upon failing builds, or for builds which have just
589 transitioned from passing to failing. Other status targets can provide
590 similar real-time notification via different communication channels,
591 like IRC.
593 @end itemize
596 @node Installation, Concepts, Introduction, Top
597 @chapter Installation
599 @menu
600 * Requirements::                
601 * Installing the code::         
602 * Creating a buildmaster::      
603 * Creating a buildslave::       
604 * Launching the daemons::       
605 * Logfiles::                    
606 * Shutdown::                    
607 * Maintenance::                 
608 * Troubleshooting::             
609 @end menu
611 @node Requirements, Installing the code, Installation, Installation
612 @section Requirements
614 At a bare minimum, you'll need the following (for both the buildmaster
615 and a buildslave):
617 @itemize @bullet
618 @item
619 Python: http://www.python.org
621 Buildbot requires python-2.3 or later, and is primarily developed
622 against python-2.4. It is also tested against python-2.5 .
624 @item
625 Twisted: http://twistedmatrix.com
627 Both the buildmaster and the buildslaves require Twisted-2.0.x or
628 later. It has been tested against all releases of Twisted up to
629 Twisted-2.5.0 (the most recent as of this writing). As always, the
630 most recent version is recommended.
632 Twisted is delivered as a collection of subpackages. You'll need at
633 least "Twisted" (the core package), and you'll also want TwistedMail,
634 TwistedWeb, and TwistedWords (for sending email, serving a web status
635 page, and delivering build status via IRC, respectively). You might
636 also want TwistedConch (for the encrypted Manhole debug port). Note
637 that Twisted requires ZopeInterface to be installed as well.
639 @end itemize
641 Certain other packages may be useful on the system running the
642 buildmaster:
644 @itemize @bullet
645 @item
646 CVSToys: http://purl.net/net/CVSToys
648 If your buildmaster uses FreshCVSSource to receive change notification
649 from a cvstoys daemon, it will require CVSToys be installed (tested
650 with CVSToys-1.0.10). If the it doesn't use that source (i.e. if you
651 only use a mail-parsing change source, or the SVN notification
652 script), you will not need CVSToys.
654 @end itemize
656 And of course, your project's build process will impose additional
657 requirements on the buildslaves. These hosts must have all the tools
658 necessary to compile and test your project's source code.
661 @node Installing the code, Creating a buildmaster, Requirements, Installation
662 @section Installing the code
664 @cindex installation
666 The Buildbot is installed using the standard python @code{distutils}
667 module. After unpacking the tarball, the process is:
669 @example
670 python setup.py build
671 python setup.py install
672 @end example
674 where the install step may need to be done as root. This will put the
675 bulk of the code in somewhere like
676 /usr/lib/python2.3/site-packages/buildbot . It will also install the
677 @code{buildbot} command-line tool in /usr/bin/buildbot.
679 To test this, shift to a different directory (like /tmp), and run:
681 @example
682 buildbot --version
683 @end example
685 If it shows you the versions of Buildbot and Twisted, the install went
686 ok. If it says @code{no such command} or it gets an @code{ImportError}
687 when it tries to load the libaries, then something went wrong.
688 @code{pydoc buildbot} is another useful diagnostic tool.
690 Windows users will find these files in other places. You will need to
691 make sure that python can find the libraries, and will probably find
692 it convenient to have @code{buildbot} on your PATH.
694 If you wish, you can run the buildbot unit test suite like this:
696 @example
697 PYTHONPATH=. trial buildbot.test
698 @end example
700 This should run up to 192 tests, depending upon what VC tools you have
701 installed. On my desktop machine it takes about five minutes to
702 complete. Nothing should fail, a few might be skipped. If any of the
703 tests fail, you should stop and investigate the cause before
704 continuing the installation process, as it will probably be easier to
705 track down the bug early.
707 If you cannot or do not wish to install the buildbot into a site-wide
708 location like @file{/usr} or @file{/usr/local}, you can also install
709 it into the account's home directory. Do the install command like
710 this:
712 @example
713 python setup.py install --home=~
714 @end example
716 That will populate @file{~/lib/python} and create
717 @file{~/bin/buildbot}. Make sure this lib directory is on your
718 @code{PYTHONPATH}.
721 @node Creating a buildmaster, Creating a buildslave, Installing the code, Installation
722 @section Creating a buildmaster
724 As you learned earlier (@pxref{System Architecture}), the buildmaster
725 runs on a central host (usually one that is publically visible, so
726 everybody can check on the status of the project), and controls all
727 aspects of the buildbot system. Let us call this host
728 @code{buildbot.example.org}.
730 You may wish to create a separate user account for the buildmaster,
731 perhaps named @code{buildmaster}. This can help keep your personal
732 configuration distinct from that of the buildmaster and is useful if
733 you have to use a mail-based notification system (@pxref{Change
734 Sources}). However, the Buildbot will work just fine with your regular
735 user account.
737 You need to choose a directory for the buildmaster, called the
738 @code{basedir}. This directory will be owned by the buildmaster, which
739 will use configuration files therein, and create status files as it
740 runs. @file{~/Buildbot} is a likely value. If you run multiple
741 buildmasters in the same account, or if you run both masters and
742 slaves, you may want a more distinctive name like
743 @file{~/Buildbot/master/gnomovision} or
744 @file{~/Buildmasters/fooproject}. If you are using a separate user
745 account, this might just be @file{~buildmaster/masters/fooproject}.
747 Once you've picked a directory, use the @command{buildbot
748 create-master} command to create the directory and populate it with
749 startup files:
751 @example
752 buildbot create-master @var{basedir}
753 @end example
755 You will need to create a configuration file (@pxref{Configuration})
756 before starting the buildmaster. Most of the rest of this manual is
757 dedicated to explaining how to do this. A sample configuration file is
758 placed in the working directory, named @file{master.cfg.sample}, which
759 can be copied to @file{master.cfg} and edited to suit your purposes.
761 (Internal details: This command creates a file named
762 @file{buildbot.tac} that contains all the state necessary to create
763 the buildmaster. Twisted has a tool called @code{twistd} which can use
764 this .tac file to create and launch a buildmaster instance. twistd
765 takes care of logging and daemonization (running the program in the
766 background). @file{/usr/bin/buildbot} is a front end which runs twistd
767 for you.)
769 In addition to @file{buildbot.tac}, a small @file{Makefile.sample} is
770 installed. This can be used as the basis for customized daemon startup,
771 @xref{Launching the daemons}.
774 @node Creating a buildslave, Launching the daemons, Creating a buildmaster, Installation
775 @section Creating a buildslave
777 Typically, you will be adding a buildslave to an existing buildmaster,
778 to provide additional architecture coverage. The buildbot
779 administrator will give you several pieces of information necessary to
780 connect to the buildmaster. You should also be somewhat familiar with
781 the project being tested, so you can troubleshoot build problems
782 locally.
784 The buildbot exists to make sure that the project's stated ``how to
785 build it'' process actually works. To this end, the buildslave should
786 run in an environment just like that of your regular developers.
787 Typically the project build process is documented somewhere
788 (@file{README}, @file{INSTALL}, etc), in a document that should
789 mention all library dependencies and contain a basic set of build
790 instructions. This document will be useful as you configure the host
791 and account in which the buildslave runs.
793 Here's a good checklist for setting up a buildslave:
795 @enumerate
796 @item
797 Set up the account
799 It is recommended (although not mandatory) to set up a separate user
800 account for the buildslave. This account is frequently named
801 @code{buildbot} or @code{buildslave}. This serves to isolate your
802 personal working environment from that of the slave's, and helps to
803 minimize the security threat posed by letting possibly-unknown
804 contributors run arbitrary code on your system. The account should
805 have a minimum of fancy init scripts.
807 @item
808 Install the buildbot code
810 Follow the instructions given earlier (@pxref{Installing the code}).
811 If you use a separate buildslave account, and you didn't install the
812 buildbot code to a shared location, then you will need to install it
813 with @code{--home=~} for each account that needs it.
815 @item
816 Set up the host
818 Make sure the host can actually reach the buildmaster. Usually the
819 buildmaster is running a status webserver on the same machine, so
820 simply point your web browser at it and see if you can get there.
821 Install whatever additional packages or libraries the project's
822 INSTALL document advises. (or not: if your buildslave is supposed to
823 make sure that building without optional libraries still works, then
824 don't install those libraries).
826 Again, these libraries don't necessarily have to be installed to a
827 site-wide shared location, but they must be available to your build
828 process. Accomplishing this is usually very specific to the build
829 process, so installing them to @file{/usr} or @file{/usr/local} is
830 usually the best approach.
832 @item
833 Test the build process
835 Follow the instructions in the INSTALL document, in the buildslave's
836 account. Perform a full CVS (or whatever) checkout, configure, make,
837 run tests, etc. Confirm that the build works without manual fussing.
838 If it doesn't work when you do it by hand, it will be unlikely to work
839 when the buildbot attempts to do it in an automated fashion.
841 @item
842 Choose a base directory
844 This should be somewhere in the buildslave's account, typically named
845 after the project which is being tested. The buildslave will not touch
846 any file outside of this directory. Something like @file{~/Buildbot}
847 or @file{~/Buildslaves/fooproject} is appropriate.
849 @item
850 Get the buildmaster host/port, botname, and password
852 When the buildbot admin configures the buildmaster to accept and use
853 your buildslave, they will provide you with the following pieces of
854 information:
856 @itemize @bullet
857 @item
858 your buildslave's name
859 @item
860 the password assigned to your buildslave
861 @item
862 the hostname and port number of the buildmaster, i.e. buildbot.example.org:8007
863 @end itemize
865 @item
866 Create the buildslave
868 Now run the 'buildbot' command as follows:
870 @example
871 buildbot create-slave @var{BASEDIR} @var{MASTERHOST}:@var{PORT} @var{SLAVENAME} @var{PASSWORD}
872 @end example
874 This will create the base directory and a collection of files inside,
875 including the @file{buildbot.tac} file that contains all the
876 information you passed to the @code{buildbot} command.
878 @item
879 Fill in the hostinfo files
881 When it first connects, the buildslave will send a few files up to the
882 buildmaster which describe the host that it is running on. These files
883 are presented on the web status display so that developers have more
884 information to reproduce any test failures that are witnessed by the
885 buildbot. There are sample files in the @file{info} subdirectory of
886 the buildbot's base directory. You should edit these to correctly
887 describe you and your host.
889 @file{BASEDIR/info/admin} should contain your name and email address.
890 This is the ``buildslave admin address'', and will be visible from the
891 build status page (so you may wish to munge it a bit if
892 address-harvesting spambots are a concern).
894 @file{BASEDIR/info/host} should be filled with a brief description of
895 the host: OS, version, memory size, CPU speed, versions of relevant
896 libraries installed, and finally the version of the buildbot code
897 which is running the buildslave.
899 If you run many buildslaves, you may want to create a single
900 @file{~buildslave/info} file and share it among all the buildslaves
901 with symlinks.
903 @end enumerate
905 @menu
906 * Buildslave Options::          
907 @end menu
909 @node Buildslave Options,  , Creating a buildslave, Creating a buildslave
910 @subsection Buildslave Options
912 There are a handful of options you might want to use when creating the
913 buildslave with the @command{buildbot create-slave <options> DIR <params>}
914 command. You can type @command{buildbot create-slave --help} for a summary.
915 To use these, just include them on the @command{buildbot create-slave}
916 command line, like this:
918 @example
919 buildbot create-slave --umask=022 ~/buildslave buildmaster.example.org:42012 myslavename mypasswd
920 @end example
922 @table @code
923 @item --usepty
924 This is a boolean flag that tells the buildslave whether to launch
925 child processes in a PTY (the default) or with regular pipes. The
926 advantage of using a PTY is that ``grandchild'' processes are more
927 likely to be cleaned up if the build is interrupted or times out
928 (since it enables the use of a ``process group'' in which all child
929 processes will be placed). The disadvantages: some forms of Unix have
930 problems with PTYs, some of your unit tests may behave differently
931 when run under a PTY (generally those which check to see if they are
932 being run interactively), and PTYs will merge the stdout and stderr
933 streams into a single output stream (which means the red-vs-black
934 coloring in the logfiles will be lost). If you encounter problems, you
935 can add @code{--usepty=0} to disable the use of PTYs. Note that
936 windows buildslaves never use PTYs.
938 @item --umask
939 This is a string (generally an octal representation of an integer)
940 which will cause the buildslave process' ``umask'' value to be set
941 shortly after initialization. The ``twistd'' daemonization utility
942 forces the umask to 077 at startup (which means that all files created
943 by the buildslave or its child processes will be unreadable by any
944 user other than the buildslave account). If you want build products to
945 be readable by other accounts, you can add @code{--umask=022} to tell
946 the buildslave to fix the umask after twistd clobbers it. If you want
947 build products to be @emph{writable} by other accounts too, use
948 @code{--umask=000}, but this is likely to be a security problem.
950 @item --keepalive
951 This is a number that indicates how frequently ``keepalive'' messages
952 should be sent from the buildslave to the buildmaster, expressed in
953 seconds. The default (600) causes a message to be sent to the
954 buildmaster at least once every 10 minutes. To set this to a lower
955 value, use e.g. @code{--keepalive=120}.
957 If the buildslave is behind a NAT box or stateful firewall, these
958 messages may help to keep the connection alive: some NAT boxes tend to
959 forget about a connection if it has not been used in a while. When
960 this happens, the buildmaster will think that the buildslave has
961 disappeared, and builds will time out. Meanwhile the buildslave will
962 not realize than anything is wrong.
964 @end table
967 @node Launching the daemons, Logfiles, Creating a buildslave, Installation
968 @section Launching the daemons
970 Both the buildmaster and the buildslave run as daemon programs. To
971 launch them, pass the working directory to the @code{buildbot}
972 command:
974 @example
975 buildbot start @var{BASEDIR}
976 @end example
978 This command will start the daemon and then return, so normally it
979 will not produce any output. To verify that the programs are indeed
980 running, look for a pair of files named @file{twistd.log} and
981 @file{twistd.pid} that should be created in the working directory.
982 @file{twistd.pid} contains the process ID of the newly-spawned daemon.
984 When the buildslave connects to the buildmaster, new directories will
985 start appearing in its base directory. The buildmaster tells the slave
986 to create a directory for each Builder which will be using that slave.
987 All build operations are performed within these directories: CVS
988 checkouts, compiles, and tests.
990 Once you get everything running, you will want to arrange for the
991 buildbot daemons to be started at boot time. One way is to use
992 @code{cron}, by putting them in a @@reboot crontab entry@footnote{this
993 @@reboot syntax is understood by Vixie cron, which is the flavor
994 usually provided with linux systems. Other unices may have a cron that
995 doesn't understand @@reboot}:
997 @example
998 @@reboot buildbot start @var{BASEDIR}
999 @end example
1001 When you run @command{crontab} to set this up, remember to do it as
1002 the buildmaster or buildslave account! If you add this to your crontab
1003 when running as your regular account (or worse yet, root), then the
1004 daemon will run as the wrong user, quite possibly as one with more
1005 authority than you intended to provide.
1007 It is important to remember that the environment provided to cron jobs
1008 and init scripts can be quite different that your normal runtime.
1009 There may be fewer environment variables specified, and the PATH may
1010 be shorter than usual. It is a good idea to test out this method of
1011 launching the buildslave by using a cron job with a time in the near
1012 future, with the same command, and then check @file{twistd.log} to
1013 make sure the slave actually started correctly. Common problems here
1014 are for @file{/usr/local} or @file{~/bin} to not be on your
1015 @code{PATH}, or for @code{PYTHONPATH} to not be set correctly.
1016 Sometimes @code{HOME} is messed up too.
1018 To modify the way the daemons are started (perhaps you want to set
1019 some environment variables first, or perform some cleanup each time),
1020 you can create a file named @file{Makefile.buildbot} in the base
1021 directory. When the @file{buildbot} front-end tool is told to
1022 @command{start} the daemon, and it sees this file (and
1023 @file{/usr/bin/make} exists), it will do @command{make -f
1024 Makefile.buildbot start} instead of its usual action (which involves
1025 running @command{twistd}). When the buildmaster or buildslave is
1026 installed, a @file{Makefile.sample} is created which implements the
1027 same behavior as the the @file{buildbot} tool uses, so if you want to
1028 customize the process, just copy @file{Makefile.sample} to
1029 @file{Makefile.buildbot} and edit it as necessary.
1031 @node Logfiles, Shutdown, Launching the daemons, Installation
1032 @section Logfiles
1034 @cindex logfiles
1036 While a buildbot daemon runs, it emits text to a logfile, named
1037 @file{twistd.log}. A command like @code{tail -f twistd.log} is useful
1038 to watch the command output as it runs.
1040 The buildmaster will announce any errors with its configuration file
1041 in the logfile, so it is a good idea to look at the log at startup
1042 time to check for any problems. Most buildmaster activities will cause
1043 lines to be added to the log.
1045 @node Shutdown, Maintenance, Logfiles, Installation
1046 @section Shutdown
1048 To stop a buildmaster or buildslave manually, use:
1050 @example
1051 buildbot stop @var{BASEDIR}
1052 @end example
1054 This simply looks for the @file{twistd.pid} file and kills whatever
1055 process is identified within.
1057 At system shutdown, all processes are sent a @code{SIGKILL}. The
1058 buildmaster and buildslave will respond to this by shutting down
1059 normally.
1061 The buildmaster will respond to a @code{SIGHUP} by re-reading its
1062 config file. The following shortcut is available:
1064 @example
1065 buildbot reconfig @var{BASEDIR}
1066 @end example
1068 When you update the Buildbot code to a new release, you will need to
1069 restart the buildmaster and/or buildslave before it can take advantage
1070 of the new code. You can do a @code{buildbot stop @var{BASEDIR}} and
1071 @code{buildbot start @var{BASEDIR}} in quick succession, or you can
1072 use the @code{restart} shortcut, which does both steps for you:
1074 @example
1075 buildbot restart @var{BASEDIR}
1076 @end example
1079 @node Maintenance, Troubleshooting, Shutdown, Installation
1080 @section Maintenance
1082 It is a good idea to check the buildmaster's status page every once in
1083 a while, to see if your buildslave is still online. Eventually the
1084 buildbot will probably be enhanced to send you email (via the
1085 @file{info/admin} email address) when the slave has been offline for
1086 more than a few hours.
1088 If you find you can no longer provide a buildslave to the project, please
1089 let the project admins know, so they can put out a call for a
1090 replacement.
1092 The Buildbot records status and logs output continually, each time a
1093 build is performed. The status tends to be small, but the build logs
1094 can become quite large. Each build and log are recorded in a separate
1095 file, arranged hierarchically under the buildmaster's base directory.
1096 To prevent these files from growing without bound, you should
1097 periodically delete old build logs. A simple cron job to delete
1098 anything older than, say, two weeks should do the job. The only trick
1099 is to leave the @file{buildbot.tac} and other support files alone, for
1100 which find's @code{-mindepth} argument helps skip everything in the
1101 top directory. You can use something like the following:
1103 @example
1104 @@weekly cd BASEDIR && find . -mindepth 2 -type f -mtime +14 -exec rm @{@} \;
1105 @@weekly cd BASEDIR && find twistd.log* -mtime +14 -exec rm @{@} \;
1106 @end example
1108 @node Troubleshooting,  , Maintenance, Installation
1109 @section Troubleshooting
1111 Here are a few hints on diagnosing common problems.
1113 @menu
1114 * Starting the buildslave::     
1115 * Connecting to the buildmaster::  
1116 * Forcing Builds::              
1117 @end menu
1119 @node Starting the buildslave, Connecting to the buildmaster, Troubleshooting, Troubleshooting
1120 @subsection Starting the buildslave
1122 Cron jobs are typically run with a minimal shell (@file{/bin/sh}, not
1123 @file{/bin/bash}), and tilde expansion is not always performed in such
1124 commands. You may want to use explicit paths, because the @code{PATH}
1125 is usually quite short and doesn't include anything set by your
1126 shell's startup scripts (@file{.profile}, @file{.bashrc}, etc). If
1127 you've installed buildbot (or other python libraries) to an unusual
1128 location, you may need to add a @code{PYTHONPATH} specification (note
1129 that python will do tilde-expansion on @code{PYTHONPATH} elements by
1130 itself). Sometimes it is safer to fully-specify everything:
1132 @example
1133 @@reboot PYTHONPATH=~/lib/python /usr/local/bin/buildbot start /usr/home/buildbot/basedir
1134 @end example
1136 Take the time to get the @@reboot job set up. Otherwise, things will work
1137 fine for a while, but the first power outage or system reboot you have will
1138 stop the buildslave with nothing but the cries of sorrowful developers to
1139 remind you that it has gone away.
1141 @node Connecting to the buildmaster, Forcing Builds, Starting the buildslave, Troubleshooting
1142 @subsection Connecting to the buildmaster
1144 If the buildslave cannot connect to the buildmaster, the reason should
1145 be described in the @file{twistd.log} logfile. Some common problems
1146 are an incorrect master hostname or port number, or a mistyped bot
1147 name or password. If the buildslave loses the connection to the
1148 master, it is supposed to attempt to reconnect with an
1149 exponentially-increasing backoff. Each attempt (and the time of the
1150 next attempt) will be logged. If you get impatient, just manually stop
1151 and re-start the buildslave.
1153 When the buildmaster is restarted, all slaves will be disconnected,
1154 and will attempt to reconnect as usual. The reconnect time will depend
1155 upon how long the buildmaster is offline (i.e. how far up the
1156 exponential backoff curve the slaves have travelled). Again,
1157 @code{buildbot stop @var{BASEDIR}; buildbot start @var{BASEDIR}} will
1158 speed up the process.
1160 @node Forcing Builds,  , Connecting to the buildmaster, Troubleshooting
1161 @subsection Forcing Builds
1163 From the buildmaster's main status web page, you can force a build to
1164 be run on your build slave. Figure out which column is for a builder
1165 that runs on your slave, click on that builder's name, and the page
1166 that comes up will have a ``Force Build'' button. Fill in the form,
1167 hit the button, and a moment later you should see your slave's
1168 @file{twistd.log} filling with commands being run. Using @code{pstree}
1169 or @code{top} should also reveal the cvs/make/gcc/etc processes being
1170 run by the buildslave. Note that the same web page should also show
1171 the @file{admin} and @file{host} information files that you configured
1172 earlier.
1174 @node Concepts, Configuration, Installation, Top
1175 @chapter Concepts
1177 This chapter defines some of the basic concepts that the Buildbot
1178 uses. You'll need to understand how the Buildbot sees the world to
1179 configure it properly.
1181 @menu
1182 * Version Control Systems::     
1183 * Schedulers::                  
1184 * BuildSet::                    
1185 * BuildRequest::                
1186 * Builder::                     
1187 * Users::                       
1188 @end menu
1190 @node Version Control Systems, Schedulers, Concepts, Concepts
1191 @section Version Control Systems
1193 @cindex Version Control
1195 These source trees come from a Version Control System of some kind.
1196 CVS and Subversion are two popular ones, but the Buildbot supports
1197 others. All VC systems have some notion of an upstream
1198 @code{repository} which acts as a server@footnote{except Darcs, but
1199 since the Buildbot never modifies its local source tree we can ignore
1200 the fact that Darcs uses a less centralized model}, from which clients
1201 can obtain source trees according to various parameters. The VC
1202 repository provides source trees of various projects, for different
1203 branches, and from various points in time. The first thing we have to
1204 do is to specify which source tree we want to get.
1206 @menu
1207 * Generalizing VC Systems::     
1208 * Source Tree Specifications::  
1209 * How Different VC Systems Specify Sources::  
1210 * Attributes of Changes::       
1211 @end menu
1213 @node Generalizing VC Systems, Source Tree Specifications, Version Control Systems, Version Control Systems
1214 @subsection Generalizing VC Systems
1216 For the purposes of the Buildbot, we will try to generalize all VC
1217 systems as having repositories that each provide sources for a variety
1218 of projects. Each project is defined as a directory tree with source
1219 files. The individual files may each have revisions, but we ignore
1220 that and treat the project as a whole as having a set of revisions
1221 (CVS is really the only VC system still in widespread use that has
1222 per-file revisions.. everything modern has moved to atomic tree-wide
1223 changesets). Each time someone commits a change to the project, a new
1224 revision becomes available. These revisions can be described by a
1225 tuple with two items: the first is a branch tag, and the second is
1226 some kind of revision stamp or timestamp. Complex projects may have
1227 multiple branch tags, but there is always a default branch. The
1228 timestamp may be an actual timestamp (such as the -D option to CVS),
1229 or it may be a monotonically-increasing transaction number (such as
1230 the change number used by SVN and P4, or the revision number used by
1231 Arch/Baz/Bazaar, or a labeled tag used in CVS)@footnote{many VC
1232 systems provide more complexity than this: in particular the local
1233 views that P4 and ClearCase can assemble out of various source
1234 directories are more complex than we're prepared to take advantage of
1235 here}. The SHA1 revision ID used by Monotone and Mercurial is also a
1236 kind of revision stamp, in that it specifies a unique copy of the
1237 source tree, as does a Darcs ``context'' file.
1239 When we aren't intending to make any changes to the sources we check out
1240 (at least not any that need to be committed back upstream), there are two
1241 basic ways to use a VC system:
1243 @itemize @bullet
1244 @item
1245 Retrieve a specific set of source revisions: some tag or key is used
1246 to index this set, which is fixed and cannot be changed by subsequent
1247 developers committing new changes to the tree. Releases are built from
1248 tagged revisions like this, so that they can be rebuilt again later
1249 (probably with controlled modifications).
1250 @item
1251 Retrieve the latest sources along a specific branch: some tag is used
1252 to indicate which branch is to be used, but within that constraint we want
1253 to get the latest revisions.
1254 @end itemize
1256 Build personnel or CM staff typically use the first approach: the
1257 build that results is (ideally) completely specified by the two
1258 parameters given to the VC system: repository and revision tag. This
1259 gives QA and end-users something concrete to point at when reporting
1260 bugs. Release engineers are also reportedly fond of shipping code that
1261 can be traced back to a concise revision tag of some sort.
1263 Developers are more likely to use the second approach: each morning
1264 the developer does an update to pull in the changes committed by the
1265 team over the last day. These builds are not easy to fully specify: it
1266 depends upon exactly when you did a checkout, and upon what local
1267 changes the developer has in their tree. Developers do not normally
1268 tag each build they produce, because there is usually significant
1269 overhead involved in creating these tags. Recreating the trees used by
1270 one of these builds can be a challenge. Some VC systems may provide
1271 implicit tags (like a revision number), while others may allow the use
1272 of timestamps to mean ``the state of the tree at time X'' as opposed
1273 to a tree-state that has been explicitly marked.
1275 The Buildbot is designed to help developers, so it usually works in
1276 terms of @emph{the latest} sources as opposed to specific tagged
1277 revisions. However, it would really prefer to build from reproducible
1278 source trees, so implicit revisions are used whenever possible.
1280 @node Source Tree Specifications, How Different VC Systems Specify Sources, Generalizing VC Systems, Version Control Systems
1281 @subsection Source Tree Specifications
1283 So for the Buildbot's purposes we treat each VC system as a server
1284 which can take a list of specifications as input and produce a source
1285 tree as output. Some of these specifications are static: they are
1286 attributes of the builder and do not change over time. Others are more
1287 variable: each build will have a different value. The repository is
1288 changed over time by a sequence of Changes, each of which represents a
1289 single developer making changes to some set of files. These Changes
1290 are cumulative@footnote{Monotone's @emph{multiple heads} feature
1291 violates this assumption of cumulative Changes, but in most situations
1292 the changes don't occur frequently enough for this to be a significant
1293 problem}.
1295 For normal builds, the Buildbot wants to get well-defined source trees
1296 that contain specific Changes, and exclude other Changes that may have
1297 occurred after the desired ones. We assume that the Changes arrive at
1298 the buildbot (through one of the mechanisms described in @pxref{Change
1299 Sources}) in the same order in which they are committed to the
1300 repository. The Buildbot waits for the tree to become ``stable''
1301 before initiating a build, for two reasons. The first is that
1302 developers frequently make multiple related commits in quick
1303 succession, even when the VC system provides ways to make atomic
1304 transactions involving multiple files at the same time. Running a
1305 build in the middle of these sets of changes would use an inconsistent
1306 set of source files, and is likely to fail (and is certain to be less
1307 useful than a build which uses the full set of changes). The
1308 tree-stable-timer is intended to avoid these useless builds that
1309 include some of the developer's changes but not all. The second reason
1310 is that some VC systems (i.e. CVS) do not provide repository-wide
1311 transaction numbers, so that timestamps are the only way to refer to
1312 a specific repository state. These timestamps may be somewhat
1313 ambiguous, due to processing and notification delays. By waiting until
1314 the tree has been stable for, say, 10 minutes, we can choose a
1315 timestamp from the middle of that period to use for our source
1316 checkout, and then be reasonably sure that any clock-skew errors will
1317 not cause the build to be performed on an inconsistent set of source
1318 files.
1320 The Schedulers always use the tree-stable-timer, with a timeout that
1321 is configured to reflect a reasonable tradeoff between build latency
1322 and change frequency. When the VC system provides coherent
1323 repository-wide revision markers (such as Subversion's revision
1324 numbers, or in fact anything other than CVS's timestamps), the
1325 resulting Build is simply performed against a source tree defined by
1326 that revision marker. When the VC system does not provide this, a
1327 timestamp from the middle of the tree-stable period is used to
1328 generate the source tree@footnote{this @code{checkoutDelay} defaults
1329 to half the tree-stable timer, but it can be overridden with an
1330 argument to the Source Step}.
1332 @node How Different VC Systems Specify Sources, Attributes of Changes, Source Tree Specifications, Version Control Systems
1333 @subsection How Different VC Systems Specify Sources
1335 For CVS, the static specifications are @code{repository} and
1336 @code{module}. In addition to those, each build uses a timestamp (or
1337 omits the timestamp to mean @code{the latest}) and @code{branch tag}
1338 (which defaults to HEAD). These parameters collectively specify a set
1339 of sources from which a build may be performed.
1341 @uref{http://subversion.tigris.org, Subversion} combines the
1342 repository, module, and branch into a single @code{Subversion URL}
1343 parameter. Within that scope, source checkouts can be specified by a
1344 numeric @code{revision number} (a repository-wide
1345 monotonically-increasing marker, such that each transaction that
1346 changes the repository is indexed by a different revision number), or
1347 a revision timestamp. When branches are used, the repository and
1348 module form a static @code{baseURL}, while each build has a
1349 @code{revision number} and a @code{branch} (which defaults to a
1350 statically-specified @code{defaultBranch}). The @code{baseURL} and
1351 @code{branch} are simply concatenated together to derive the
1352 @code{svnurl} to use for the checkout.
1354 @uref{http://www.perforce.com/, Perforce} is similar. The server
1355 is specified through a @code{P4PORT} parameter. Module and branch
1356 are specified in a single depot path, and revisions are
1357 depot-wide. When branches are used, the @code{p4base} and
1358 @code{defaultBranch} are concatenated together to produce the depot
1359 path.
1361 @uref{http://wiki.gnuarch.org/, Arch} and
1362 @uref{http://bazaar.canonical.com/, Bazaar} specify a repository by
1363 URL, as well as a @code{version} which is kind of like a branch name.
1364 Arch uses the word @code{archive} to represent the repository. Arch
1365 lets you push changes from one archive to another, removing the strict
1366 centralization required by CVS and SVN. It retains the distinction
1367 between repository and working directory that most other VC systems
1368 use. For complex multi-module directory structures, Arch has a
1369 built-in @code{build config} layer with which the checkout process has
1370 two steps. First, an initial bootstrap checkout is performed to
1371 retrieve a set of build-config files. Second, one of these files is
1372 used to figure out which archives/modules should be used to populate
1373 subdirectories of the initial checkout.
1375 Builders which use Arch and Bazaar therefore have a static archive
1376 @code{url}, and a default ``branch'' (which is a string that specifies
1377 a complete category--branch--version triple). Each build can have its
1378 own branch (the category--branch--version string) to override the
1379 default, as well as a revision number (which is turned into a
1380 --patch-NN suffix when performing the checkout).
1383 @uref{http://bazaar-vcs.org, Bzr} (which is a descendant of
1384 Arch/Bazaar, and is frequently referred to as ``Bazaar'') has the same
1385 sort of repository-vs-workspace model as Arch, but the repository data
1386 can either be stored inside the working directory or kept elsewhere
1387 (either on the same machine or on an entirely different machine). For
1388 the purposes of Buildbot (which never commits changes), the repository
1389 is specified with a URL and a revision number.
1391 The most common way to obtain read-only access to a bzr tree is via
1392 HTTP, simply by making the repository visible through a web server
1393 like Apache. Bzr can also use FTP and SFTP servers, if the buildslave
1394 process has sufficient privileges to access them. Higher performance
1395 can be obtained by running a special Bazaar-specific server. None of
1396 these matter to the buildbot: the repository URL just has to match the
1397 kind of server being used. The @code{repoURL} argument provides the
1398 location of the repository.
1400 Branches are expressed as subdirectories of the main central
1401 repository, which means that if branches are being used, the BZR step
1402 is given a @code{baseURL} and @code{defaultBranch} instead of getting
1403 the @code{repoURL} argument.
1406 @uref{http://darcs.net/, Darcs} doesn't really have the
1407 notion of a single master repository. Nor does it really have
1408 branches. In Darcs, each working directory is also a repository, and
1409 there are operations to push and pull patches from one of these
1410 @code{repositories} to another. For the Buildbot's purposes, all you
1411 need to do is specify the URL of a repository that you want to build
1412 from. The build slave will then pull the latest patches from that
1413 repository and build them. Multiple branches are implemented by using
1414 multiple repositories (possibly living on the same server).
1416 Builders which use Darcs therefore have a static @code{repourl} which
1417 specifies the location of the repository. If branches are being used,
1418 the source Step is instead configured with a @code{baseURL} and a
1419 @code{defaultBranch}, and the two strings are simply concatenated
1420 together to obtain the repository's URL. Each build then has a
1421 specific branch which replaces @code{defaultBranch}, or just uses the
1422 default one. Instead of a revision number, each build can have a
1423 ``context'', which is a string that records all the patches that are
1424 present in a given tree (this is the output of @command{darcs changes
1425 --context}, and is considerably less concise than, e.g. Subversion's
1426 revision number, but the patch-reordering flexibility of Darcs makes
1427 it impossible to provide a shorter useful specification).
1429 @uref{http://selenic.com/mercurial, Mercurial} is like Darcs, in that
1430 each branch is stored in a separate repository. The @code{repourl},
1431 @code{baseURL}, and @code{defaultBranch} arguments are all handled the
1432 same way as with Darcs. The ``revision'', however, is the hash
1433 identifier returned by @command{hg identify}.
1436 @node Attributes of Changes,  , How Different VC Systems Specify Sources, Version Control Systems
1437 @subsection Attributes of Changes
1439 @heading Who
1441 Each Change has a @code{who} attribute, which specifies which
1442 developer is responsible for the change. This is a string which comes
1443 from a namespace controlled by the VC repository. Frequently this
1444 means it is a username on the host which runs the repository, but not
1445 all VC systems require this (Arch, for example, uses a fully-qualified
1446 @code{Arch ID}, which looks like an email address, as does Darcs).
1447 Each StatusNotifier will map the @code{who} attribute into something
1448 appropriate for their particular means of communication: an email
1449 address, an IRC handle, etc.
1451 @heading Files
1453 It also has a list of @code{files}, which are just the tree-relative
1454 filenames of any files that were added, deleted, or modified for this
1455 Change. These filenames are used by the @code{isFileImportant}
1456 function (in the Scheduler) to decide whether it is worth triggering a
1457 new build or not, e.g. the function could use
1458 @code{filename.endswith(".c")} to only run a build if a C file were
1459 checked in. Certain BuildSteps can also use the list of changed files
1460 to run a more targeted series of tests, e.g. the
1461 @code{python_twisted.Trial} step can run just the unit tests that
1462 provide coverage for the modified .py files instead of running the
1463 full test suite.
1465 @heading Comments
1467 The Change also has a @code{comments} attribute, which is a string
1468 containing any checkin comments.
1470 @heading Revision
1472 Each Change can have a @code{revision} attribute, which describes how
1473 to get a tree with a specific state: a tree which includes this Change
1474 (and all that came before it) but none that come after it. If this
1475 information is unavailable, the @code{.revision} attribute will be
1476 @code{None}. These revisions are provided by the ChangeSource, and
1477 consumed by the @code{computeSourceRevision} method in the appropriate
1478 @code{step.Source} class.
1480 @table @samp
1481 @item CVS
1482 @code{revision} is an int, seconds since the epoch
1483 @item SVN
1484 @code{revision} is an int, a transation number (r%d)
1485 @item Darcs
1486 @code{revision} is a large string, the output of @code{darcs changes --context}
1487 @item Mercurial
1488 @code{revision} is a short string (a hash ID), the output of @code{hg identify}
1489 @item Arch/Bazaar
1490 @code{revision} is the full revision ID (ending in --patch-%d)
1491 @item P4
1492 @code{revision} is an int, the transaction number
1493 @end table
1495 @heading Branches
1497 The Change might also have a @code{branch} attribute. This indicates
1498 that all of the Change's files are in the same named branch. The
1499 Schedulers get to decide whether the branch should be built or not.
1501 For VC systems like CVS, Arch, and Monotone, the @code{branch} name is
1502 unrelated to the filename. (that is, the branch name and the filename
1503 inhabit unrelated namespaces). For SVN, branches are expressed as
1504 subdirectories of the repository, so the file's ``svnurl'' is a
1505 combination of some base URL, the branch name, and the filename within
1506 the branch. (In a sense, the branch name and the filename inhabit the
1507 same namespace). Darcs branches are subdirectories of a base URL just
1508 like SVN. Mercurial branches are the same as Darcs.
1510 @table @samp
1511 @item CVS
1512 branch='warner-newfeature', files=['src/foo.c']
1513 @item SVN
1514 branch='branches/warner-newfeature', files=['src/foo.c']
1515 @item Darcs
1516 branch='warner-newfeature', files=['src/foo.c']
1517 @item Mercurial
1518 branch='warner-newfeature', files=['src/foo.c']
1519 @item Arch/Bazaar
1520 branch='buildbot--usebranches--0', files=['buildbot/master.py']
1521 @end table
1523 @heading Links
1525 @c TODO: who is using 'links'? how is it being used?
1527 Finally, the Change might have a @code{links} list, which is intended
1528 to provide a list of URLs to a @emph{viewcvs}-style web page that
1529 provides more detail for this Change, perhaps including the full file
1530 diffs.
1533 @node Schedulers, BuildSet, Version Control Systems, Concepts
1534 @section Schedulers
1536 @cindex Scheduler
1538 Each Buildmaster has a set of @code{Scheduler} objects, each of which
1539 gets a copy of every incoming Change. The Schedulers are responsible
1540 for deciding when Builds should be run. Some Buildbot installations
1541 might have a single Scheduler, while others may have several, each for
1542 a different purpose.
1544 For example, a ``quick'' scheduler might exist to give immediate
1545 feedback to developers, hoping to catch obvious problems in the code
1546 that can be detected quickly. These typically do not run the full test
1547 suite, nor do they run on a wide variety of platforms. They also
1548 usually do a VC update rather than performing a brand-new checkout
1549 each time. You could have a ``quick'' scheduler which used a 30 second
1550 timeout, and feeds a single ``quick'' Builder that uses a VC
1551 @code{mode='update'} setting.
1553 A separate ``full'' scheduler would run more comprehensive tests a
1554 little while later, to catch more subtle problems. This scheduler
1555 would have a longer tree-stable-timer, maybe 30 minutes, and would
1556 feed multiple Builders (with a @code{mode=} of @code{'copy'},
1557 @code{'clobber'}, or @code{'export'}).
1559 The @code{tree-stable-timer} and @code{isFileImportant} decisions are
1560 made by the Scheduler. Dependencies are also implemented here.
1561 Periodic builds (those which are run every N seconds rather than after
1562 new Changes arrive) are triggered by a special @code{Periodic}
1563 Scheduler subclass. The default Scheduler class can also be told to
1564 watch for specific branches, ignoring Changes on other branches. This
1565 may be useful if you have a trunk and a few release branches which
1566 should be tracked, but when you don't want to have the Buildbot pay
1567 attention to several dozen private user branches.
1569 Some Schedulers may trigger builds for other reasons, other than
1570 recent Changes. For example, a Scheduler subclass could connect to a
1571 remote buildmaster and watch for builds of a library to succeed before
1572 triggering a local build that uses that library.
1574 Each Scheduler creates and submits @code{BuildSet} objects to the
1575 @code{BuildMaster}, which is then responsible for making sure the
1576 individual @code{BuildRequests} are delivered to the target
1577 @code{Builders}.
1579 @code{Scheduler} instances are activated by placing them in the
1580 @code{c['schedulers']} list in the buildmaster config file. Each
1581 Scheduler has a unique name.
1584 @node BuildSet, BuildRequest, Schedulers, Concepts
1585 @section BuildSet
1587 @cindex BuildSet
1589 A @code{BuildSet} is the name given to a set of Builds that all
1590 compile/test the same version of the tree on multiple Builders. In
1591 general, all these component Builds will perform the same sequence of
1592 Steps, using the same source code, but on different platforms or
1593 against a different set of libraries.
1595 The @code{BuildSet} is tracked as a single unit, which fails if any of
1596 the component Builds have failed, and therefore can succeed only if
1597 @emph{all} of the component Builds have succeeded. There are two kinds
1598 of status notification messages that can be emitted for a BuildSet:
1599 the @code{firstFailure} type (which fires as soon as we know the
1600 BuildSet will fail), and the @code{Finished} type (which fires once
1601 the BuildSet has completely finished, regardless of whether the
1602 overall set passed or failed).
1604 A @code{BuildSet} is created with a @emph{source stamp} tuple of
1605 (branch, revision, changes, patch), some of which may be None, and a
1606 list of Builders on which it is to be run. They are then given to the
1607 BuildMaster, which is responsible for creating a separate
1608 @code{BuildRequest} for each Builder.
1610 There are a couple of different likely values for the
1611 @code{SourceStamp}:
1613 @table @code
1614 @item (revision=None, changes=[CHANGES], patch=None)
1615 This is a @code{SourceStamp} used when a series of Changes have
1616 triggered a build. The VC step will attempt to check out a tree that
1617 contains CHANGES (and any changes that occurred before CHANGES, but
1618 not any that occurred after them).
1620 @item (revision=None, changes=None, patch=None)
1621 This builds the most recent code on the default branch. This is the
1622 sort of @code{SourceStamp} that would be used on a Build that was
1623 triggered by a user request, or a Periodic scheduler. It is also
1624 possible to configure the VC Source Step to always check out the
1625 latest sources rather than paying attention to the Changes in the
1626 SourceStamp, which will result in same behavior as this.
1628 @item (branch=BRANCH, revision=None, changes=None, patch=None)
1629 This builds the most recent code on the given BRANCH. Again, this is
1630 generally triggered by a user request or Periodic build.
1632 @item (revision=REV, changes=None, patch=(LEVEL, DIFF))
1633 This checks out the tree at the given revision REV, then applies a
1634 patch (using @code{diff -pLEVEL <DIFF}). The @ref{try} feature uses
1635 this kind of @code{SourceStamp}. If @code{patch} is None, the patching
1636 step is bypassed.
1638 @end table
1640 The buildmaster is responsible for turning the @code{BuildSet} into a
1641 set of @code{BuildRequest} objects and queueing them on the
1642 appropriate Builders.
1645 @node BuildRequest, Builder, BuildSet, Concepts
1646 @section BuildRequest
1648 @cindex BuildRequest
1650 A @code{BuildRequest} is a request to build a specific set of sources
1651 on a single specific Builder. Each Builder runs the
1652 @code{BuildRequest} as soon as it can (i.e. when an associated
1653 buildslave becomes free).
1655 The @code{BuildRequest} contains the @code{SourceStamp} specification.
1656 The actual process of running the build (the series of Steps that will
1657 be executed) is implemented by the @code{Build} object. In this future
1658 this might be changed, to have the @code{Build} define @emph{what}
1659 gets built, and a separate @code{BuildProcess} (provided by the
1660 Builder) to define @emph{how} it gets built.
1662 The @code{BuildRequest} may be mergeable with other compatible
1663 @code{BuildRequest}s. Builds that are triggered by incoming Changes
1664 will generally be mergeable. Builds that are triggered by user
1665 requests are generally not, unless they are multiple requests to build
1666 the @emph{latest sources} of the same branch.
1668 @node Builder, Users, BuildRequest, Concepts
1669 @section Builder
1671 @cindex Builder
1673 The @code{Builder} is a long-lived object which controls all Builds of
1674 a given type. Each one is created when the config file is first
1675 parsed, and lives forever (or rather until it is removed from the
1676 config file). It mediates the connections to the buildslaves that do
1677 all the work, and is responsible for creating the @code{Build} objects
1678 that decide @emph{how} a build is performed (i.e., which steps are
1679 executed in what order).
1681 Each @code{Builder} gets a unique name, and the path name of a
1682 directory where it gets to do all its work (there is a
1683 buildmaster-side directory for keeping status information, as well as
1684 a buildslave-side directory where the actual checkout/compile/test
1685 commands are executed). It also gets a @code{BuildFactory}, which is
1686 responsible for creating new @code{Build} instances: because the
1687 @code{Build} instance is what actually performs each build, choosing
1688 the @code{BuildFactory} is the way to specify what happens each time a
1689 build is done.
1691 Each @code{Builder} is associated with one of more @code{BuildSlaves}.
1692 A @code{Builder} which is used to perform OS-X builds (as opposed to
1693 Linux or Solaris builds) should naturally be associated with an
1694 OS-X-based buildslave.
1697 @node Users,  , Builder, Concepts
1698 @section Users
1700 @cindex Users
1702 Buildbot has a somewhat limited awareness of @emph{users}. It assumes
1703 the world consists of a set of developers, each of whom can be
1704 described by a couple of simple attributes. These developers make
1705 changes to the source code, causing builds which may succeed or fail.
1707 Each developer is primarily known through the source control system. Each
1708 Change object that arrives is tagged with a @code{who} field that
1709 typically gives the account name (on the repository machine) of the user
1710 responsible for that change. This string is the primary key by which the
1711 User is known, and is displayed on the HTML status pages and in each Build's
1712 ``blamelist''.
1714 To do more with the User than just refer to them, this username needs to
1715 be mapped into an address of some sort. The responsibility for this mapping
1716 is left up to the status module which needs the address. The core code knows
1717 nothing about email addresses or IRC nicknames, just user names.
1719 @menu
1720 * Doing Things With Users::     
1721 * Email Addresses::             
1722 * IRC Nicknames::               
1723 * Live Status Clients::         
1724 @end menu
1726 @node Doing Things With Users, Email Addresses, Users, Users
1727 @subsection Doing Things With Users
1729 Each Change has a single User who is responsible for that Change. Most
1730 Builds have a set of Changes: the Build represents the first time these
1731 Changes have been built and tested by the Buildbot. The build has a
1732 ``blamelist'' that consists of a simple union of the Users responsible
1733 for all the Build's Changes.
1735 The Build provides (through the IBuildStatus interface) a list of Users
1736 who are ``involved'' in the build. For now this is equal to the
1737 blamelist, but in the future it will be expanded to include a ``build
1738 sheriff'' (a person who is ``on duty'' at that time and responsible for
1739 watching over all builds that occur during their shift), as well as
1740 per-module owners who simply want to keep watch over their domain (chosen by
1741 subdirectory or a regexp matched against the filenames pulled out of the
1742 Changes). The Involved Users are those who probably have an interest in the
1743 results of any given build.
1745 In the future, Buildbot will acquire the concept of ``Problems'',
1746 which last longer than builds and have beginnings and ends. For example, a
1747 test case which passed in one build and then failed in the next is a
1748 Problem. The Problem lasts until the test case starts passing again, at
1749 which point the Problem is said to be ``resolved''.
1751 If there appears to be a code change that went into the tree at the
1752 same time as the test started failing, that Change is marked as being
1753 resposible for the Problem, and the user who made the change is added
1754 to the Problem's ``Guilty'' list. In addition to this user, there may
1755 be others who share responsibility for the Problem (module owners,
1756 sponsoring developers). In addition to the Responsible Users, there
1757 may be a set of Interested Users, who take an interest in the fate of
1758 the Problem.
1760 Problems therefore have sets of Users who may want to be kept aware of
1761 the condition of the problem as it changes over time. If configured, the
1762 Buildbot can pester everyone on the Responsible list with increasing
1763 harshness until the problem is resolved, with the most harshness reserved
1764 for the Guilty parties themselves. The Interested Users may merely be told
1765 when the problem starts and stops, as they are not actually responsible for
1766 fixing anything.
1768 @node Email Addresses, IRC Nicknames, Doing Things With Users, Users
1769 @subsection Email Addresses
1771 The @code{buildbot.status.mail.MailNotifier} class
1772 (@pxref{MailNotifier}) provides a status target which can send email
1773 about the results of each build. It accepts a static list of email
1774 addresses to which each message should be delivered, but it can also
1775 be configured to send mail to the Build's Interested Users. To do
1776 this, it needs a way to convert User names into email addresses.
1778 For many VC systems, the User Name is actually an account name on the
1779 system which hosts the repository. As such, turning the name into an
1780 email address is a simple matter of appending
1781 ``@@repositoryhost.com''. Some projects use other kinds of mappings
1782 (for example the preferred email address may be at ``project.org''
1783 despite the repository host being named ``cvs.project.org''), and some
1784 VC systems have full separation between the concept of a user and that
1785 of an account on the repository host (like Perforce). Some systems
1786 (like Arch) put a full contact email address in every change.
1788 To convert these names to addresses, the MailNotifier uses an EmailLookup
1789 object. This provides a .getAddress method which accepts a name and
1790 (eventually) returns an address. The default @code{MailNotifier}
1791 module provides an EmailLookup which simply appends a static string,
1792 configurable when the notifier is created. To create more complex behaviors
1793 (perhaps using an LDAP lookup, or using ``finger'' on a central host to
1794 determine a preferred address for the developer), provide a different object
1795 as the @code{lookup} argument.
1797 In the future, when the Problem mechanism has been set up, the Buildbot
1798 will need to send mail to arbitrary Users. It will do this by locating a
1799 MailNotifier-like object among all the buildmaster's status targets, and
1800 asking it to send messages to various Users. This means the User-to-address
1801 mapping only has to be set up once, in your MailNotifier, and every email
1802 message the buildbot emits will take advantage of it.
1804 @node IRC Nicknames, Live Status Clients, Email Addresses, Users
1805 @subsection IRC Nicknames
1807 Like MailNotifier, the @code{buildbot.status.words.IRC} class
1808 provides a status target which can announce the results of each build. It
1809 also provides an interactive interface by responding to online queries
1810 posted in the channel or sent as private messages.
1812 In the future, the buildbot can be configured map User names to IRC
1813 nicknames, to watch for the recent presence of these nicknames, and to
1814 deliver build status messages to the interested parties. Like
1815 @code{MailNotifier} does for email addresses, the @code{IRC} object
1816 will have an @code{IRCLookup} which is responsible for nicknames. The
1817 mapping can be set up statically, or it can be updated by online users
1818 themselves (by claiming a username with some kind of ``buildbot: i am
1819 user warner'' commands).
1821 Once the mapping is established, the rest of the buildbot can ask the
1822 @code{IRC} object to send messages to various users. It can report on
1823 the likelihood that the user saw the given message (based upon how long the
1824 user has been inactive on the channel), which might prompt the Problem
1825 Hassler logic to send them an email message instead.
1827 @node Live Status Clients,  , IRC Nicknames, Users
1828 @subsection Live Status Clients
1830 The Buildbot also offers a PB-based status client interface which can
1831 display real-time build status in a GUI panel on the developer's desktop.
1832 This interface is normally anonymous, but it could be configured to let the
1833 buildmaster know @emph{which} developer is using the status client. The
1834 status client could then be used as a message-delivery service, providing an
1835 alternative way to deliver low-latency high-interruption messages to the
1836 developer (like ``hey, you broke the build'').
1839 @node Configuration, Getting Source Code Changes, Concepts, Top
1840 @chapter Configuration
1842 @cindex Configuration
1844 The buildbot's behavior is defined by the ``config file'', which
1845 normally lives in the @file{master.cfg} file in the buildmaster's base
1846 directory (but this can be changed with an option to the
1847 @code{buildbot create-master} command). This file completely specifies
1848 which Builders are to be run, which slaves they should use, how
1849 Changes should be tracked, and where the status information is to be
1850 sent. The buildmaster's @file{buildbot.tac} file names the base
1851 directory; everything else comes from the config file.
1853 A sample config file was installed for you when you created the
1854 buildmaster, but you will need to edit it before your buildbot will do
1855 anything useful.
1857 This chapter gives an overview of the format of this file and the
1858 various sections in it. You will need to read the later chapters to
1859 understand how to fill in each section properly.
1861 @menu
1862 * Config File Format::          
1863 * Loading the Config File::     
1864 * Defining the Project::        
1865 * Listing Change Sources and Schedulers::  
1866 * Setting the slaveport::       
1867 * Buildslave Specifiers::       
1868 * Defining Builders::           
1869 * Defining Status Targets::     
1870 * Debug options::               
1871 @end menu
1873 @node Config File Format, Loading the Config File, Configuration, Configuration
1874 @section Config File Format
1876 The config file is, fundamentally, just a piece of Python code which
1877 defines a dictionary named @code{BuildmasterConfig}, with a number of
1878 keys that are treated specially. You don't need to know Python to do
1879 basic configuration, though, you can just copy the syntax of the
1880 sample file. If you @emph{are} comfortable writing Python code,
1881 however, you can use all the power of a full programming language to
1882 achieve more complicated configurations.
1884 The @code{BuildmasterConfig} name is the only one which matters: all
1885 other names defined during the execution of the file are discarded.
1886 When parsing the config file, the Buildmaster generally compares the
1887 old configuration with the new one and performs the minimum set of
1888 actions necessary to bring the buildbot up to date: Builders which are
1889 not changed are left untouched, and Builders which are modified get to
1890 keep their old event history.
1892 Basic Python syntax: comments start with a hash character (``#''),
1893 tuples are defined with @code{(parenthesis, pairs)}, arrays are
1894 defined with @code{[square, brackets]}, tuples and arrays are mostly
1895 interchangeable. Dictionaries (data structures which map ``keys'' to
1896 ``values'') are defined with curly braces: @code{@{'key1': 'value1',
1897 'key2': 'value2'@} }. Function calls (and object instantiation) can use
1898 named parameters, like @code{w = html.Waterfall(http_port=8010)}.
1900 The config file starts with a series of @code{import} statements,
1901 which make various kinds of Steps and Status targets available for
1902 later use. The main @code{BuildmasterConfig} dictionary is created,
1903 then it is populated with a variety of keys. These keys are broken
1904 roughly into the following sections, each of which is documented in
1905 the rest of this chapter:
1907 @itemize @bullet
1908 @item
1909 Project Definitions
1910 @item
1911 Change Sources / Schedulers
1912 @item
1913 Slaveport
1914 @item
1915 Buildslave Configuration
1916 @item
1917 Builders / Interlocks
1918 @item
1919 Status Targets
1920 @item
1921 Debug options
1922 @end itemize
1924 The config file can use a few names which are placed into its namespace:
1926 @table @code
1927 @item basedir
1928 the base directory for the buildmaster. This string has not been
1929 expanded, so it may start with a tilde. It needs to be expanded before
1930 use. The config file is located in
1931 @code{os.path.expanduser(os.path.join(basedir, 'master.cfg'))}
1933 @end table
1936 @node Loading the Config File, Defining the Project, Config File Format, Configuration
1937 @section Loading the Config File
1939 The config file is only read at specific points in time. It is first
1940 read when the buildmaster is launched. Once it is running, there are
1941 various ways to ask it to reload the config file. If you are on the
1942 system hosting the buildmaster, you can send a @code{SIGHUP} signal to
1943 it: the @command{buildbot} tool has a shortcut for this:
1945 @example
1946 buildbot reconfig @var{BASEDIR}
1947 @end example
1949 This command will show you all of the lines from @file{twistd.log}
1950 that relate to the reconfiguration. If there are any problems during
1951 the config-file reload, they will be displayed in these lines.
1953 The debug tool (@code{buildbot debugclient --master HOST:PORT}) has a
1954 ``Reload .cfg'' button which will also trigger a reload. In the
1955 future, there will be other ways to accomplish this step (probably a
1956 password-protected button on the web page, as well as a privileged IRC
1957 command).
1959 When reloading the config file, the buildmaster will endeavor to
1960 change as little as possible about the running system. For example,
1961 although old status targets may be shut down and new ones started up,
1962 any status targets that were not changed since the last time the
1963 config file was read will be left running and untouched. Likewise any
1964 Builders which have not been changed will be left running. If a
1965 Builder is modified (say, the build process is changed) while a Build
1966 is currently running, that Build will keep running with the old
1967 process until it completes. Any previously queued Builds (or Builds
1968 which get queued after the reconfig) will use the new process.
1970 @node Defining the Project, Listing Change Sources and Schedulers, Loading the Config File, Configuration
1971 @section Defining the Project
1973 There are a couple of basic settings that you use to tell the buildbot
1974 what project it is working on. This information is used by status
1975 reporters to let users find out more about the codebase being
1976 exercised by this particular Buildbot installation.
1978 @example
1979 c['projectName'] = "Buildbot"
1980 c['projectURL'] = "http://buildbot.sourceforge.net/"
1981 c['buildbotURL'] = "http://localhost:8010/"
1982 @end example
1984 @bcindex c['projectName']
1985 @code{projectName} is a short string will be used to describe the
1986 project that this buildbot is working on. For example, it is used as
1987 the title of the waterfall HTML page. 
1989 @bcindex c['projectURL']
1990 @code{projectURL} is a string that gives a URL for the project as a
1991 whole. HTML status displays will show @code{projectName} as a link to
1992 @code{projectURL}, to provide a link from buildbot HTML pages to your
1993 project's home page.
1995 @bcindex c['buildbotURL']
1996 The @code{buildbotURL} string should point to the location where the
1997 buildbot's internal web server (usually the @code{html.Waterfall}
1998 page) is visible. This typically uses the port number set when you
1999 create the @code{Waterfall} object: the buildbot needs your help to
2000 figure out a suitable externally-visible host name.
2002 When status notices are sent to users (either by email or over IRC),
2003 @code{buildbotURL} will be used to create a URL to the specific build
2004 or problem that they are being notified about. It will also be made
2005 available to queriers (over IRC) who want to find out where to get
2006 more information about this buildbot.
2009 @node Listing Change Sources and Schedulers, Setting the slaveport, Defining the Project, Configuration
2010 @section Listing Change Sources and Schedulers
2012 @bcindex c['sources']
2013 @bcindex c['change_source']
2015 The @code{c['change_source']} key is the ChangeSource
2016 instance@footnote{To be precise, it is an object or a list of objects
2017 which all implement the @code{buildbot.interfaces.IChangeSource}
2018 Interface. It is unusual to have multiple ChangeSources, so this key
2019 accepts either a single ChangeSource or a sequence of them.} that
2020 defines how the buildmaster learns about source code changes. More
2021 information about what goes here is available in @xref{Getting Source
2022 Code Changes}.
2024 @example
2025 from buildbot.changes.pb import PBChangeSource
2026 c['change_source'] = PBChangeSource()
2027 @end example
2029 (note: in buildbot-0.7.5 and earlier, this key was named
2030 @code{c['sources']}, and required a list. @code{c['sources']} is
2031 deprecated as of buildbot-0.7.6 and is scheduled to be removed in a
2032 future release).
2034 @bcindex c['schedulers']
2035 @code{c['schedulers']} is a list of Scheduler instances, each of which
2036 causes builds to be started on a particular set of Builders. The two
2037 basic Scheduler classes you are likely to start with are
2038 @code{Scheduler} and @code{Periodic}, but you can write a customized
2039 subclass to implement more complicated build scheduling.
2041 The docstring for @code{buildbot.scheduler.Scheduler} is the best
2042 place to see all the options that can be used. Type @code{pydoc
2043 buildbot.scheduler.Scheduler} to see it, or look in
2044 @file{buildbot/scheduler.py} directly.
2046 The basic Scheduler takes four arguments:
2048 @table @code
2049 @item name
2050 Each Scheduler must have a unique name. This is only used in status
2051 displays.
2053 @item branch
2054 This Scheduler will pay attention to a single branch, ignoring Changes
2055 that occur on other branches. Setting @code{branch} equal to the
2056 special value of @code{None} means it should only pay attention to the
2057 default branch. Note that @code{None} is a keyword, not a string, so
2058 you want to use @code{None} and not @code{"None"}.
2060 @item treeStableTimer
2061 The Scheduler will wait for this many seconds before starting the
2062 build. If new changes are made during this interval, the timer will be
2063 restarted, so really the build will be started after a change and then
2064 after this many seconds of inactivity.
2066 @item builderNames
2067 When the tree-stable-timer finally expires, builds will be started on
2068 these Builders. Each Builder gets a unique name: these strings must
2069 match.
2071 @end table
2073 @example
2074 from buildbot import scheduler
2075 quick = scheduler.Scheduler("quick", None, 60,
2076                             ["quick-linux", "quick-netbsd"])
2077 full = scheduler.Scheduler("full", None, 5*60,
2078                            ["full-linux", "full-netbsd", "full-OSX"])
2079 nightly = scheduler.Periodic("nightly", ["full-solaris"], 24*60*60)
2080 c['schedulers'] = [quick, full, nightly]
2081 @end example
2083 In this example, the two ``quick'' builds are triggered 60 seconds
2084 after the tree has been changed. The ``full'' builds do not run quite
2085 so quickly (they wait 5 minutes), so hopefully if the quick builds
2086 fail due to a missing file or really simple typo, the developer can
2087 discover and fix the problem before the full builds are started. Both
2088 Schedulers only pay attention to the default branch: any changes on
2089 other branches are ignored by these Schedulers. Each Scheduler
2090 triggers a different set of Builders, referenced by name.
2092 The third Scheduler in this example just runs the full solaris build
2093 once per day. (note that this Scheduler only lets you control the time
2094 between builds, not the absolute time-of-day of each Build, so this
2095 could easily wind up a ``daily'' or ``every afternoon'' scheduler
2096 depending upon when it was first activated).
2098 @menu
2099 * Scheduler Types::             
2100 * Build Dependencies::          
2101 @end menu
2103 @node Scheduler Types, Build Dependencies, Listing Change Sources and Schedulers, Listing Change Sources and Schedulers
2104 @subsection Scheduler Types
2106 @slindex buildbot.scheduler.Scheduler
2107 @slindex buildbot.scheduler.AnyBranchScheduler
2108 @slindex buildbot.scheduler.Periodic
2109 @slindex buildbot.scheduler.Nightly
2111 Here is a brief catalog of the available Scheduler types. All these
2112 Schedulers are classes in @code{buildbot.scheduler}, and the
2113 docstrings there are the best source of documentation on the arguments
2114 taken by each one.
2116 @table @code
2117 @item Scheduler
2118 This is the default Scheduler class. It follows exactly one branch,
2119 and starts a configurable tree-stable-timer after each change on that
2120 branch. When the timer expires, it starts a build on some set of
2121 Builders. The Scheduler accepts a @code{fileIsImportant} function
2122 which can be used to ignore some Changes if they do not affect any
2123 ``important'' files.
2125 @item AnyBranchScheduler
2126 This scheduler uses a tree-stable-timer like the default one, but
2127 follows multiple branches at once. Each branch gets a separate timer.
2129 @item Dependent
2130 This scheduler watches an ``upstream'' Scheduler. When all the
2131 Builders launched by that Scheduler successfully finish, the Dependent
2132 scheduler is triggered. The next section (@pxref{Build Dependencies})
2133 describes this scheduler in more detail.
2135 @item Periodic
2136 This simple scheduler just triggers a build every N seconds.
2138 @item Nightly
2139 This is highly configurable periodic build scheduler, which triggers a
2140 build at particular times of day, week, month, or year. The
2141 configuration syntax is very similar to the well-known @code{crontab}
2142 format, in which you provide values for minute, hour, day, and month
2143 (some of which can be wildcards), and a build is triggered whenever
2144 the current time matches the given constraints. This can run a build
2145 every night, every morning, every weekend, alternate Thursdays, on
2146 your boss's birthday, etc.
2148 @item Try_Jobdir / Try_Userpass
2149 This scheduler allows developers to use the @code{buildbot try}
2150 command to trigger builds of code they have not yet committed. See
2151 @ref{try} for complete details.
2153 @end table
2155 @node Build Dependencies,  , Scheduler Types, Listing Change Sources and Schedulers
2156 @subsection Build Dependencies
2158 @cindex Dependent
2159 @cindex Dependencies
2160 @slindex buildbot.scheduler.Dependent
2162 It is common to wind up with one kind of build which should only be
2163 performed if the same source code was successfully handled by some
2164 other kind of build first. An example might be a packaging step: you
2165 might only want to produce .deb or RPM packages from a tree that was
2166 known to compile successfully and pass all unit tests. You could put
2167 the packaging step in the same Build as the compile and testing steps,
2168 but there might be other reasons to not do this (in particular you
2169 might have several Builders worth of compiles/tests, but only wish to
2170 do the packaging once). Another example is if you want to skip the
2171 ``full'' builds after a failing ``quick'' build of the same source
2172 code. Or, if one Build creates a product (like a compiled library)
2173 that is used by some other Builder, you'd want to make sure the
2174 consuming Build is run @emph{after} the producing one.
2176 You can use @code{Dependencies} to express this relationship to the
2177 Buildbot. There is a special kind of Scheduler named
2178 @code{scheduler.Dependent} that will watch an ``upstream'' Scheduler
2179 for builds to complete successfully (on all of its Builders). Each
2180 time that happens, the same source code (i.e. the same
2181 @code{SourceStamp}) will be used to start a new set of builds, on a
2182 different set of Builders. This ``downstream'' scheduler doesn't pay
2183 attention to Changes at all, it only pays attention to the upstream
2184 scheduler.
2186 If the SourceStamp fails on any of the Builders in the upstream set,
2187 the downstream builds will not fire.
2189 @example
2190 from buildbot import scheduler
2191 tests = scheduler.Scheduler("tests", None, 5*60,
2192                             ["full-linux", "full-netbsd", "full-OSX"])
2193 package = scheduler.Dependent("package",
2194                               tests, # upstream scheduler
2195                               ["make-tarball", "make-deb", "make-rpm"])
2196 c['schedulers'] = [tests, package]
2197 @end example
2199 Note that @code{Dependent}'s upstream scheduler argument is given as a
2200 @code{Scheduler} @emph{instance}, not a name. This makes it impossible
2201 to create circular dependencies in the config file.
2204 @node Setting the slaveport, Buildslave Specifiers, Listing Change Sources and Schedulers, Configuration
2205 @section Setting the slaveport
2207 @bcindex c['slavePortnum']
2209 The buildmaster will listen on a TCP port of your choosing for
2210 connections from buildslaves. It can also use this port for
2211 connections from remote Change Sources, status clients, and debug
2212 tools. This port should be visible to the outside world, and you'll
2213 need to tell your buildslave admins about your choice.
2215 It does not matter which port you pick, as long it is externally
2216 visible, however you should probably use something larger than 1024,
2217 since most operating systems don't allow non-root processes to bind to
2218 low-numbered ports. If your buildmaster is behind a firewall or a NAT
2219 box of some sort, you may have to configure your firewall to permit
2220 inbound connections to this port.
2222 @example
2223 c['slavePortnum'] = 10000
2224 @end example
2226 @code{c['slavePortnum']} is a @emph{strports} specification string,
2227 defined in the @code{twisted.application.strports} module (try
2228 @command{pydoc twisted.application.strports} to get documentation on
2229 the format). This means that you can have the buildmaster listen on a
2230 localhost-only port by doing:
2232 @example
2233 c['slavePortnum'] = "tcp:10000:interface=127.0.0.1"
2234 @end example
2236 This might be useful if you only run buildslaves on the same machine,
2237 and they are all configured to contact the buildmaster at
2238 @code{localhost:10000}.
2241 @node Buildslave Specifiers, Defining Builders, Setting the slaveport, Configuration
2242 @section Buildslave Specifiers
2244 @bcindex c['slaves']
2246 The @code{c['slaves']} key is a list of known buildslaves. Each
2247 buildslave is defined by an instance of the BuildSlave class, created
2248 with two values: (slavename, slavepassword). These are the same two
2249 values that need to be provided to the buildslave administrator when
2250 they create the buildslave.
2252 @example
2253 from buildbot.buildslave import BuildSlave
2254 c['slaves'] = [BuildSlave('bot-solaris', 'solarispasswd'),
2255                BuildSlave('bot-bsd', 'bsdpasswd'),
2256               ]
2257 @end example
2259 The slavenames must be unique, of course. The password exists to
2260 prevent evildoers from interfering with the buildbot by inserting
2261 their own (broken) buildslaves into the system and thus displacing the
2262 real ones.
2264 Buildslaves with an unrecognized slavename or a non-matching password
2265 will be rejected when they attempt to connect, and a message
2266 describing the problem will be put in the log file (see @ref{Logfiles}).
2268 The @code{BuildSlave} constructor can take an optional
2269 @code{max_builds} parameter to limit the number of builds that it will
2270 execute simultaneously:
2272 @example
2273 from buildbot.buildslave import BuildSlave
2274 c['slaves'] = [BuildSlave("bot-linux", "linuxpassword", max_builds=2)]
2275 @end example
2277 Historical note: in buildbot-0.7.5 and earlier, the @code{c['bots']}
2278 key was used instead, and it took a list of (name, password) tuples.
2279 This key is accepted for backwards compatibility, but is deprecated as
2280 of 0.7.6 and will go away in some future release.
2282 @menu
2283 * When Buildslaves Go Missing::  
2284 @end menu
2286 @node When Buildslaves Go Missing,  , Buildslave Specifiers, Buildslave Specifiers
2287 @subsection When Buildslaves Go Missing
2289 Sometimes, the buildslaves go away. One very common reason for this is
2290 when the buildslave process is started once (manually) and left
2291 running, but then later the machine reboots and the process is not
2292 automatically restarted.
2294 If you'd like to have the administrator of the buildslave (or other
2295 people) be notified by email when the buildslave has been missing for
2296 too long, just add the @code{notify_on_missing=} argument to the
2297 @code{BuildSlave} definition:
2299 @example
2300 c['slaves'] = [BuildSlave('bot-solaris', 'solarispasswd',
2301                           notify_on_missing="bob@@example.com"),
2302               ]
2303 @end example
2305 By default, this will send email when the buildslave has been
2306 disconnected for more than one hour. Only one email per
2307 connection-loss event will be sent. To change the timeout, use
2308 @code{missing_timeout=} and give it a number of seconds (the default
2309 is 3600).
2311 You can have the buildmaster send email to multiple recipients: just
2312 provide a list of addresses instead of a single one:
2314 @example
2315 c['slaves'] = [BuildSlave('bot-solaris', 'solarispasswd',
2316                           notify_on_missing=["bob@@example.com",
2317                                              "alice@@example.org"],
2318                           missing_timeout=300, # notify after 10 minutes
2319                           ),
2320               ]
2321 @end example
2323 The email sent this way will use a MailNotifier (@pxref{MailNotifier})
2324 status target, if one is configured. This provides a way for you to
2325 control the ``from'' address of the email, as well as the relayhost
2326 (aka ``smarthost'') to use as an SMTP server. If no MailNotifier is
2327 configured on this buildmaster, the buildslave-missing emails will be
2328 sent using a default configuration.
2330 Note that if you want to have a MailNotifier for buildslave-missing
2331 emails but not for regular build emails, just create one with
2332 builders=[], as follows:
2334 @example
2335 from buildbot.status import mail
2336 m = mail.MailNotifier(fromaddr="buildbot@@localhost", builders=[],
2337                       relayhost="smtp.example.org")
2338 c['status'].append(m)
2339 c['slaves'] = [BuildSlave('bot-solaris', 'solarispasswd',
2340                           notify_on_missing="bob@@example.com"),
2341               ]
2342 @end example
2345 @node Defining Builders, Defining Status Targets, Buildslave Specifiers, Configuration
2346 @section Defining Builders
2348 @bcindex c['builders']
2350 The @code{c['builders']} key is a list of dictionaries which specify
2351 the Builders. The Buildmaster runs a collection of Builders, each of
2352 which handles a single type of build (e.g. full versus quick), on a
2353 single build slave. A Buildbot which makes sure that the latest code
2354 (``HEAD'') compiles correctly across four separate architecture will
2355 have four Builders, each performing the same build but on different
2356 slaves (one per platform).
2358 Each Builder gets a separate column in the waterfall display. In
2359 general, each Builder runs independently (although various kinds of
2360 interlocks can cause one Builder to have an effect on another).
2362 Each Builder specification dictionary has several required keys:
2364 @table @code
2365 @item name
2366 This specifies the Builder's name, which is used in status
2367 reports.
2369 @item slavename
2370 This specifies which buildslave will be used by this Builder.
2371 @code{slavename} must appear in the @code{c['slaves']} list. Each
2372 buildslave can accomodate multiple Builders.
2374 @item slavenames
2375 If you provide @code{slavenames} instead of @code{slavename}, you can
2376 give a list of buildslaves which are capable of running this Builder.
2377 If multiple buildslaves are available for any given Builder, you will
2378 have some measure of redundancy: in case one slave goes offline, the
2379 others can still keep the Builder working. In addition, multiple
2380 buildslaves will allow multiple simultaneous builds for the same
2381 Builder, which might be useful if you have a lot of forced or ``try''
2382 builds taking place.
2384 If you use this feature, it is important to make sure that the
2385 buildslaves are all, in fact, capable of running the given build. The
2386 slave hosts should be configured similarly, otherwise you will spend a
2387 lot of time trying (unsuccessfully) to reproduce a failure that only
2388 occurs on some of the buildslaves and not the others. Different
2389 platforms, operating systems, versions of major programs or libraries,
2390 all these things mean you should use separate Builders.
2392 @item builddir
2393 This specifies the name of a subdirectory (under the base directory)
2394 in which everything related to this builder will be placed. On the
2395 buildmaster, this holds build status information. On the buildslave,
2396 this is where checkouts, compiles, and tests are run.
2398 @item factory
2399 This is a @code{buildbot.process.factory.BuildFactory} instance which
2400 controls how the build is performed. Full details appear in their own
2401 chapter, @xref{Build Process}. Parameters like the location of the CVS
2402 repository and the compile-time options used for the build are
2403 generally provided as arguments to the factory's constructor.
2405 @end table
2407 Other optional keys may be set on each Builder:
2409 @table @code
2411 @item category
2412 If provided, this is a string that identifies a category for the
2413 builder to be a part of. Status clients can limit themselves to a
2414 subset of the available categories. A common use for this is to add
2415 new builders to your setup (for a new module, or for a new buildslave)
2416 that do not work correctly yet and allow you to integrate them with
2417 the active builders. You can put these new builders in a test
2418 category, make your main status clients ignore them, and have only
2419 private status clients pick them up. As soon as they work, you can
2420 move them over to the active category.
2422 @end table
2425 @node Defining Status Targets, Debug options, Defining Builders, Configuration
2426 @section Defining Status Targets
2428 The Buildmaster has a variety of ways to present build status to
2429 various users. Each such delivery method is a ``Status Target'' object
2430 in the configuration's @code{status} list. To add status targets, you
2431 just append more objects to this list:
2433 @bcindex c['status']
2435 @example
2436 c['status'] = []
2438 from buildbot.status import html
2439 c['status'].append(html.Waterfall(http_port=8010))
2441 from buildbot.status import mail
2442 m = mail.MailNotifier(fromaddr="buildbot@@localhost",
2443                       extraRecipients=["builds@@lists.example.com"],
2444                       sendToInterestedUsers=False)
2445 c['status'].append(m)
2447 from buildbot.status import words
2448 c['status'].append(words.IRC(host="irc.example.com", nick="bb",
2449                              channels=["#example"]))
2450 @end example
2452 Status delivery has its own chapter, @xref{Status Delivery}, in which
2453 all the built-in status targets are documented.
2456 @node Debug options,  , Defining Status Targets, Configuration
2457 @section Debug options
2460 @bcindex c['debugPassword']
2461 If you set @code{c['debugPassword']}, then you can connect to the
2462 buildmaster with the diagnostic tool launched by @code{buildbot
2463 debugclient MASTER:PORT}. From this tool, you can reload the config
2464 file, manually force builds, and inject changes, which may be useful
2465 for testing your buildmaster without actually commiting changes to
2466 your repository (or before you have the Change Sources set up). The
2467 debug tool uses the same port number as the slaves do:
2468 @code{c['slavePortnum']}, and is authenticated with this password.
2470 @example
2471 c['debugPassword'] = "debugpassword"
2472 @end example
2474 @bcindex c['manhole']
2475 If you set @code{c['manhole']} to an instance of one of the classes in
2476 @code{buildbot.manhole}, you can telnet or ssh into the buildmaster
2477 and get an interactive Python shell, which may be useful for debugging
2478 buildbot internals. It is probably only useful for buildbot
2479 developers. It exposes full access to the buildmaster's account
2480 (including the ability to modify and delete files), so it should not
2481 be enabled with a weak or easily guessable password.
2483 There are three separate @code{Manhole} classes. Two of them use SSH,
2484 one uses unencrypted telnet. Two of them use a username+password
2485 combination to grant access, one of them uses an SSH-style
2486 @file{authorized_keys} file which contains a list of ssh public keys.
2488 @table @code
2489 @item manhole.AuthorizedKeysManhole
2490 You construct this with the name of a file that contains one SSH
2491 public key per line, just like @file{~/.ssh/authorized_keys}. If you
2492 provide a non-absolute filename, it will be interpreted relative to
2493 the buildmaster's base directory.
2495 @item manhole.PasswordManhole
2496 This one accepts SSH connections but asks for a username and password
2497 when authenticating. It accepts only one such pair.
2500 @item manhole.TelnetManhole
2501 This accepts regular unencrypted telnet connections, and asks for a
2502 username/password pair before providing access. Because this
2503 username/password is transmitted in the clear, and because Manhole
2504 access to the buildmaster is equivalent to granting full shell
2505 privileges to both the buildmaster and all the buildslaves (and to all
2506 accounts which then run code produced by the buildslaves), it is
2507 highly recommended that you use one of the SSH manholes instead.
2509 @end table
2511 @example
2512 # some examples:
2513 from buildbot import manhole
2514 c['manhole'] = manhole.AuthorizedKeysManhole(1234, "authorized_keys")
2515 c['manhole'] = manhole.PasswordManhole(1234, "alice", "mysecretpassword")
2516 c['manhole'] = manhole.TelnetManhole(1234, "bob", "snoop_my_password_please")
2517 @end example
2519 The @code{Manhole} instance can be configured to listen on a specific
2520 port. You may wish to have this listening port bind to the loopback
2521 interface (sometimes known as ``lo0'', ``localhost'', or 127.0.0.1) to
2522 restrict access to clients which are running on the same host.
2524 @example
2525 from buildbot.manhole import PasswordManhole
2526 c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")
2527 @end example
2529 To have the @code{Manhole} listen on all interfaces, use
2530 @code{"tcp:9999"} or simply 9999. This port specification uses
2531 @code{twisted.application.strports}, so you can make it listen on SSL
2532 or even UNIX-domain sockets if you want.
2534 Note that using any Manhole requires that the TwistedConch package be
2535 installed, and that you be using Twisted version 2.0 or later.
2537 The buildmaster's SSH server will use a different host key than the
2538 normal sshd running on a typical unix host. This will cause the ssh
2539 client to complain about a ``host key mismatch'', because it does not
2540 realize there are two separate servers running on the same host. To
2541 avoid this, use a clause like the following in your @file{.ssh/config}
2542 file:
2544 @example
2545 Host remotehost-buildbot
2546  HostName remotehost
2547  HostKeyAlias remotehost-buildbot
2548  Port 9999
2549  # use 'user' if you use PasswordManhole and your name is not 'admin'.
2550  # if you use AuthorizedKeysManhole, this probably doesn't matter.
2551  User admin
2552 @end example
2555 @node Getting Source Code Changes, Build Process, Configuration, Top
2556 @chapter Getting Source Code Changes
2558 The most common way to use the Buildbot is centered around the idea of
2559 @code{Source Trees}: a directory tree filled with source code of some form
2560 which can be compiled and/or tested. Some projects use languages that don't
2561 involve any compilation step: nevertheless there may be a @code{build} phase
2562 where files are copied or rearranged into a form that is suitable for
2563 installation. Some projects do not have unit tests, and the Buildbot is
2564 merely helping to make sure that the sources can compile correctly. But in
2565 all of these cases, the thing-being-tested is a single source tree.
2567 A Version Control System mantains a source tree, and tells the
2568 buildmaster when it changes. The first step of each Build is typically
2569 to acquire a copy of some version of this tree.
2571 This chapter describes how the Buildbot learns about what Changes have
2572 occurred. For more information on VC systems and Changes, see
2573 @ref{Version Control Systems}.
2576 @menu
2577 * Change Sources::              
2578 * Choosing ChangeSources::      
2579 * CVSToys - PBService::         
2580 * Mail-parsing ChangeSources::  
2581 * PBChangeSource::              
2582 * P4Source::                    
2583 * BonsaiPoller::                
2584 * SVNPoller::                   
2585 * MercurialHook::               
2586 @end menu
2590 @node Change Sources, Choosing ChangeSources, Getting Source Code Changes, Getting Source Code Changes
2591 @section Change Sources
2593 @c TODO: rework this, the one-buildmaster-one-tree thing isn't quite
2594 @c so narrow-minded anymore
2596 Each Buildmaster watches a single source tree. Changes can be provided
2597 by a variety of ChangeSource types, however any given project will
2598 typically have only a single ChangeSource active. This section
2599 provides a description of all available ChangeSource types and
2600 explains how to set up each of them.
2602 There are a variety of ChangeSources available, some of which are
2603 meant to be used in conjunction with other tools to deliver Change
2604 events from the VC repository to the buildmaster.
2606 @itemize @bullet
2608 @item CVSToys
2609 This ChangeSource opens a TCP connection from the buildmaster to a
2610 waiting FreshCVS daemon that lives on the repository machine, and
2611 subscribes to hear about Changes.
2613 @item MaildirSource
2614 This one watches a local maildir-format inbox for email sent out by
2615 the repository when a change is made. When a message arrives, it is
2616 parsed to create the Change object. A variety of parsing functions are
2617 available to accomodate different email-sending tools.
2619 @item PBChangeSource
2620 This ChangeSource listens on a local TCP socket for inbound
2621 connections from a separate tool. Usually, this tool would be run on
2622 the VC repository machine in a commit hook. It is expected to connect
2623 to the TCP socket and send a Change message over the network
2624 connection. The @command{buildbot sendchange} command is one example
2625 of a tool that knows how to send these messages, so you can write a
2626 commit script for your VC system that calls it to deliver the Change.
2627 There are other tools in the contrib/ directory that use the same
2628 protocol.
2630 @end itemize
2632 As a quick guide, here is a list of VC systems and the ChangeSources
2633 that might be useful with them. All of these ChangeSources are in the
2634 @code{buildbot.changes} module.
2636 @table @code
2637 @item CVS
2639 @itemize @bullet
2640 @item freshcvs.FreshCVSSource (connected via TCP to the freshcvs daemon)
2641 @item mail.FCMaildirSource (watching for email sent by a freshcvs daemon)
2642 @item mail.BonsaiMaildirSource (watching for email sent by Bonsai)
2643 @item mail.SyncmailMaildirSource (watching for email sent by syncmail)
2644 @item pb.PBChangeSource (listening for connections from @code{buildbot
2645 sendchange} run in a loginfo script)
2646 @item pb.PBChangeSource (listening for connections from a long-running
2647 @code{contrib/viewcvspoll.py} polling process which examines the ViewCVS
2648 database directly
2649 @end itemize
2651 @item SVN
2652 @itemize @bullet
2653 @item pb.PBChangeSource (listening for connections from
2654 @code{contrib/svn_buildbot.py} run in a postcommit script)
2655 @item pb.PBChangeSource (listening for connections from a long-running
2656 @code{contrib/svn_watcher.py} or @code{contrib/svnpoller.py} polling
2657 process
2658 @item mail.SVNCommitEmailMaildirSource (watching for email sent by commit-email.pl)
2659 @item svnpoller.SVNPoller (polling the SVN repository)
2660 @end itemize
2662 @item Darcs
2663 @itemize @bullet
2664 @item pb.PBChangeSource (listening for connections from
2665 @code{contrib/darcs_buildbot.py} in a commit script
2666 @end itemize
2668 @item Mercurial
2669 @itemize @bullet
2670 @item pb.PBChangeSource (listening for connections from
2671 @code{contrib/hg_buildbot.py} run in an 'incoming' hook)
2672 @item pb.PBChangeSource (listening for connections from
2673 @code{buildbot/changes/hgbuildbot.py} run as an in-process 'changegroup'
2674 hook)
2675 @end itemize
2677 @item Arch/Bazaar
2678 @itemize @bullet
2679 @item pb.PBChangeSource (listening for connections from
2680 @code{contrib/arch_buildbot.py} run in a commit hook)
2681 @end itemize
2683 @end table
2685 All VC systems can be driven by a PBChangeSource and the
2686 @code{buildbot sendchange} tool run from some form of commit script.
2687 If you write an email parsing function, they can also all be driven by
2688 a suitable @code{MaildirSource}.
2691 @node Choosing ChangeSources, CVSToys - PBService, Change Sources, Getting Source Code Changes
2692 @section Choosing ChangeSources
2694 The @code{master.cfg} configuration file has a dictionary key named
2695 @code{BuildmasterConfig['change_source']}, which holds the active
2696 @code{IChangeSource} object. The config file will typically create an
2697 object from one of the classes described below and stuff it into this
2698 key.
2700 Each buildmaster typically has just a single ChangeSource, since it is
2701 only watching a single source tree. But if, for some reason, you need
2702 multiple sources, just set @code{c['change_source']} to a list of
2703 ChangeSources.. it will accept that too.
2705 @example
2706 s = FreshCVSSourceNewcred(host="host", port=4519,
2707                           user="alice", passwd="secret",
2708                           prefix="Twisted")
2709 BuildmasterConfig['change_source'] = [s]
2710 @end example
2712 Each source tree has a nominal @code{top}. Each Change has a list of
2713 filenames, which are all relative to this top location. The
2714 ChangeSource is responsible for doing whatever is necessary to
2715 accomplish this. Most sources have a @code{prefix} argument: a partial
2716 pathname which is stripped from the front of all filenames provided to
2717 that @code{ChangeSource}. Files which are outside this sub-tree are
2718 ignored by the changesource: it does not generate Changes for those
2719 files.
2722 @node CVSToys - PBService, Mail-parsing ChangeSources, Choosing ChangeSources, Getting Source Code Changes
2723 @section CVSToys - PBService
2725 @csindex buildbot.changes.freshcvs.FreshCVSSource
2727 The @uref{http://purl.net/net/CVSToys, CVSToys} package provides a
2728 server which runs on the machine that hosts the CVS repository it
2729 watches. It has a variety of ways to distribute commit notifications,
2730 and offers a flexible regexp-based way to filter out uninteresting
2731 changes. One of the notification options is named @code{PBService} and
2732 works by listening on a TCP port for clients. These clients subscribe
2733 to hear about commit notifications.
2735 The buildmaster has a CVSToys-compatible @code{PBService} client built
2736 in. There are two versions of it, one for old versions of CVSToys
2737 (1.0.9 and earlier) which used the @code{oldcred} authentication
2738 framework, and one for newer versions (1.0.10 and later) which use
2739 @code{newcred}. Both are classes in the
2740 @code{buildbot.changes.freshcvs} package.
2742 @code{FreshCVSSourceNewcred} objects are created with the following
2743 parameters:
2745 @table @samp
2747 @item @code{host} and @code{port}
2748 these specify where the CVSToys server can be reached
2750 @item @code{user} and @code{passwd}
2751 these specify the login information for the CVSToys server
2752 (@code{freshcvs}). These must match the server's values, which are
2753 defined in the @code{freshCfg} configuration file (which lives in the
2754 CVSROOT directory of the repository).
2756 @item @code{prefix}
2757 this is the prefix to be found and stripped from filenames delivered
2758 by the CVSToys server. Most projects live in sub-directories of the
2759 main repository, as siblings of the CVSROOT sub-directory, so
2760 typically this prefix is set to that top sub-directory name.
2762 @end table
2764 @heading Example
2766 To set up the freshCVS server, add a statement like the following to
2767 your @file{freshCfg} file:
2769 @example
2770 pb = ConfigurationSet([
2771     (None, None, None, PBService(userpass=('foo', 'bar'), port=4519)),
2772     ])
2773 @end example
2775 This will announce all changes to a client which connects to port 4519
2776 using a username of 'foo' and a password of 'bar'.
2778 Then add a clause like this to your buildmaster's @file{master.cfg}:
2780 @example
2781 BuildmasterConfig['change_source'] = FreshCVSSource("cvs.example.com", 4519,
2782                                                     "foo", "bar",
2783                                                     prefix="glib/")
2784 @end example
2786 where "cvs.example.com" is the host that is running the FreshCVS daemon, and
2787 "glib" is the top-level directory (relative to the repository's root) where
2788 all your source code lives. Most projects keep one or more projects in the
2789 same repository (along with CVSROOT/ to hold admin files like loginfo and
2790 freshCfg); the prefix= argument tells the buildmaster to ignore everything
2791 outside that directory, and to strip that common prefix from all pathnames
2792 it handles.
2795 @node Mail-parsing ChangeSources, PBChangeSource, CVSToys - PBService, Getting Source Code Changes
2796 @section Mail-parsing ChangeSources
2798 Many projects publish information about changes to their source tree
2799 by sending an email message out to a mailing list, frequently named
2800 PROJECT-commits or PROJECT-changes. Each message usually contains a
2801 description of the change (who made the change, which files were
2802 affected) and sometimes a copy of the diff. Humans can subscribe to
2803 this list to stay informed about what's happening to the source tree.
2805 The Buildbot can also be subscribed to a -commits mailing list, and
2806 can trigger builds in response to Changes that it hears about. The
2807 buildmaster admin needs to arrange for these email messages to arrive
2808 in a place where the buildmaster can find them, and configure the
2809 buildmaster to parse the messages correctly. Once that is in place,
2810 the email parser will create Change objects and deliver them to the
2811 Schedulers (see @pxref{Scheduler Types}) just like any other
2812 ChangeSource.
2814 There are two components to setting up an email-based ChangeSource.
2815 The first is to route the email messages to the buildmaster, which is
2816 done by dropping them into a ``maildir''. The second is to actually
2817 parse the messages, which is highly dependent upon the tool that was
2818 used to create them. Each VC system has a collection of favorite
2819 change-emailing tools, and each has a slightly different format, so
2820 each has a different parsing function. There is a separate
2821 ChangeSource variant for each parsing function.
2823 Once you've chosen a maildir location and a parsing function, create
2824 the change source and put it in @code{c['change_source']}:
2826 @example
2827 from buildbot.changes.mail import SyncmailMaildirSource
2828 c['change_source'] = SyncmailMaildirSource("~/maildir-buildbot",
2829                                            prefix="/trunk/")
2830 @end example
2832 @menu
2833 * Subscribing the Buildmaster::  
2834 * Using Maildirs::              
2835 * Parsing Email Change Messages::  
2836 @end menu
2838 @node Subscribing the Buildmaster, Using Maildirs, Mail-parsing ChangeSources, Mail-parsing ChangeSources
2839 @subsection Subscribing the Buildmaster
2841 The recommended way to install the buildbot is to create a dedicated
2842 account for the buildmaster. If you do this, the account will probably
2843 have a distinct email address (perhaps
2844 @email{buildmaster@@example.org}). Then just arrange for this
2845 account's email to be delivered to a suitable maildir (described in
2846 the next section).
2848 If the buildbot does not have its own account, ``extension addresses''
2849 can be used to distinguish between email intended for the buildmaster
2850 and email intended for the rest of the account. In most modern MTAs,
2851 the e.g. @code{foo@@example.org} account has control over every email
2852 address at example.org which begins with "foo", such that email
2853 addressed to @email{account-foo@@example.org} can be delivered to a
2854 different destination than @email{account-bar@@example.org}. qmail
2855 does this by using separate .qmail files for the two destinations
2856 (@file{.qmail-foo} and @file{.qmail-bar}, with @file{.qmail}
2857 controlling the base address and @file{.qmail-default} controlling all
2858 other extensions). Other MTAs have similar mechanisms.
2860 Thus you can assign an extension address like
2861 @email{foo-buildmaster@@example.org} to the buildmaster, and retain
2862 @email{foo@@example.org} for your own use.
2865 @node Using Maildirs, Parsing Email Change Messages, Subscribing the Buildmaster, Mail-parsing ChangeSources
2866 @subsection Using Maildirs
2868 A ``maildir'' is a simple directory structure originally developed for
2869 qmail that allows safe atomic update without locking. Create a base
2870 directory with three subdirectories: ``new'', ``tmp'', and ``cur''.
2871 When messages arrive, they are put into a uniquely-named file (using
2872 pids, timestamps, and random numbers) in ``tmp''. When the file is
2873 complete, it is atomically renamed into ``new''. Eventually the
2874 buildmaster notices the file in ``new'', reads and parses the
2875 contents, then moves it into ``cur''. A cronjob can be used to delete
2876 files in ``cur'' at leisure.
2878 Maildirs are frequently created with the @command{maildirmake} tool,
2879 but a simple @command{mkdir -p ~/MAILDIR/@{cur,new,tmp@}} is pretty much
2880 equivalent.
2882 Many modern MTAs can deliver directly to maildirs. The usual .forward
2883 or .procmailrc syntax is to name the base directory with a trailing
2884 slash, so something like @code{~/MAILDIR/} . qmail and postfix are
2885 maildir-capable MTAs, and procmail is a maildir-capable MDA (Mail
2886 Delivery Agent).
2888 For MTAs which cannot put files into maildirs directly, the
2889 ``safecat'' tool can be executed from a .forward file to accomplish
2890 the same thing.
2892 The Buildmaster uses the linux DNotify facility to receive immediate
2893 notification when the maildir's ``new'' directory has changed. When
2894 this facility is not available, it polls the directory for new
2895 messages, every 10 seconds by default.
2897 @node Parsing Email Change Messages,  , Using Maildirs, Mail-parsing ChangeSources
2898 @subsection Parsing Email Change Messages
2900 The second component to setting up an email-based ChangeSource is to
2901 parse the actual notices. This is highly dependent upon the VC system
2902 and commit script in use.
2904 A couple of common tools used to create these change emails are:
2906 @table @samp
2908 @item CVS
2909 @table @samp
2910 @item CVSToys MailNotifier
2911 @ref{FCMaildirSource}
2912 @item Bonsai notification
2913 @ref{BonsaiMaildirSource}
2914 @item syncmail
2915 @ref{SyncmailMaildirSource}
2916 @end table
2918 @item SVN
2919 @table @samp
2920 @item svnmailer
2921 http://opensource.perlig.de/en/svnmailer/
2922 @item commit-email.pl
2923 @ref{SVNCommitEmailMaildirSource}
2924 @end table
2926 @item Mercurial
2927 @table @samp
2928 @item NotifyExtension
2929 http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtension
2930 @end table
2932 @end table
2935 The following sections describe the parsers available for each of
2936 these tools.
2938 Most of these parsers accept a @code{prefix=} argument, which is used
2939 to limit the set of files that the buildmaster pays attention to. This
2940 is most useful for systems like CVS and SVN which put multiple
2941 projects in a single repository (or use repository names to indicate
2942 branches). Each filename that appears in the email is tested against
2943 the prefix: if the filename does not start with the prefix, the file
2944 is ignored. If the filename @emph{does} start with the prefix, that
2945 prefix is stripped from the filename before any further processing is
2946 done. Thus the prefix usually ends with a slash.
2948 @menu
2949 * FCMaildirSource::             
2950 * SyncmailMaildirSource::       
2951 * BonsaiMaildirSource::         
2952 * SVNCommitEmailMaildirSource::  
2953 @end menu
2955 @node FCMaildirSource, SyncmailMaildirSource, Parsing Email Change Messages, Parsing Email Change Messages
2956 @subsubsection FCMaildirSource
2959 @csindex buildbot.changes.mail.FCMaildirSource
2961 http://twistedmatrix.com/users/acapnotic/wares/code/CVSToys/
2963 This parser works with the CVSToys @code{MailNotification} action,
2964 which will send email to a list of recipients for each commit. This
2965 tends to work better than using @code{/bin/mail} from within the
2966 CVSROOT/loginfo file directly, as CVSToys will batch together all
2967 files changed during the same CVS invocation, and can provide more
2968 information (like creating a ViewCVS URL for each file changed).
2970 The Buildbot's @code{FCMaildirSource} knows for to parse these CVSToys
2971 messages and turn them into Change objects. It can be given two
2972 parameters: the directory name of the maildir root, and the prefix to
2973 strip.
2975 @example
2976 from buildbot.changes.mail import FCMaildirSource
2977 c['change_source'] = FCMaildirSource("~/maildir-buildbot")
2978 @end example
2980 @node SyncmailMaildirSource, BonsaiMaildirSource, FCMaildirSource, Parsing Email Change Messages
2981 @subsubsection SyncmailMaildirSource
2983 @csindex buildbot.changes.mail.SyncmailMaildirSource
2985 http://sourceforge.net/projects/cvs-syncmail
2987 @code{SyncmailMaildirSource} knows how to parse the message format used by
2988 the CVS ``syncmail'' script.
2990 @example
2991 from buildbot.changes.mail import SyncmailMaildirSource
2992 c['change_source'] = SyncmailMaildirSource("~/maildir-buildbot")
2993 @end example
2995 @node BonsaiMaildirSource, SVNCommitEmailMaildirSource, SyncmailMaildirSource, Parsing Email Change Messages
2996 @subsubsection BonsaiMaildirSource
2998 @csindex buildbot.changes.mail.BonsaiMaildirSource
3000 http://www.mozilla.org/bonsai.html
3002 @code{BonsaiMaildirSource} parses messages sent out by Bonsai, the CVS
3003 tree-management system built by Mozilla.
3005 @example
3006 from buildbot.changes.mail import BonsaiMaildirSource
3007 c['change_source'] = BonsaiMaildirSource("~/maildir-buildbot")
3008 @end example
3010 @node SVNCommitEmailMaildirSource,  , BonsaiMaildirSource, Parsing Email Change Messages
3011 @subsubsection SVNCommitEmailMaildirSource
3013 @csindex buildbot.changes.mail.SVNCommitEmailMaildirSource
3015 @code{SVNCommitEmailMaildirSource} parses message sent out by the
3016 @code{commit-email.pl} script, which is included in the Subversion
3017 distribution.
3019 It does not currently handle branches: all of the Change objects that
3020 it creates will be associated with the default (i.e. trunk) branch.
3022 @example
3023 from buildbot.changes.mail import SVNCommitEmailMaildirSource
3024 c['change_source'] = SVNCommitEmailMaildirSource("~/maildir-buildbot")
3025 @end example
3028 @node PBChangeSource, P4Source, Mail-parsing ChangeSources, Getting Source Code Changes
3029 @section PBChangeSource
3031 @csindex buildbot.changes.pb.PBChangeSource
3033 The last kind of ChangeSource actually listens on a TCP port for
3034 clients to connect and push change notices @emph{into} the
3035 Buildmaster. This is used by the built-in @code{buildbot sendchange}
3036 notification tool, as well as the VC-specific
3037 @file{contrib/svn_buildbot.py}, @file{contrib/arch_buildbot.py},
3038 @file{contrib/hg_buildbot.py} tools, and the
3039 @code{buildbot.changes.hgbuildbot} hook. These tools are run by the
3040 repository (in a commit hook script), and connect to the buildmaster
3041 directly each time a file is comitted. This is also useful for
3042 creating new kinds of change sources that work on a @code{push} model
3043 instead of some kind of subscription scheme, for example a script
3044 which is run out of an email .forward file.
3046 This ChangeSource can be configured to listen on its own TCP port, or
3047 it can share the port that the buildmaster is already using for the
3048 buildslaves to connect. (This is possible because the
3049 @code{PBChangeSource} uses the same protocol as the buildslaves, and
3050 they can be distinguished by the @code{username} attribute used when
3051 the initial connection is established). It might be useful to have it
3052 listen on a different port if, for example, you wanted to establish
3053 different firewall rules for that port. You could allow only the SVN
3054 repository machine access to the @code{PBChangeSource} port, while
3055 allowing only the buildslave machines access to the slave port. Or you
3056 could just expose one port and run everything over it. @emph{Note:
3057 this feature is not yet implemented, the PBChangeSource will always
3058 share the slave port and will always have a @code{user} name of
3059 @code{change}, and a passwd of @code{changepw}. These limitations will
3060 be removed in the future.}.
3063 The @code{PBChangeSource} is created with the following arguments. All
3064 are optional.
3066 @table @samp
3067 @item @code{port}
3068 which port to listen on. If @code{None} (which is the default), it
3069 shares the port used for buildslave connections. @emph{Not
3070 Implemented, always set to @code{None}}.
3072 @item @code{user} and @code{passwd}
3073 The user/passwd account information that the client program must use
3074 to connect. Defaults to @code{change} and @code{changepw}. @emph{Not
3075 Implemented, @code{user} is currently always set to @code{change},
3076 @code{passwd} is always set to @code{changepw}}.
3078 @item @code{prefix}
3079 The prefix to be found and stripped from filenames delivered over the
3080 connection. Any filenames which do not start with this prefix will be
3081 removed. If all the filenames in a given Change are removed, the that
3082 whole Change will be dropped. This string should probably end with a
3083 directory separator.
3085 This is useful for changes coming from version control systems that
3086 represent branches as parent directories within the repository (like
3087 SVN and Perforce). Use a prefix of 'trunk/' or
3088 'project/branches/foobranch/' to only follow one branch and to get
3089 correct tree-relative filenames. Without a prefix, the PBChangeSource
3090 will probably deliver Changes with filenames like @file{trunk/foo.c}
3091 instead of just @file{foo.c}. Of course this also depends upon the
3092 tool sending the Changes in (like @command{buildbot sendchange}) and
3093 what filenames it is delivering: that tool may be filtering and
3094 stripping prefixes at the sending end.
3096 @end table
3098 @node P4Source, BonsaiPoller, PBChangeSource, Getting Source Code Changes
3099 @section P4Source
3101 @csindex buildbot.changes.p4poller.P4Source
3103 The @code{P4Source} periodically polls a @uref{http://www.perforce.com/,
3104 Perforce} depot for changes. It accepts the following arguments:
3106 @table @samp
3107 @item @code{p4base}
3108 The base depot path to watch, without the trailing '/...'.
3110 @item @code{p4port}
3111 The Perforce server to connect to (as host:port).
3113 @item @code{p4user}
3114 The Perforce user.
3116 @item @code{p4passwd}
3117 The Perforce password.
3119 @item @code{split_file}
3120 A function that maps a pathname, without the leading @code{p4base}, to a
3121 (branch, filename) tuple. The default just returns (None, branchfile),
3122 which effectively disables branch support. You should supply a function
3123 which understands your repository structure.
3125 @item @code{pollinterval}
3126 How often to poll, in seconds. Defaults to 600 (10 minutes).
3128 @item @code{histmax}
3129 The maximum number of changes to inspect at a time. If more than this
3130 number occur since the last poll, older changes will be silently
3131 ignored.
3132 @end table
3134 @heading Example
3136 This configuration uses the @code{P4PORT}, @code{P4USER}, and @code{P4PASSWD}
3137 specified in the buildmaster's environment. It watches a project in which the
3138 branch name is simply the next path component, and the file is all path
3139 components after.
3141 @example
3142 import buildbot.changes.p4poller
3143 s = p4poller.P4Source(p4base='//depot/project/',
3144                       split_file=lambda branchfile: branchfile.split('/',1),
3145                      )
3146 c['change_source'] = s
3147 @end example
3149 @node BonsaiPoller, SVNPoller, P4Source, Getting Source Code Changes
3150 @section BonsaiPoller
3152 @csindex buildbot.changes.bonsaipoller.BonsaiPoller
3154 The @code{BonsaiPoller} periodically polls a Bonsai server. This is a
3155 CGI script accessed through a web server that provides information
3156 about a CVS tree, for example the Mozilla bonsai server at
3157 @uref{http://bonsai.mozilla.org}. Bonsai servers are usable by both
3158 humans and machines. In this case, the buildbot's change source forms
3159 a query which asks about any files in the specified branch which have
3160 changed since the last query.
3162 Please take a look at the BonsaiPoller docstring for details about the
3163 arguments it accepts.
3166 @node SVNPoller, MercurialHook, BonsaiPoller, Getting Source Code Changes
3167 @section SVNPoller
3169 @csindex buildbot.changes.svnpoller.SVNPoller
3171 The @code{buildbot.changes.svnpoller.SVNPoller} is a ChangeSource
3172 which periodically polls a @uref{http://subversion.tigris.org/,
3173 Subversion} repository for new revisions, by running the @code{svn
3174 log} command in a subshell. It can watch a single branch or multiple
3175 branches.
3177 @code{SVNPoller} accepts the following arguments:
3179 @table @code
3180 @item svnurl
3181 The base URL path to watch, like
3182 @code{svn://svn.twistedmatrix.com/svn/Twisted/trunk}, or
3183 @code{http://divmod.org/svn/Divmod/}, or even
3184 @code{file:///home/svn/Repository/ProjectA/branches/1.5/}. This must
3185 include the access scheme, the location of the repository (both the
3186 hostname for remote ones, and any additional directory names necessary
3187 to get to the repository), and the sub-path within the repository's
3188 virtual filesystem for the project and branch of interest.
3190 The @code{SVNPoller} will only pay attention to files inside the
3191 subdirectory specified by the complete svnurl.
3193 @item split_file
3194 A function to convert pathnames into (branch, relative_pathname)
3195 tuples. Use this to explain your repository's branch-naming policy to
3196 @code{SVNPoller}. This function must accept a single string and return
3197 a two-entry tuple. There are a few utility functions in
3198 @code{buildbot.changes.svnpoller} that can be used as a
3199 @code{split_file} function, see below for details.
3201 The default value always returns (None, path), which indicates that
3202 all files are on the trunk.
3204 Subclasses of @code{SVNPoller} can override the @code{split_file}
3205 method instead of using the @code{split_file=} argument.
3207 @item svnuser
3208 An optional string parameter. If set, the @code{--user} argument will
3209 be added to all @code{svn} commands. Use this if you have to
3210 authenticate to the svn server before you can do @code{svn info} or
3211 @code{svn log} commands.
3213 @item svnpasswd
3214 Like @code{svnuser}, this will cause a @code{--password} argument to
3215 be passed to all svn commands.
3217 @item pollinterval
3218 How often to poll, in seconds. Defaults to 600 (checking once every 10
3219 minutes). Lower this if you want the buildbot to notice changes
3220 faster, raise it if you want to reduce the network and CPU load on
3221 your svn server. Please be considerate of public SVN repositories by
3222 using a large interval when polling them.
3224 @item histmax
3225 The maximum number of changes to inspect at a time. Every POLLINTERVAL
3226 seconds, the @code{SVNPoller} asks for the last HISTMAX changes and
3227 looks through them for any ones it does not already know about. If
3228 more than HISTMAX revisions have been committed since the last poll,
3229 older changes will be silently ignored. Larger values of histmax will
3230 cause more time and memory to be consumed on each poll attempt.
3231 @code{histmax} defaults to 100.
3233 @item svnbin
3234 This controls the @code{svn} executable to use. If subversion is
3235 installed in a weird place on your system (outside of the
3236 buildmaster's @code{$PATH}), use this to tell @code{SVNPoller} where
3237 to find it. The default value of ``svn'' will almost always be
3238 sufficient.
3240 @end table
3242 @heading Branches
3244 Each source file that is tracked by a Subversion repository has a
3245 fully-qualified SVN URL in the following form:
3246 (REPOURL)(PROJECT-plus-BRANCH)(FILEPATH). When you create the
3247 @code{SVNPoller}, you give it a @code{svnurl} value that includes all
3248 of the REPOURL and possibly some portion of the PROJECT-plus-BRANCH
3249 string. The @code{SVNPoller} is responsible for producing Changes that
3250 contain a branch name and a FILEPATH (which is relative to the top of
3251 a checked-out tree). The details of how these strings are split up
3252 depend upon how your repository names its branches.
3254 @subheading PROJECT/BRANCHNAME/FILEPATH repositories
3256 One common layout is to have all the various projects that share a
3257 repository get a single top-level directory each. Then under a given
3258 project's directory, you get two subdirectories, one named ``trunk''
3259 and another named ``branches''. Under ``branches'' you have a bunch of
3260 other directories, one per branch, with names like ``1.5.x'' and
3261 ``testing''. It is also common to see directories like ``tags'' and
3262 ``releases'' next to ``branches'' and ``trunk''.
3264 For example, the Twisted project has a subversion server on
3265 ``svn.twistedmatrix.com'' that hosts several sub-projects. The
3266 repository is available through a SCHEME of ``svn:''. The primary
3267 sub-project is Twisted, of course, with a repository root of
3268 ``svn://svn.twistedmatrix.com/svn/Twisted''. Another sub-project is
3269 Informant, with a root of
3270 ``svn://svn.twistedmatrix.com/svn/Informant'', etc. Inside any
3271 checked-out Twisted tree, there is a file named bin/trial (which is
3272 used to run unit test suites).
3274 The trunk for Twisted is in
3275 ``svn://svn.twistedmatrix.com/svn/Twisted/trunk'', and the
3276 fully-qualified SVN URL for the trunk version of @code{trial} would be
3277 ``svn://svn.twistedmatrix.com/svn/Twisted/trunk/bin/trial''. The same
3278 SVNURL for that file on a branch named ``1.5.x'' would be
3279 ``svn://svn.twistedmatrix.com/svn/Twisted/branches/1.5.x/bin/trial''.
3281 To set up a @code{SVNPoller} that watches the Twisted trunk (and
3282 nothing else), we would use the following:
3284 @example
3285 from buildbot.changes.svnpoller import SVNPoller
3286 c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted/trunk")
3287 @end example
3289 In this case, every Change that our @code{SVNPoller} produces will
3290 have @code{.branch=None}, to indicate that the Change is on the trunk.
3291 No other sub-projects or branches will be tracked.
3293 If we want our ChangeSource to follow multiple branches, we have to do
3294 two things. First we have to change our @code{svnurl=} argument to
3295 watch more than just ``.../Twisted/trunk''. We will set it to
3296 ``.../Twisted'' so that we'll see both the trunk and all the branches.
3297 Second, we have to tell @code{SVNPoller} how to split the
3298 (PROJECT-plus-BRANCH)(FILEPATH) strings it gets from the repository
3299 out into (BRANCH) and (FILEPATH) pairs.
3301 We do the latter by providing a ``split_file'' function. This function
3302 is responsible for splitting something like
3303 ``branches/1.5.x/bin/trial'' into @code{branch}=''branches/1.5.x'' and
3304 @code{filepath}=''bin/trial''. This function is always given a string
3305 that names a file relative to the subdirectory pointed to by the
3306 @code{SVNPoller}'s @code{svnurl=} argument. It is expected to return a
3307 (BRANCHNAME, FILEPATH) tuple (in which FILEPATH is relative to the
3308 branch indicated), or None to indicate that the file is outside any
3309 project of interest.
3311 (note that we want to see ``branches/1.5.x'' rather than just
3312 ``1.5.x'' because when we perform the SVN checkout, we will probably
3313 append the branch name to the baseURL, which requires that we keep the
3314 ``branches'' component in there. Other VC schemes use a different
3315 approach towards branches and may not require this artifact.)
3317 If your repository uses this same PROJECT/BRANCH/FILEPATH naming
3318 scheme, the following function will work:
3320 @example
3321 def split_file_branches(path):
3322     pieces = path.split('/')
3323     if pieces[0] == 'trunk':
3324         return (None, '/'.join(pieces[1:]))
3325     elif pieces[0] == 'branches':
3326         return ('/'.join(pieces[0:2]),
3327                 '/'.join(pieces[2:]))
3328     else:
3329         return None
3330 @end example
3332 This function is provided as
3333 @code{buildbot.changes.svnpoller.split_file_branches} for your
3334 convenience. So to have our Twisted-watching @code{SVNPoller} follow
3335 multiple branches, we would use this:
3337 @example
3338 from buildbot.changes.svnpoller import SVNPoller, split_file_branches
3339 c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted",
3340                                split_file=split_file_branches)
3341 @end example
3343 Changes for all sorts of branches (with names like ``branches/1.5.x'',
3344 and None to indicate the trunk) will be delivered to the Schedulers.
3345 Each Scheduler is then free to use or ignore each branch as it sees
3346 fit.
3348 @subheading BRANCHNAME/PROJECT/FILEPATH repositories
3350 Another common way to organize a Subversion repository is to put the
3351 branch name at the top, and the projects underneath. This is
3352 especially frequent when there are a number of related sub-projects
3353 that all get released in a group.
3355 For example, Divmod.org hosts a project named ``Nevow'' as well as one
3356 named ``Quotient''. In a checked-out Nevow tree there is a directory
3357 named ``formless'' that contains a python source file named
3358 ``webform.py''. This repository is accessible via webdav (and thus
3359 uses an ``http:'' scheme) through the divmod.org hostname. There are
3360 many branches in this repository, and they use a
3361 (BRANCHNAME)/(PROJECT) naming policy.
3363 The fully-qualified SVN URL for the trunk version of webform.py is
3364 @code{http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.py}.
3365 You can do an @code{svn co} with that URL and get a copy of the latest
3366 version. The 1.5.x branch version of this file would have a URL of
3367 @code{http://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.py}.
3368 The whole Nevow trunk would be checked out with
3369 @code{http://divmod.org/svn/Divmod/trunk/Nevow}, while the Quotient
3370 trunk would be checked out using
3371 @code{http://divmod.org/svn/Divmod/trunk/Quotient}.
3373 Now suppose we want to have an @code{SVNPoller} that only cares about
3374 the Nevow trunk. This case looks just like the PROJECT/BRANCH layout
3375 described earlier:
3377 @example
3378 from buildbot.changes.svnpoller import SVNPoller
3379 c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")
3380 @end example
3382 But what happens when we want to track multiple Nevow branches? We
3383 have to point our @code{svnurl=} high enough to see all those
3384 branches, but we also don't want to include Quotient changes (since
3385 we're only building Nevow). To accomplish this, we must rely upon the
3386 @code{split_file} function to help us tell the difference between
3387 files that belong to Nevow and those that belong to Quotient, as well
3388 as figuring out which branch each one is on.
3390 @example
3391 from buildbot.changes.svnpoller import SVNPoller
3392 c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod",
3393                                split_file=my_file_splitter)
3394 @end example
3396 The @code{my_file_splitter} function will be called with
3397 repository-relative pathnames like:
3399 @table @code
3400 @item trunk/Nevow/formless/webform.py
3401 This is a Nevow file, on the trunk. We want the Change that includes this
3402 to see a filename of @code{formless/webform.py"}, and a branch of None
3404 @item branches/1.5.x/Nevow/formless/webform.py
3405 This is a Nevow file, on a branch. We want to get
3406 branch=''branches/1.5.x'' and filename=''formless/webform.py''.
3408 @item trunk/Quotient/setup.py
3409 This is a Quotient file, so we want to ignore it by having
3410 @code{my_file_splitter} return None.
3412 @item branches/1.5.x/Quotient/setup.py
3413 This is also a Quotient file, which should be ignored.
3414 @end table
3416 The following definition for @code{my_file_splitter} will do the job:
3418 @example
3419 def my_file_splitter(path):
3420     pieces = path.split('/')
3421     if pieces[0] == 'trunk':
3422         branch = None
3423         pieces.pop(0) # remove 'trunk'
3424     elif pieces[0] == 'branches':
3425         pieces.pop(0) # remove 'branches'
3426         # grab branch name
3427         branch = 'branches/' + pieces.pop(0)
3428     else:
3429         return None # something weird
3430     projectname = pieces.pop(0)
3431     if projectname != 'Nevow':
3432         return None # wrong project
3433     return (branch, '/'.join(pieces))
3434 @end example
3436 @node MercurialHook,  , SVNPoller, Getting Source Code Changes
3437 @section MercurialHook
3439 Since Mercurial is written in python, the hook script can invoke
3440 Buildbot's @code{sendchange} function directly, rather than having to
3441 spawn an external process. This function delivers the same sort of
3442 changes as @code{buildbot sendchange} and the various hook scripts in
3443 contrib/, so you'll need to add a @code{pb.PBChangeSource} to your
3444 buildmaster to receive these changes.
3446 To set this up, first choose a Mercurial repository that represents
3447 your central ``official'' source tree. This will be the same
3448 repository that your buildslaves will eventually pull from. Install
3449 Buildbot on the machine that hosts this repository, using the same
3450 version of python as Mercurial is using (so that the Mercurial hook
3451 can import code from buildbot). Then add the following to the
3452 @code{.hg/hgrc} file in that repository, replacing the buildmaster
3453 hostname/portnumber as appropriate for your buildbot:
3455 @example
3456 [hooks]
3457 changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook
3459 [hgbuildbot]
3460 master = buildmaster.example.org:9987
3461 @end example
3463 (Note that Mercurial lets you define multiple @code{changegroup} hooks
3464 by giving them distinct names, like @code{changegroup.foo} and
3465 @code{changegroup.bar}, which is why we use
3466 @code{changegroup.buildbot} in this example. There is nothing magical
3467 about the ``buildbot'' suffix in the hook name. The
3468 @code{[hgbuildbot]} section @emph{is} special, however, as it is the
3469 only section that the buildbot hook pays attention to.)
3471 Also note that this runs as a @code{changegroup} hook, rather than as
3472 an @code{incoming} hook. The @code{changegroup} hook is run with
3473 multiple revisions at a time (say, if multiple revisions are being
3474 pushed to this repository in a single @command{hg push} command),
3475 whereas the @code{incoming} hook is run with just one revision at a
3476 time. The @code{hgbuildbot.hook} function will only work with the
3477 @code{changegroup} hook.
3479 The @code{[hgbuildbot]} section has two other parameters that you
3480 might specify, both of which control the name of the branch that is
3481 attached to the changes coming from this hook.
3483 One common branch naming policy for Mercurial repositories is to use
3484 it just like Darcs: each branch goes into a separate repository, and
3485 all the branches for a single project share a common parent directory.
3486 For example, you might have @file{/var/repos/PROJECT/trunk/} and
3487 @file{/var/repos/PROJECT/release}. To use this style, use the
3488 @code{branchtype = dirname} setting, which simply uses the last
3489 component of the repository's enclosing directory as the branch name:
3491 @example
3492 [hgbuildbot]
3493 master = buildmaster.example.org:9987
3494 branchtype = dirname
3495 @end example
3497 Another approach is to use Mercurial's built-in branches (the kind
3498 created with @command{hg branch} and listed with @command{hg
3499 branches}). This feature associates persistent names with particular
3500 lines of descent within a single repository. (note that the buildbot
3501 @code{source.Mercurial} checkout step does not yet support this kind
3502 of branch). To have the commit hook deliver this sort of branch name
3503 with the Change object, use @code{branchtype = inrepo}:
3505 @example
3506 [hgbuildbot]
3507 master = buildmaster.example.org:9987
3508 branchtype = inrepo
3509 @end example
3511 Finally, if you want to simply specify the branchname directly, for
3512 all changes, use @code{branch = BRANCHNAME}. This overrides
3513 @code{branchtype}:
3515 @example
3516 [hgbuildbot]
3517 master = buildmaster.example.org:9987
3518 branch = trunk
3519 @end example
3521 If you use @code{branch=} like this, you'll need to put a separate
3522 .hgrc in each repository. If you use @code{branchtype=}, you may be
3523 able to use the same .hgrc for all your repositories, stored in
3524 @file{~/.hgrc} or @file{/etc/mercurial/hgrc}.
3527 @node Build Process, Status Delivery, Getting Source Code Changes, Top
3528 @chapter Build Process
3530 A @code{Build} object is responsible for actually performing a build.
3531 It gets access to a remote @code{SlaveBuilder} where it may run
3532 commands, and a @code{BuildStatus} object where it must emit status
3533 events. The @code{Build} is created by the Builder's
3534 @code{BuildFactory}.
3536 The default @code{Build} class is made up of a fixed sequence of
3537 @code{BuildSteps}, executed one after another until all are complete
3538 (or one of them indicates that the build should be halted early). The
3539 default @code{BuildFactory} creates instances of this @code{Build}
3540 class with a list of @code{BuildSteps}, so the basic way to configure
3541 the build is to provide a list of @code{BuildSteps} to your
3542 @code{BuildFactory}.
3544 More complicated @code{Build} subclasses can make other decisions:
3545 execute some steps only if certain files were changed, or if certain
3546 previous steps passed or failed. The base class has been written to
3547 allow users to express basic control flow without writing code, but
3548 you can always subclass and customize to achieve more specialized
3549 behavior.
3551 @menu
3552 * Build Steps::                 
3553 * Interlocks::                  
3554 * Build Factories::             
3555 @end menu
3557 @node Build Steps, Interlocks, Build Process, Build Process
3558 @section Build Steps
3560 @code{BuildStep}s are usually specified in the buildmaster's
3561 configuration file, in a list that goes into the @code{BuildFactory}.
3562 The @code{BuildStep} instances in this list are used as templates to
3563 construct new independent copies for each build (so that state can be
3564 kept on the @code{BuildStep} in one build without affecting a later
3565 build). Each @code{BuildFactory} can be created with a list of steps,
3566 or the factory can be created empty and then steps added to it using
3567 the @code{addStep} method:
3569 @example
3570 from buildbot.steps import source, shell
3571 from buildbot.process import factory
3573 f = factory.BuildFactory()
3574 f.addStep(source.SVN(svnurl="http://svn.example.org/Trunk/"))
3575 f.addStep(shell.ShellCommand(command=["make", "all"]))
3576 f.addStep(shell.ShellCommand(command=["make", "test"]))
3577 @end example
3579 In earlier versions (0.7.5 and older), these steps were specified with
3580 a tuple of (step_class, keyword_arguments). Steps can still be
3581 specified this way, but the preferred form is to pass actual
3582 @code{BuildStep} instances to @code{addStep}, because that gives the
3583 @code{BuildStep} class a chance to do some validation on the
3584 arguments.
3586 The rest of this section lists all the standard BuildStep objects
3587 available for use in a Build, and the parameters which can be used to
3588 control each.
3590 @menu
3591 * Common Parameters::           
3592 * Source Checkout::             
3593 * ShellCommand::                
3594 * Simple ShellCommand Subclasses::  
3595 * Python BuildSteps::           
3596 * Transferring Files::          
3597 * Writing New BuildSteps::      
3598 @end menu
3600 @node Common Parameters, Source Checkout, Build Steps, Build Steps
3601 @subsection Common Parameters
3603 The standard @code{Build} runs a series of @code{BuildStep}s in order,
3604 only stopping when it runs out of steps or if one of them requests
3605 that the build be halted. It collects status information from each one
3606 to create an overall build status (of SUCCESS, WARNINGS, or FAILURE).
3608 All BuildSteps accept some common parameters. Some of these control
3609 how their individual status affects the overall build. Others are used
3610 to specify which @code{Locks} (see @pxref{Interlocks}) should be
3611 acquired before allowing the step to run.
3613 Arguments common to all @code{BuildStep} subclasses:
3616 @table @code
3617 @item name
3618 the name used to describe the step on the status display. It is also
3619 used to give a name to any LogFiles created by this step.
3621 @item haltOnFailure
3622 if True, a FAILURE of this build step will cause the build to halt
3623 immediately with an overall result of FAILURE.
3625 @item flunkOnWarnings
3626 when True, a WARNINGS or FAILURE of this build step will mark the
3627 overall build as FAILURE. The remaining steps will still be executed.
3629 @item flunkOnFailure
3630 when True, a FAILURE of this build step will mark the overall build as
3631 a FAILURE. The remaining steps will still be executed.
3633 @item warnOnWarnings
3634 when True, a WARNINGS or FAILURE of this build step will mark the
3635 overall build as having WARNINGS. The remaining steps will still be
3636 executed.
3638 @item warnOnFailure
3639 when True, a FAILURE of this build step will mark the overall build as
3640 having WARNINGS. The remaining steps will still be executed.
3642 @item locks
3643 a list of Locks (instances of @code{buildbot.locks.SlaveLock} or
3644 @code{buildbot.locks.MasterLock}) that should be acquired before
3645 starting this Step. The Locks will be released when the step is
3646 complete. Note that this is a list of actual Lock instances, not
3647 names. Also note that all Locks must have unique names.
3649 @end table
3652 @node Source Checkout, ShellCommand, Common Parameters, Build Steps
3653 @subsection Source Checkout
3655 The first step of any build is typically to acquire the source code
3656 from which the build will be performed. There are several classes to
3657 handle this, one for each of the different source control system that
3658 Buildbot knows about. For a description of how Buildbot treats source
3659 control in general, see @ref{Version Control Systems}.
3661 All source checkout steps accept some common parameters to control how
3662 they get the sources and where they should be placed. The remaining
3663 per-VC-system parameters are mostly to specify where exactly the
3664 sources are coming from.
3666 @table @code
3667 @item mode
3669 a string describing the kind of VC operation that is desired. Defaults
3670 to @code{update}.
3672 @table @code
3673 @item update
3674 specifies that the CVS checkout/update should be performed directly
3675 into the workdir. Each build is performed in the same directory,
3676 allowing for incremental builds. This minimizes disk space, bandwidth,
3677 and CPU time. However, it may encounter problems if the build process
3678 does not handle dependencies properly (sometimes you must do a ``clean
3679 build'' to make sure everything gets compiled), or if source files are
3680 deleted but generated files can influence test behavior (e.g. python's
3681 .pyc files), or when source directories are deleted but generated
3682 files prevent CVS from removing them. Builds ought to be correct
3683 regardless of whether they are done ``from scratch'' or incrementally,
3684 but it is useful to test both kinds: this mode exercises the
3685 incremental-build style.
3687 @item copy
3688 specifies that the CVS workspace should be maintained in a separate
3689 directory (called the 'copydir'), using checkout or update as
3690 necessary. For each build, a new workdir is created with a copy of the
3691 source tree (rm -rf workdir; cp -r copydir workdir). This doubles the
3692 disk space required, but keeps the bandwidth low (update instead of a
3693 full checkout). A full 'clean' build is performed each time. This
3694 avoids any generated-file build problems, but is still occasionally
3695 vulnerable to CVS problems such as a repository being manually
3696 rearranged, causing CVS errors on update which are not an issue with a
3697 full checkout.
3699 @c TODO: something is screwy about this, revisit. Is it the source
3700 @c directory or the working directory that is deleted each time?
3702 @item clobber
3703 specifes that the working directory should be deleted each time,
3704 necessitating a full checkout for each build. This insures a clean
3705 build off a complete checkout, avoiding any of the problems described
3706 above. This mode exercises the ``from-scratch'' build style.
3708 @item export
3709 this is like @code{clobber}, except that the 'cvs export' command is
3710 used to create the working directory. This command removes all CVS
3711 metadata files (the CVS/ directories) from the tree, which is
3712 sometimes useful for creating source tarballs (to avoid including the
3713 metadata in the tar file).
3714 @end table
3716 @item workdir
3717 like all Steps, this indicates the directory where the build will take
3718 place. Source Steps are special in that they perform some operations
3719 outside of the workdir (like creating the workdir itself).
3721 @item alwaysUseLatest
3722 if True, bypass the usual ``update to the last Change'' behavior, and
3723 always update to the latest changes instead.
3725 @item retry
3726 If set, this specifies a tuple of @code{(delay, repeats)} which means
3727 that when a full VC checkout fails, it should be retried up to
3728 @var{repeats} times, waiting @var{delay} seconds between attempts. If
3729 you don't provide this, it defaults to @code{None}, which means VC
3730 operations should not be retried. This is provided to make life easier
3731 for buildslaves which are stuck behind poor network connections.
3733 @end table
3736 My habit as a developer is to do a @code{cvs update} and @code{make} each
3737 morning. Problems can occur, either because of bad code being checked in, or
3738 by incomplete dependencies causing a partial rebuild to fail where a
3739 complete from-scratch build might succeed. A quick Builder which emulates
3740 this incremental-build behavior would use the @code{mode='update'}
3741 setting.
3743 On the other hand, other kinds of dependency problems can cause a clean
3744 build to fail where a partial build might succeed. This frequently results
3745 from a link step that depends upon an object file that was removed from a
3746 later version of the tree: in the partial tree, the object file is still
3747 around (even though the Makefiles no longer know how to create it).
3749 ``official'' builds (traceable builds performed from a known set of
3750 source revisions) are always done as clean builds, to make sure it is
3751 not influenced by any uncontrolled factors (like leftover files from a
3752 previous build). A ``full'' Builder which behaves this way would want
3753 to use the @code{mode='clobber'} setting.
3755 Each VC system has a corresponding source checkout class: their
3756 arguments are described on the following pages.
3759 @menu
3760 * CVS::                         
3761 * SVN::                         
3762 * Darcs::                       
3763 * Mercurial::                   
3764 * Arch::                        
3765 * Bazaar::                      
3766 * Bzr::                         
3767 * P4::                          
3768 @end menu
3770 @node CVS, SVN, Source Checkout, Source Checkout
3771 @subsubsection CVS
3772 @cindex CVS Checkout
3773 @bsindex buildbot.steps.source.CVS
3776 The @code{CVS} build step performs a @uref{http://www.nongnu.org/cvs/,
3777 CVS} checkout or update. It takes the following arguments:
3779 @table @code
3780 @item cvsroot
3781 (required): specify the CVSROOT value, which points to a CVS
3782 repository, probably on a remote machine. For example, the cvsroot
3783 value you would use to get a copy of the Buildbot source code is
3784 @code{:pserver:anonymous@@cvs.sourceforge.net:/cvsroot/buildbot}
3786 @item cvsmodule
3787 (required): specify the cvs @code{module}, which is generally a
3788 subdirectory of the CVSROOT. The cvsmodule for the Buildbot source
3789 code is @code{buildbot}.
3791 @item branch
3792 a string which will be used in a @code{-r} argument. This is most
3793 useful for specifying a branch to work on. Defaults to @code{HEAD}.
3795 @item global_options
3796 a list of flags to be put before the verb in the CVS command.
3798 @item checkoutDelay
3799 if set, the number of seconds to put between the timestamp of the last
3800 known Change and the value used for the @code{-D} option. Defaults to
3801 half of the parent Build's treeStableTimer.
3803 @end table
3806 @node SVN, Darcs, CVS, Source Checkout
3807 @subsubsection SVN
3809 @cindex SVN Checkout
3810 @bsindex buildbot.steps.source.SVN
3813 The @code{SVN} build step performs a
3814 @uref{http://subversion.tigris.org, Subversion} checkout or update.
3815 There are two basic ways of setting up the checkout step, depending
3816 upon whether you are using multiple branches or not.
3818 If all of your builds use the same branch, then you should create the
3819 @code{SVN} step with the @code{svnurl} argument:
3821 @table @code
3822 @item svnurl
3823 (required): this specifies the @code{URL} argument that will be given
3824 to the @code{svn checkout} command. It dictates both where the
3825 repository is located and which sub-tree should be extracted. In this
3826 respect, it is like a combination of the CVS @code{cvsroot} and
3827 @code{cvsmodule} arguments. For example, if you are using a remote
3828 Subversion repository which is accessible through HTTP at a URL of
3829 @code{http://svn.example.com/repos}, and you wanted to check out the
3830 @code{trunk/calc} sub-tree, you would use
3831 @code{svnurl="http://svn.example.com/repos/trunk/calc"} as an argument
3832 to your @code{SVN} step.
3833 @end table
3835 If, on the other hand, you are building from multiple branches, then
3836 you should create the @code{SVN} step with the @code{baseURL} and
3837 @code{defaultBranch} arguments instead:
3839 @table @code
3840 @item baseURL
3841 (required): this specifies the base repository URL, to which a branch
3842 name will be appended. It should probably end in a slash.
3844 @item defaultBranch
3845 this specifies the name of the branch to use when a Build does not
3846 provide one of its own. This will be appended to @code{baseURL} to
3847 create the string that will be passed to the @code{svn checkout}
3848 command.
3849 @end table
3851 If you are using branches, you must also make sure your
3852 @code{ChangeSource} will report the correct branch names.
3854 @heading branch example
3856 Let's suppose that the ``MyProject'' repository uses branches for the
3857 trunk, for various users' individual development efforts, and for
3858 several new features that will require some amount of work (involving
3859 multiple developers) before they are ready to merge onto the trunk.
3860 Such a repository might be organized as follows:
3862 @example
3863 svn://svn.example.org/MyProject/trunk
3864 svn://svn.example.org/MyProject/branches/User1/foo
3865 svn://svn.example.org/MyProject/branches/User1/bar
3866 svn://svn.example.org/MyProject/branches/User2/baz
3867 svn://svn.example.org/MyProject/features/newthing
3868 svn://svn.example.org/MyProject/features/otherthing
3869 @end example
3871 Further assume that we want the Buildbot to run tests against the
3872 trunk and against all the feature branches (i.e., do a
3873 checkout/compile/build of branch X when a file has been changed on
3874 branch X, when X is in the set [trunk, features/newthing,
3875 features/otherthing]). We do not want the Buildbot to automatically
3876 build any of the user branches, but it should be willing to build a
3877 user branch when explicitly requested (most likely by the user who
3878 owns that branch).
3880 There are three things that need to be set up to accomodate this
3881 system. The first is a ChangeSource that is capable of identifying the
3882 branch which owns any given file. This depends upon a user-supplied
3883 function, in an external program that runs in the SVN commit hook and
3884 connects to the buildmaster's @code{PBChangeSource} over a TCP
3885 connection. (you can use the ``@code{buildbot sendchange}'' utility
3886 for this purpose, but you will still need an external program to
3887 decide what value should be passed to the @code{--branch=} argument).
3888 For example, a change to a file with the SVN url of
3889 ``svn://svn.example.org/MyProject/features/newthing/src/foo.c'' should
3890 be broken down into a Change instance with
3891 @code{branch='features/newthing'} and @code{file='src/foo.c'}.
3893 The second piece is an @code{AnyBranchScheduler} which will pay
3894 attention to the desired branches. It will not pay attention to the
3895 user branches, so it will not automatically start builds in response
3896 to changes there. The AnyBranchScheduler class requires you to
3897 explicitly list all the branches you want it to use, but it would not
3898 be difficult to write a subclass which used
3899 @code{branch.startswith('features/'} to remove the need for this
3900 explicit list. Or, if you want to build user branches too, you can use
3901 AnyBranchScheduler with @code{branches=None} to indicate that you want
3902 it to pay attention to all branches.
3904 The third piece is an @code{SVN} checkout step that is configured to
3905 handle the branches correctly, with a @code{baseURL} value that
3906 matches the way the ChangeSource splits each file's URL into base,
3907 branch, and file.
3909 @example
3910 from buildbot.changes.pb import PBChangeSource
3911 from buildbot.scheduler import AnyBranchScheduler
3912 from buildbot.process import source, factory
3913 from buildbot.steps import source, shell
3915 c['change_source'] = PBChangeSource()
3916 s1 = AnyBranchScheduler('main',
3917                         ['trunk', 'features/newthing', 'features/otherthing'],
3918                         10*60, ['test-i386', 'test-ppc'])
3919 c['schedulers'] = [s1]
3921 f = factory.BuildFactory()
3922 f.addStep(source.SVN(mode='update',
3923                      baseURL='svn://svn.example.org/MyProject/',
3924                      defaultBranch='trunk'))
3925 f.addStep(shell.Compile(command="make all"))
3926 f.addStep(shell.Test(command="make test"))
3928 c['builders'] = [
3929   @{'name':'test-i386', 'slavename':'bot-i386', 'builddir':'test-i386',
3930                        'factory':f @},
3931   @{'name':'test-ppc', 'slavename':'bot-ppc', 'builddir':'test-ppc',
3932                       'factory':f @},
3934 @end example
3936 In this example, when a change arrives with a @code{branch} attribute
3937 of ``trunk'', the resulting build will have an SVN step that
3938 concatenates ``svn://svn.example.org/MyProject/'' (the baseURL) with
3939 ``trunk'' (the branch name) to get the correct svn command. If the
3940 ``newthing'' branch has a change to ``src/foo.c'', then the SVN step
3941 will concatenate ``svn://svn.example.org/MyProject/'' with
3942 ``features/newthing'' to get the svnurl for checkout.
3944 @node Darcs, Mercurial, SVN, Source Checkout
3945 @subsubsection Darcs
3947 @cindex Darcs Checkout
3948 @bsindex buildbot.steps.source.Darcs
3951 The @code{Darcs} build step performs a
3952 @uref{http://darcs.net/, Darcs} checkout or update.
3954 Like @xref{SVN}, this step can either be configured to always check
3955 out a specific tree, or set up to pull from a particular branch that
3956 gets specified separately for each build. Also like SVN, the
3957 repository URL given to Darcs is created by concatenating a
3958 @code{baseURL} with the branch name, and if no particular branch is
3959 requested, it uses a @code{defaultBranch}. The only difference in
3960 usage is that each potential Darcs repository URL must point to a
3961 fully-fledged repository, whereas SVN URLs usually point to sub-trees
3962 of the main Subversion repository. In other words, doing an SVN
3963 checkout of @code{baseURL} is legal, but silly, since you'd probably
3964 wind up with a copy of every single branch in the whole repository.
3965 Doing a Darcs checkout of @code{baseURL} is just plain wrong, since
3966 the parent directory of a collection of Darcs repositories is not
3967 itself a valid repository.
3969 The Darcs step takes the following arguments:
3971 @table @code
3972 @item repourl
3973 (required unless @code{baseURL} is provided): the URL at which the
3974 Darcs source repository is available.
3976 @item baseURL
3977 (required unless @code{repourl} is provided): the base repository URL,
3978 to which a branch name will be appended. It should probably end in a
3979 slash.
3981 @item defaultBranch
3982 (allowed if and only if @code{baseURL} is provided): this specifies
3983 the name of the branch to use when a Build does not provide one of its
3984 own. This will be appended to @code{baseURL} to create the string that
3985 will be passed to the @code{darcs get} command.
3986 @end table
3988 @node Mercurial, Arch, Darcs, Source Checkout
3989 @subsubsection Mercurial
3991 @cindex Mercurial Checkout
3992 @bsindex buildbot.steps.source.Mercurial
3995 The @code{Mercurial} build step performs a
3996 @uref{http://selenic.com/mercurial, Mercurial} (aka ``hg'') checkout
3997 or update.
3999 Branches are handled just like @xref{Darcs}.
4001 The Mercurial step takes the following arguments:
4003 @table @code
4004 @item repourl
4005 (required unless @code{baseURL} is provided): the URL at which the
4006 Mercurial source repository is available.
4008 @item baseURL
4009 (required unless @code{repourl} is provided): the base repository URL,
4010 to which a branch name will be appended. It should probably end in a
4011 slash.
4013 @item defaultBranch
4014 (allowed if and only if @code{baseURL} is provided): this specifies
4015 the name of the branch to use when a Build does not provide one of its
4016 own. This will be appended to @code{baseURL} to create the string that
4017 will be passed to the @code{hg clone} command.
4018 @end table
4021 @node Arch, Bazaar, Mercurial, Source Checkout
4022 @subsubsection Arch
4024 @cindex Arch Checkout
4025 @bsindex buildbot.steps.source.Arch
4028 The @code{Arch} build step performs an @uref{http://gnuarch.org/,
4029 Arch} checkout or update using the @code{tla} client. It takes the
4030 following arguments:
4032 @table @code
4033 @item url
4034 (required): this specifies the URL at which the Arch source archive is
4035 available.
4037 @item version
4038 (required): this specifies which ``development line'' (like a branch)
4039 should be used. This provides the default branch name, but individual
4040 builds may specify a different one.
4042 @item archive
4043 (optional): Each repository knows its own archive name. If this
4044 parameter is provided, it must match the repository's archive name.
4045 The parameter is accepted for compatibility with the @code{Bazaar}
4046 step, below.
4048 @end table
4050 @node Bazaar, Bzr, Arch, Source Checkout
4051 @subsubsection Bazaar
4053 @cindex Bazaar Checkout
4054 @bsindex buildbot.steps.source.Bazaar
4057 @code{Bazaar} is an alternate implementation of the Arch VC system,
4058 which uses a client named @code{baz}. The checkout semantics are just
4059 different enough from @code{tla} that there is a separate BuildStep for
4062 It takes exactly the same arguments as @code{Arch}, except that the
4063 @code{archive=} parameter is required. (baz does not emit the archive
4064 name when you do @code{baz register-archive}, so we must provide it
4065 ourselves).
4068 @node Bzr, P4, Bazaar, Source Checkout
4069 @subsubsection Bzr
4071 @cindex Bzr Checkout
4072 @bsindex buildbot.steps.source.Bzr
4074 @code{bzr} is a descendant of Arch/Baz, and is frequently referred to
4075 as simply ``Bazaar''. The repository-vs-workspace model is similar to
4076 Darcs, but it uses a strictly linear sequence of revisions (one
4077 history per branch) like Arch. Branches are put in subdirectories.
4078 This makes it look very much like Mercurial, so it takes the same
4079 arguments:
4081 @table @code
4083 @item repourl
4084 (required unless @code{baseURL} is provided): the URL at which the
4085 Bzr source repository is available.
4087 @item baseURL
4088 (required unless @code{repourl} is provided): the base repository URL,
4089 to which a branch name will be appended. It should probably end in a
4090 slash.
4092 @item defaultBranch
4093 (allowed if and only if @code{baseURL} is provided): this specifies
4094 the name of the branch to use when a Build does not provide one of its
4095 own. This will be appended to @code{baseURL} to create the string that
4096 will be passed to the @code{bzr checkout} command.
4097 @end table
4101 @node P4,  , Bzr, Source Checkout
4102 @subsubsection P4
4104 @cindex Perforce Update
4105 @bsindex buildbot.steps.source.P4
4106 @c TODO @bsindex buildbot.steps.source.P4Sync
4109 The @code{P4} build step creates a @uref{http://www.perforce.com/,
4110 Perforce} client specification and performs an update.
4112 @table @code
4113 @item p4base
4114 A view into the Perforce depot without branch name or trailing "...".
4115 Typically "//depot/proj/".
4116 @item defaultBranch
4117 A branch name to append on build requests if none is specified.
4118 Typically "trunk".
4119 @item p4port
4120 (optional): the host:port string describing how to get to the P4 Depot
4121 (repository), used as the -p argument for all p4 commands.
4122 @item p4user
4123 (optional): the Perforce user, used as the -u argument to all p4
4124 commands.
4125 @item p4passwd
4126 (optional): the Perforce password, used as the -p argument to all p4
4127 commands.
4128 @item p4extra_views
4129 (optional): a list of (depotpath, clientpath) tuples containing extra
4130 views to be mapped into the client specification. Both will have
4131 "/..." appended automatically. The client name and source directory
4132 will be prepended to the client path.
4133 @item p4client
4134 (optional): The name of the client to use. In mode='copy' and
4135 mode='update', it's particularly important that a unique name is used
4136 for each checkout directory to avoid incorrect synchronization. For
4137 this reason, Python percent substitution will be performed on this value
4138 to replace %(slave)s with the slave name and %(builder)s with the
4139 builder name. The default is "buildbot_%(slave)s_%(build)s".
4140 @end table
4142 @node ShellCommand, Simple ShellCommand Subclasses, Source Checkout, Build Steps
4143 @subsection ShellCommand
4145 @bsindex buildbot.steps.shell.ShellCommand
4146 @c TODO @bsindex buildbot.steps.shell.TreeSize
4148 This is a useful base class for just about everything you might want
4149 to do during a build (except for the initial source checkout). It runs
4150 a single command in a child shell on the buildslave. All stdout/stderr
4151 is recorded into a LogFile. The step finishes with a status of FAILURE
4152 if the command's exit code is non-zero, otherwise it has a status of
4153 SUCCESS.
4155 The preferred way to specify the command is with a list of argv strings,
4156 since this allows for spaces in filenames and avoids doing any fragile
4157 shell-escaping. You can also specify the command with a single string, in
4158 which case the string is given to '/bin/sh -c COMMAND' for parsing.
4160 All ShellCommands are run by default in the ``workdir'', which
4161 defaults to the ``@file{build}'' subdirectory of the slave builder's
4162 base directory. The absolute path of the workdir will thus be the
4163 slave's basedir (set as an option to @code{buildbot create-slave},
4164 @pxref{Creating a buildslave}) plus the builder's basedir (set in the
4165 builder's @code{c['builddir']} key in master.cfg) plus the workdir
4166 itself (a class-level attribute of the BuildFactory, defaults to
4167 ``@file{build}'').
4169 @code{ShellCommand} arguments:
4171 @table @code
4172 @item command
4173 a list of strings (preferred) or single string (discouraged) which
4174 specifies the command to be run. A list of strings is preferred
4175 because it can be used directly as an argv array. Using a single
4176 string (with embedded spaces) requires the buildslave to pass the
4177 string to /bin/sh for interpretation, which raises all sorts of
4178 difficult questions about how to escape or interpret shell
4179 metacharacters.
4181 @item env
4182 a dictionary of environment strings which will be added to the child
4183 command's environment. For example, to run tests with a different i18n
4184 language setting, you might use
4186 @example
4187 f.addStep(ShellCommand, command=["make", "test"],
4188           env=@{'LANG': 'fr_FR'@})
4189 @end example
4191 These variable settings will override any existing ones in the
4192 buildslave's environment. The exception is PYTHONPATH, which is merged
4193 with (actually prepended to) any existing $PYTHONPATH setting. The
4194 value is treated as a list of directories to prepend, and a single
4195 string is treated like a one-item list. For example, to prepend both
4196 @file{/usr/local/lib/python2.3} and @file{/home/buildbot/lib/python}
4197 to any existing $PYTHONPATH setting, you would do something like the
4198 following:
4200 @example
4201 f.addStep(ShellCommand, command=["make", "test"],
4202           env=@{'PYTHONPATH': ["/usr/local/lib/python2.3",
4203                               "/home/buildbot/lib/python"] @})
4204 @end example
4206 @item want_stdout
4207 if False, stdout from the child process is discarded rather than being
4208 sent to the buildmaster for inclusion in the step's LogFile.
4210 @item want_stderr
4211 like @code{want_stdout} but for stderr. Note that commands run through
4212 a PTY do not have separate stdout/stderr streams: both are merged into
4213 stdout.
4215 @item logfiles
4216 Sometimes commands will log interesting data to a local file, rather
4217 than emitting everything to stdout or stderr. For example, Twisted's
4218 ``trial'' command (which runs unit tests) only presents summary
4219 information to stdout, and puts the rest into a file named
4220 @file{_trial_temp/test.log}. It is often useful to watch these files
4221 as the command runs, rather than using @command{/bin/cat} to dump
4222 their contents afterwards.
4224 The @code{logfiles=} argument allows you to collect data from these
4225 secondary logfiles in near-real-time, as the step is running. It
4226 accepts a dictionary which maps from a local Log name (which is how
4227 the log data is presented in the build results) to a remote filename
4228 (interpreted relative to the build's working directory). Each named
4229 file will be polled on a regular basis (every couple of seconds) as
4230 the build runs, and any new text will be sent over to the buildmaster.
4232 @example
4233 f.addStep(ShellCommand, command=["make", "test"],
4234           logfiles=@{"triallog": "_trial_temp/test.log"@})
4235 @end example
4238 @item timeout
4239 if the command fails to produce any output for this many seconds, it
4240 is assumed to be locked up and will be killed.
4242 @item description
4243 This will be used to describe the command (on the Waterfall display)
4244 while the command is still running. It should be a single
4245 imperfect-tense verb, like ``compiling'' or ``testing''. The preferred
4246 form is a list of short strings, which allows the HTML Waterfall
4247 display to create narrower columns by emitting a <br> tag between each
4248 word. You may also provide a single string.
4250 @item descriptionDone
4251 This will be used to describe the command once it has finished. A
4252 simple noun like ``compile'' or ``tests'' should be used. Like
4253 @code{description}, this may either be a list of short strings or a
4254 single string.
4256 If neither @code{description} nor @code{descriptionDone} are set, the
4257 actual command arguments will be used to construct the description.
4258 This may be a bit too wide to fit comfortably on the Waterfall
4259 display.
4261 @example
4262 f.addStep(ShellCommand, command=["make", "test"],
4263           description=["testing"],
4264           descriptionDone=["tests"])
4265 @end example
4267 @end table
4269 @node Simple ShellCommand Subclasses, Python BuildSteps, ShellCommand, Build Steps
4270 @subsection Simple ShellCommand Subclasses
4272 Several subclasses of ShellCommand are provided as starting points for
4273 common build steps. These are all very simple: they just override a few
4274 parameters so you don't have to specify them yourself, making the master.cfg
4275 file less verbose.
4277 @menu
4278 * Configure::                   
4279 * Compile::                     
4280 * Test::                        
4281 * Build Properties::            
4282 @end menu
4284 @node Configure, Compile, Simple ShellCommand Subclasses, Simple ShellCommand Subclasses
4285 @subsubsection Configure
4287 @bsindex buildbot.steps.shell.Configure
4289 This is intended to handle the @code{./configure} step from
4290 autoconf-style projects, or the @code{perl Makefile.PL} step from perl
4291 MakeMaker.pm-style modules. The default command is @code{./configure}
4292 but you can change this by providing a @code{command=} parameter.
4294 @node Compile, Test, Configure, Simple ShellCommand Subclasses
4295 @subsubsection Compile
4297 @bsindex buildbot.steps.shell.Compile
4299 This is meant to handle compiling or building a project written in C. The
4300 default command is @code{make all}. When the compile is finished, the
4301 log file is scanned for GCC error/warning messages and a summary log is
4302 created with any problems that were seen (TODO: the summary is not yet
4303 created).
4305 @node Test, Build Properties, Compile, Simple ShellCommand Subclasses
4306 @subsubsection Test
4308 @bsindex buildbot.steps.shell.Test
4310 This is meant to handle unit tests. The default command is @code{make
4311 test}, and the @code{warnOnFailure} flag is set.
4315 @node Build Properties,  , Test, Simple ShellCommand Subclasses
4316 @subsubsection Build Properties
4318 @cindex build properties
4320 Each build has a set of ``Build Properties'', which can be used by its
4321 BuildStep to modify their actions. For example, the SVN revision
4322 number of the source code being built is available as a build
4323 property, and a ShellCommand step could incorporate this number into a
4324 command which create a numbered release tarball.
4326 Some build properties are set when the build starts, such as the
4327 SourceStamp information. Other properties can be set by BuildSteps as
4328 they run, for example the various Source steps will set the
4329 @code{got_revision} property to the source revision that was actually
4330 checked out (which can be useful when the SourceStamp in use merely
4331 requested the ``latest revision'': @code{got_revision} will tell you
4332 what was actually built).
4334 In custom BuildSteps, you can get and set the build properties with
4335 the @code{getProperty}/@code{setProperty} methods. Each takes a string
4336 for the name of the property, and returns or accepts an
4337 arbitrary@footnote{Build properties are serialized along with the
4338 build results, so they must be serializable. For this reason, the
4339 value of any build property should be simple inert data: strings,
4340 numbers, lists, tuples, and dictionaries. They should not contain
4341 class instances.} object. For example:
4343 @example
4344 class MakeTarball(ShellCommand):
4345     def start(self):
4346         self.setCommand(["tar", "czf",
4347                          "build-%s.tar.gz" % self.getProperty("revision"),
4348                          "source"])
4349         ShellCommand.start(self)
4350 @end example
4352 @cindex WithProperties
4354 You can use build properties in ShellCommands by using the
4355 @code{WithProperties} wrapper when setting the arguments of the
4356 ShellCommand. This interpolates the named build properties into the
4357 generated shell command. You can also use a @code{WithProperties} as
4358 the @code{workdir=} argument: this allows the working directory for a
4359 command to be varied for each build, depending upon various build
4360 properties.
4362 @example
4363 from buildbot.steps.shell import ShellCommand, WithProperties
4365 f.addStep(ShellCommand,
4366           command=["tar", "czf",
4367                    WithProperties("build-%s.tar.gz", "revision"),
4368                    "source"])
4369 @end example
4371 If this BuildStep were used in a tree obtained from Subversion, it
4372 would create a tarball with a name like @file{build-1234.tar.gz}.
4374 The @code{WithProperties} function does @code{printf}-style string
4375 interpolation, using strings obtained by calling
4376 @code{build.getProperty(propname)}. Note that for every @code{%s} (or
4377 @code{%d}, etc), you must have exactly one additional argument to
4378 indicate which build property you want to insert.
4381 You can also use python dictionary-style string interpolation by using
4382 the @code{%(propname)s} syntax. In this form, the property name goes
4383 in the parentheses, and WithProperties takes @emph{no} additional
4384 arguments:
4386 @example
4387 f.addStep(ShellCommand,
4388           command=["tar", "czf",
4389                    WithProperties("build-%(revision)s.tar.gz"),
4390                    "source"])
4391 @end example
4393 Don't forget the extra ``s'' after the closing parenthesis! This is
4394 the cause of many confusing errors. Also note that you can only use
4395 WithProperties in the list form of the command= definition. You cannot
4396 currently use it in the (discouraged) @code{command="stuff"}
4397 single-string form. However, you can use something like
4398 @code{command=["/bin/sh", "-c", "stuff", WithProperties(stuff)]} to
4399 use both shell expansion and WithProperties interpolation.
4401 Note that, like python, you can either do positional-argument
4402 interpolation @emph{or} keyword-argument interpolation, not both. Thus
4403 you cannot use a string like
4404 @code{WithProperties("foo-%(revision)s-%s", "branch")}.
4406 At the moment, the only way to set build properties is by writing a
4407 custom BuildStep.
4409 @heading Common Build Properties
4411 The following build properties are set when the build is started, and
4412 are available to all steps.
4414 @table @code
4415 @item branch
4417 This comes from the build's SourceStamp, and describes which branch is
4418 being checked out. This will be @code{None} (which interpolates into
4419 @code{WithProperties} as an empty string) if the build is on the
4420 default branch, which is generally the trunk. Otherwise it will be a
4421 string like ``branches/beta1.4''. The exact syntax depends upon the VC
4422 system being used.
4424 @item revision
4426 This also comes from the SourceStamp, and is the revision of the
4427 source code tree that was requested from the VC system. When a build
4428 is requested of a specific revision (as is generally the case when the
4429 build is triggered by Changes), this will contain the revision
4430 specification. The syntax depends upon the VC system in use: for SVN
4431 it is an integer, for Mercurial it is a short string, for Darcs it is
4432 a rather large string, etc.
4434 If the ``force build'' button was pressed, the revision will be
4435 @code{None}, which means to use the most recent revision available.
4436 This is a ``trunk build''. This will be interpolated as an empty
4437 string.
4439 @item got_revision
4441 This is set when a Source step checks out the source tree, and
4442 provides the revision that was actually obtained from the VC system.
4443 In general this should be the same as @code{revision}, except for
4444 trunk builds, where @code{got_revision} indicates what revision was
4445 current when the checkout was performed. This can be used to rebuild
4446 the same source code later.
4448 Note that for some VC systems (Darcs in particular), the revision is a
4449 large string containing newlines, and is not suitable for
4450 interpolation into a filename.
4452 @item buildername
4454 This is a string that indicates which Builder the build was a part of.
4455 The combination of buildername and buildnumber uniquely identify a
4456 build.
4458 @item buildnumber
4460 Each build gets a number, scoped to the Builder (so the first build
4461 performed on any given Builder will have a build number of 0). This
4462 integer property contains the build's number.
4464 @item slavename
4466 This is a string which identifies which buildslave the build is
4467 running on.
4469 @end table
4471 @node Python BuildSteps, Transferring Files, Simple ShellCommand Subclasses, Build Steps
4472 @subsection Python BuildSteps
4474 Here are some BuildSteps that are specifcally useful for projects
4475 implemented in Python.
4477 @menu
4478 * BuildEPYDoc::                 
4479 * PyFlakes::                    
4480 @end menu
4482 @node BuildEPYDoc, PyFlakes, Python BuildSteps, Python BuildSteps
4483 @subsubsection BuildEPYDoc
4485 @bsindex buildbot.steps.python.BuildEPYDoc
4487 @url{http://epydoc.sourceforge.net/, epydoc} is a tool for generating
4488 API documentation for Python modules from their docstrings. It reads
4489 all the .py files from your source tree, processes the docstrings
4490 therein, and creates a large tree of .html files (or a single .pdf
4491 file).
4493 The @code{buildbot.steps.python.BuildEPYDoc} step will run
4494 @command{epydoc} to produce this API documentation, and will count the
4495 errors and warnings from its output.
4497 You must supply the command line to be used. The default is
4498 @command{make epydocs}, which assumes that your project has a Makefile
4499 with an ``epydocs'' target. You might wish to use something like
4500 @command{epydoc -o apiref source/PKGNAME} instead. You might also want
4501 to add @command{--pdf} to generate a PDF file instead of a large tree
4502 of HTML files.
4504 The API docs are generated in-place in the build tree (under the
4505 workdir, in the subdirectory controlled by the ``-o'' argument). To
4506 make them useful, you will probably have to copy them to somewhere
4507 they can be read. A command like @command{rsync -ad apiref/
4508 dev.example.com:~public_html/current-apiref/} might be useful. You
4509 might instead want to bundle them into a tarball and publish it in the
4510 same place where the generated install tarball is placed.
4512 @example
4513 from buildbot.steps.python import BuildEPYDoc
4516 f.addStep(BuildEPYDoc, command=["epydoc", "-o", "apiref", "source/mypkg"])
4517 @end example
4520 @node PyFlakes,  , BuildEPYDoc, Python BuildSteps
4521 @subsubsection PyFlakes
4523 @bsindex buildbot.steps.python.PyFlakes
4525 @url{http://divmod.org/trac/wiki/DivmodPyflakes, PyFlakes} is a tool
4526 to perform basic static analysis of Python code to look for simple
4527 errors, like missing imports and references of undefined names. It is
4528 like a fast and simple form of the C ``lint'' program. Other tools
4529 (like pychecker) provide more detailed results but take longer to run.
4531 The @code{buildbot.steps.python.PyFlakes} step will run pyflakes and
4532 count the various kinds of errors and warnings it detects.
4534 You must supply the command line to be used. The default is
4535 @command{make pyflakes}, which assumes you have a top-level Makefile
4536 with a ``pyflakes'' target. You might want to use something like
4537 @command{pyflakes .} or @command{pyflakes src}.
4539 @example
4540 from buildbot.steps.python import PyFlakes
4543 f.addStep(PyFlakes, command=["pyflakes", "src"])
4544 @end example
4547 @node Transferring Files, Writing New BuildSteps, Python BuildSteps, Build Steps
4548 @subsection Transferring Files
4550 @cindex File Transfer
4551 @bsindex buildbot.steps.transfer.FileUpload
4552 @bsindex buildbot.steps.transfer.FileDownload
4554 Most of the work involved in a build will take place on the
4555 buildslave. But occasionally it is useful to do some work on the
4556 buildmaster side. The most basic way to involve the buildmaster is
4557 simply to move a file from the slave to the master, or vice versa.
4558 There are a pair of BuildSteps named @code{FileUpload} and
4559 @code{FileDownload} to provide this functionality. @code{FileUpload}
4560 moves a file @emph{up to} the master, while @code{FileDownload} moves
4561 a file @emph{down from} the master.
4563 As an example, let's assume that there is a step which produces an
4564 HTML file within the source tree that contains some sort of generated
4565 project documentation. We want to move this file to the buildmaster,
4566 into a @file{~/public_html} directory, so it can be visible to
4567 developers. This file will wind up in the slave-side working directory
4568 under the name @file{docs/reference.html}. We want to put it into the
4569 master-side @file{~/public_html/ref.html}.
4571 @example
4572 from buildbot.steps.shell import ShellCommand
4573 from buildbot.steps.transfer import FileUpload
4575 f.addStep(ShellCommand, command=["make", "docs"])
4576 f.addStep(FileUpload,
4577           slavesrc="docs/reference.html",
4578           masterdest="~/public_html/ref.html")
4579 @end example
4581 The @code{masterdest=} argument will be passed to os.path.expanduser,
4582 so things like ``~'' will be expanded properly. Non-absolute paths
4583 will be interpreted relative to the buildmaster's base directory.
4584 Likewise, the @code{slavesrc=} argument will be expanded and
4585 interpreted relative to the builder's working directory.
4588 To move a file from the master to the slave, use the
4589 @code{FileDownload} command. For example, let's assume that some step
4590 requires a configuration file that, for whatever reason, could not be
4591 recorded in the source code repository or generated on the buildslave
4592 side:
4594 @example
4595 from buildbot.steps.shell import ShellCommand
4596 from buildbot.steps.transfer import FileUpload
4598 f.addStep(FileDownload
4599           mastersrc="~/todays_build_config.txt",
4600           slavedest="build_config.txt")
4601 f.addStep(ShellCommand, command=["make", "config"])
4602 @end example
4604 Like @code{FileUpload}, the @code{mastersrc=} argument is interpreted
4605 relative to the buildmaster's base directory, and the
4606 @code{slavedest=} argument is relative to the builder's working
4607 directory. If the buildslave is running in @file{~buildslave}, and the
4608 builder's ``builddir'' is something like @file{tests-i386}, then the
4609 workdir is going to be @file{~buildslave/tests-i386/build}, and a
4610 @code{slavedest=} of @file{foo/bar.html} will get put in
4611 @file{~buildslave/tests-i386/build/foo/bar.html}. Remember that
4612 neither of these commands will create missing directories for you.
4615 @subheading Other Parameters
4617 The @code{maxsize=} argument lets you set a maximum size for the file
4618 to be transferred. This may help to avoid surprises: transferring a
4619 100MB coredump when you were expecting to move a 10kB status file
4620 might take an awfully long time. The @code{blocksize=} argument
4621 controls how the file is sent over the network: larger blocksizes are
4622 slightly more efficient but also consume more memory on each end, and
4623 there is a hard-coded limit of about 640kB.
4625 The @code{mode=} argument allows you to control the access permissions
4626 of the target file, traditionally expressed as an octal integer. The
4627 most common value is probably 0755, which sets the ``x'' executable
4628 bit on the file (useful for shell scripts and the like). The default
4629 value for @code{mode=} is None, which means the permission bits will
4630 default to whatever the umask of the writing process is. The default
4631 umask tends to be fairly restrictive, but at least on the buildslave
4632 you can make it less restrictive with a --umask command-line option at
4633 creation time (@pxref{Buildslave Options}).
4636 @node Writing New BuildSteps,  , Transferring Files, Build Steps
4637 @subsection Writing New BuildSteps
4639 While it is a good idea to keep your build process self-contained in
4640 the source code tree, sometimes it is convenient to put more
4641 intelligence into your Buildbot configuration. One was to do this is
4642 to write a custom BuildStep. Once written, this Step can be used in
4643 the @file{master.cfg} file.
4645 The best reason for writing a custom BuildStep is to better parse the
4646 results of the command being run. For example, a BuildStep that knows
4647 about JUnit could look at the logfiles to determine which tests had
4648 been run, how many passed and how many failed, and then report more
4649 detailed information than a simple @code{rc==0} -based ``good/bad''
4650 decision.
4652 TODO: add more description of BuildSteps.
4654 @menu
4655 * BuildStep LogFiles::          
4656 * Reading Logfiles::            
4657 * Adding LogObservers::         
4658 * BuildStep URLs::              
4659 @end menu
4661 @node BuildStep LogFiles, Reading Logfiles, Writing New BuildSteps, Writing New BuildSteps
4662 @subsubsection BuildStep LogFiles
4664 Each BuildStep has a collection of ``logfiles''. Each one has a short
4665 name, like ``stdio'' or ``warnings''. Each LogFile contains an
4666 arbitrary amount of text, usually the contents of some output file
4667 generated during a build or test step, or a record of everything that
4668 was printed to stdout/stderr during the execution of some command.
4670 These LogFiles are stored to disk, so they can be retrieved later.
4672 Each can contain multiple ``channels'', generally limited to three
4673 basic ones: stdout, stderr, and ``headers''. For example, when a
4674 ShellCommand runs, it writes a few lines to the ``headers'' channel to
4675 indicate the exact argv strings being run, which directory the command
4676 is being executed in, and the contents of the current environment
4677 variables. Then, as the command runs, it adds a lot of ``stdout'' and
4678 ``stderr'' messages. When the command finishes, a final ``header''
4679 line is added with the exit code of the process.
4681 Status display plugins can format these different channels in
4682 different ways. For example, the web page shows LogFiles as text/html,
4683 with header lines in blue text, stdout in black, and stderr in red. A
4684 different URL is available which provides a text/plain format, in
4685 which stdout and stderr are collapsed together, and header lines are
4686 stripped completely. This latter option makes it easy to save the
4687 results to a file and run @command{grep} or whatever against the
4688 output.
4690 Each BuildStep contains a mapping (implemented in a python dictionary)
4691 from LogFile name to the actual LogFile objects. Status plugins can
4692 get a list of LogFiles to display, for example, a list of HREF links
4693 that, when clicked, provide the full contents of the LogFile.
4695 @heading Using LogFiles in custom BuildSteps
4697 The most common way for a custom BuildStep to use a LogFile is to
4698 summarize the results of a ShellCommand (after the command has
4699 finished running). For example, a compile step with thousands of lines
4700 of output might want to create a summary of just the warning messages.
4701 If you were doing this from a shell, you would use something like:
4703 @example
4704 grep "warning:" output.log >warnings.log
4705 @end example
4707 In a custom BuildStep, you could instead create a ``warnings'' LogFile
4708 that contained the same text. To do this, you would add code to your
4709 @code{createSummary} method that pulls lines from the main output log
4710 and creates a new LogFile with the results:
4712 @example
4713     def createSummary(self, log):
4714         warnings = []
4715         for line in log.readlines():
4716             if "warning:" in line:
4717                 warnings.append()
4718         self.addCompleteLog('warnings', "".join(warnings))
4719 @end example
4721 This example uses the @code{addCompleteLog} method, which creates a
4722 new LogFile, puts some text in it, and then ``closes'' it, meaning
4723 that no further contents will be added. This LogFile will appear in
4724 the HTML display under an HREF with the name ``warnings'', since that
4725 is the name of the LogFile.
4727 You can also use @code{addHTMLLog} to create a complete (closed)
4728 LogFile that contains HTML instead of plain text. The normal LogFile
4729 will be HTML-escaped if presented through a web page, but the HTML
4730 LogFile will not. At the moment this is only used to present a pretty
4731 HTML representation of an otherwise ugly exception traceback when
4732 something goes badly wrong during the BuildStep.
4734 In contrast, you might want to create a new LogFile at the beginning
4735 of the step, and add text to it as the command runs. You can create
4736 the LogFile and attach it to the build by calling @code{addLog}, which
4737 returns the LogFile object. You then add text to this LogFile by
4738 calling methods like @code{addStdout} and @code{addHeader}. When you
4739 are done, you must call the @code{finish} method so the LogFile can be
4740 closed. It may be useful to create and populate a LogFile like this
4741 from a LogObserver method @xref{Adding LogObservers}.
4743 The @code{logfiles=} argument to @code{ShellCommand} (see
4744 @pxref{ShellCommand}) creates new LogFiles and fills them in realtime
4745 by asking the buildslave to watch a actual file on disk. The
4746 buildslave will look for additions in the target file and report them
4747 back to the BuildStep. These additions will be added to the LogFile by
4748 calling @code{addStdout}. These secondary LogFiles can be used as the
4749 source of a LogObserver just like the normal ``stdio'' LogFile.
4751 @node Reading Logfiles, Adding LogObservers, BuildStep LogFiles, Writing New BuildSteps
4752 @subsubsection Reading Logfiles
4754 Once a LogFile has been added to a BuildStep with @code{addLog()},
4755 @code{addCompleteLog()}, @code{addHTMLLog()}, or @code{logfiles=},
4756 your BuildStep can retrieve it by using @code{getLog()}:
4758 @example
4759 class MyBuildStep(ShellCommand):
4760     logfiles = @{ "nodelog": "_test/node.log" @}
4762     def evaluateCommand(self, cmd):
4763         nodelog = self.getLog("nodelog")
4764         if "STARTED" in nodelog.getText():
4765             return SUCCESS
4766         else:
4767             return FAILURE
4768 @end example
4770 For a complete list of the methods you can call on a LogFile, please
4771 see the docstrings on the @code{IStatusLog} class in
4772 @file{buildbot/interfaces.py}.
4775 @node Adding LogObservers, BuildStep URLs, Reading Logfiles, Writing New BuildSteps
4776 @subsubsection Adding LogObservers
4778 @cindex LogObserver
4779 @cindex LogLineObserver
4781 Most shell commands emit messages to stdout or stderr as they operate,
4782 especially if you ask them nicely with a @code{--verbose} flag of some
4783 sort. They may also write text to a log file while they run. Your
4784 BuildStep can watch this output as it arrives, to keep track of how
4785 much progress the command has made. You can get a better measure of
4786 progress by counting the number of source files compiled or test cases
4787 run than by merely tracking the number of bytes that have been written
4788 to stdout. This improves the accuracy and the smoothness of the ETA
4789 display.
4791 To accomplish this, you will need to attach a @code{LogObserver} to
4792 one of the log channels, most commonly to the ``stdio'' channel but
4793 perhaps to another one which tracks a log file. This observer is given
4794 all text as it is emitted from the command, and has the opportunity to
4795 parse that output incrementally. Once the observer has decided that
4796 some event has occurred (like a source file being compiled), it can
4797 use the @code{setProgress} method to tell the BuildStep about the
4798 progress that this event represents.
4800 There are a number of pre-built @code{LogObserver} classes that you
4801 can choose from (defined in @code{buildbot.process.buildstep}, and of
4802 course you can subclass them to add further customization. The
4803 @code{LogLineObserver} class handles the grunt work of buffering and
4804 scanning for end-of-line delimiters, allowing your parser to operate
4805 on complete stdout/stderr lines.
4807 For example, let's take a look at the @code{TrialTestCaseCounter},
4808 which is used by the Trial step to count test cases as they are run.
4809 As Trial executes, it emits lines like the following:
4811 @example
4812 buildbot.test.test_config.ConfigTest.testDebugPassword ... [OK]
4813 buildbot.test.test_config.ConfigTest.testEmpty ... [OK]
4814 buildbot.test.test_config.ConfigTest.testIRC ... [FAIL]
4815 buildbot.test.test_config.ConfigTest.testLocks ... [OK]
4816 @end example
4818 When the tests are finished, trial emits a long line of ``======'' and
4819 then some lines which summarize the tests that failed. We want to
4820 avoid parsing these trailing lines, because their format is less
4821 well-defined than the ``[OK]'' lines.
4823 The parser class looks like this:
4825 @example
4826 from buildbot.process.buildstep import LogLineObserver
4828 class TrialTestCaseCounter(LogLineObserver):
4829     _line_re = re.compile(r'^([\w\.]+) \.\.\. \[([^\]]+)\]$')
4830     numTests = 0
4831     finished = False
4833     def outLineReceived(self, line):
4834         if self.finished:
4835             return
4836         if line.startswith("=" * 40):
4837             self.finished = True
4838             return
4840         m = self._line_re.search(line.strip())
4841         if m:
4842             testname, result = m.groups()
4843             self.numTests += 1
4844             self.step.setProgress('tests', self.numTests)
4845 @end example
4847 This parser only pays attention to stdout, since that's where trial
4848 writes the progress lines. It has a mode flag named @code{finished} to
4849 ignore everything after the ``===='' marker, and a scary-looking
4850 regular expression to match each line while hopefully ignoring other
4851 messages that might get displayed as the test runs.
4853 Each time it identifies a test has been completed, it increments its
4854 counter and delivers the new progress value to the step with
4855 @code{self.step.setProgress}. This class is specifically measuring
4856 progress along the ``tests'' metric, in units of test cases (as
4857 opposed to other kinds of progress like the ``output'' metric, which
4858 measures in units of bytes). The Progress-tracking code uses each
4859 progress metric separately to come up with an overall completion
4860 percentage and an ETA value.
4862 To connect this parser into the @code{Trial} BuildStep,
4863 @code{Trial.__init__} ends with the following clause:
4865 @example
4866         # this counter will feed Progress along the 'test cases' metric
4867         counter = TrialTestCaseCounter()
4868         self.addLogObserver('stdio', counter)
4869 @end example
4871 This creates a TrialTestCaseCounter and tells the step that the
4872 counter wants to watch the ``stdio'' log. The observer is
4873 automatically given a reference to the step in its @code{.step}
4874 attribute.
4876 @subheading A Somewhat Whimsical Example
4878 Let's say that we've got some snazzy new unit-test framework called
4879 Framboozle. It's the hottest thing since sliced bread. It slices, it
4880 dices, it runs unit tests like there's no tomorrow. Plus if your unit
4881 tests fail, you can use its name for a Web 2.1 startup company, make
4882 millions of dollars, and hire engineers to fix the bugs for you, while
4883 you spend your afternoons lazily hang-gliding along a scenic pacific
4884 beach, blissfully unconcerned about the state of your
4885 tests.@footnote{framboozle.com is still available. Remember, I get 10%
4886 :).}
4888 To run a Framboozle-enabled test suite, you just run the 'framboozler'
4889 command from the top of your source code tree. The 'framboozler'
4890 command emits a bunch of stuff to stdout, but the most interesting bit
4891 is that it emits the line "FNURRRGH!" every time it finishes running a
4892 test case@footnote{Framboozle gets very excited about running unit
4893 tests.}. You'd like to have a test-case counting LogObserver that
4894 watches for these lines and counts them, because counting them will
4895 help the buildbot more accurately calculate how long the build will
4896 take, and this will let you know exactly how long you can sneak out of
4897 the office for your hang-gliding lessons without anyone noticing that
4898 you're gone.
4900 This will involve writing a new BuildStep (probably named
4901 "Framboozle") which inherits from ShellCommand. The BuildStep class
4902 definition itself will look something like this:
4904 @example
4905 # START
4906 from buildbot.steps.shell import ShellCommand
4907 from buildbot.process.buildstep import LogLineObserver
4909 class FNURRRGHCounter(LogLineObserver):
4910     numTests = 0
4911     def outLineReceived(self, line):
4912         if "FNURRRGH!" in line:
4913             self.numTests += 1
4914             self.step.setProgress('tests', self.numTests)
4916 class Framboozle(ShellCommand):
4917     command = ["framboozler"]
4919     def __init__(self, **kwargs):
4920         ShellCommand.__init__(self, **kwargs)   # always upcall!
4921         counter = FNURRRGHCounter())
4922         self.addLogObserver(counter)
4923 # FINISH
4924 @end example
4926 So that's the code that we want to wind up using. How do we actually
4927 deploy it?
4929 You have a couple of different options.
4931 Option 1: The simplest technique is to simply put this text
4932 (everything from START to FINISH) in your master.cfg file, somewhere
4933 before the BuildFactory definition where you actually use it in a
4934 clause like:
4936 @example
4937 f = BuildFactory()
4938 f.addStep(SVN(svnurl="stuff"))
4939 f.addStep(Framboozle())
4940 @end example
4942 Remember that master.cfg is secretly just a python program with one
4943 job: populating the BuildmasterConfig dictionary. And python programs
4944 are allowed to define as many classes as they like. So you can define
4945 classes and use them in the same file, just as long as the class is
4946 defined before some other code tries to use it.
4948 This is easy, and it keeps the point of definition very close to the
4949 point of use, and whoever replaces you after that unfortunate
4950 hang-gliding accident will appreciate being able to easily figure out
4951 what the heck this stupid "Framboozle" step is doing anyways. The
4952 downside is that every time you reload the config file, the Framboozle
4953 class will get redefined, which means that the buildmaster will think
4954 that you've reconfigured all the Builders that use it, even though
4955 nothing changed. Bleh.
4957 Option 2: Instead, we can put this code in a separate file, and import
4958 it into the master.cfg file just like we would the normal buildsteps
4959 like ShellCommand and SVN.
4961 Create a directory named ~/lib/python, put everything from START to
4962 FINISH in ~/lib/python/framboozle.py, and run your buildmaster using:
4964 @example
4965  PYTHONPATH=~/lib/python buildbot start MASTERDIR
4966 @end example
4968 or use the @file{Makefile.buildbot} to control the way
4969 @command{buildbot start} works. Or add something like this to
4970 something like your ~/.bashrc or ~/.bash_profile or ~/.cshrc:
4972 @example
4973  export PYTHONPATH=~/lib/python
4974 @end example
4976 Once we've done this, our master.cfg can look like:
4978 @example
4979 from framboozle import Framboozle
4980 f = BuildFactory()
4981 f.addStep(SVN(svnurl="stuff"))
4982 f.addStep(Framboozle())
4983 @end example
4987 @example
4988 import framboozle
4989 f = BuildFactory()
4990 f.addStep(SVN(svnurl="stuff"))
4991 f.addStep(framboozle.Framboozle())
4992 @end example
4994 (check out the python docs for details about how "import" and "from A
4995 import B" work).
4997 What we've done here is to tell python that every time it handles an
4998 "import" statement for some named module, it should look in our
4999 ~/lib/python/ for that module before it looks anywhere else. After our
5000 directories, it will try in a bunch of standard directories too
5001 (including the one where buildbot is installed). By setting the
5002 PYTHONPATH environment variable, you can add directories to the front
5003 of this search list.
5005 Python knows that once it "import"s a file, it doesn't need to
5006 re-import it again. This means that reconfiguring the buildmaster
5007 (with "buildbot reconfig", for example) won't make it think the
5008 Framboozle class has changed every time, so the Builders that use it
5009 will not be spuriously restarted. On the other hand, you either have
5010 to start your buildmaster in a slightly weird way, or you have to
5011 modify your environment to set the PYTHONPATH variable.
5014 Option 3: Install this code into a standard python library directory
5016 Find out what your python's standard include path is by asking it:
5018 @example
5019 80:warner@@luther% python
5020 Python 2.4.4c0 (#2, Oct  2 2006, 00:57:46) 
5021 [GCC 4.1.2 20060928 (prerelease) (Debian 4.1.1-15)] on linux2
5022 Type "help", "copyright", "credits" or "license" for more information.
5023 >>> import sys
5024 >>> print sys.path
5025 ['', '/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']
5026 >>> 
5027 @end example
5029 In this case, putting the code into
5030 /usr/local/lib/python2.4/site-packages/framboozle.py would work just
5031 fine. We can use the same master.cfg "import framboozle" statement as
5032 in Option 2. By putting it in a standard include directory (instead of
5033 the decidedly non-standard ~/lib/python), we don't even have to set
5034 PYTHONPATH to anything special. The downside is that you probably have
5035 to be root to write to one of those standard include directories.
5038 Option 4: Submit the code for inclusion in the Buildbot distribution
5040 Contribute the code in an Enhancement Request on SourceForge, via
5041 http://buildbot.sf.net . Lobby, convince, coerce, bribe, badger,
5042 harass, threaten, or otherwise encourage the author to accept the
5043 patch. This lets you do something like:
5045 @example
5046 from buildbot.steps import framboozle
5047 f = BuildFactory()
5048 f.addStep(SVN(svnurl="stuff"))
5049 f.addStep(framboozle.Framboozle())
5050 @end example
5052 And then you don't even have to install framboozle.py anywhere on your
5053 system, since it will ship with Buildbot. You don't have to be root,
5054 you don't have to set PYTHONPATH. But you do have to make a good case
5055 for Framboozle being worth going into the main distribution, you'll
5056 probably have to provide docs and some unit test cases, you'll need to
5057 figure out what kind of beer the author likes, and then you'll have to
5058 wait until the next release. But in some environments, all this is
5059 easier than getting root on your buildmaster box, so the tradeoffs may
5060 actually be worth it.
5064 Putting the code in master.cfg (1) makes it available to that
5065 buildmaster instance. Putting it in a file in a personal library
5066 directory (2) makes it available for any buildmasters you might be
5067 running. Putting it in a file in a system-wide shared library
5068 directory (3) makes it available for any buildmasters that anyone on
5069 that system might be running. Getting it into the buildbot's upstream
5070 repository (4) makes it available for any buildmasters that anyone in
5071 the world might be running. It's all a matter of how widely you want
5072 to deploy that new class.
5076 @node BuildStep URLs,  , Adding LogObservers, Writing New BuildSteps
5077 @subsubsection BuildStep URLs
5079 @cindex links
5080 @cindex BuildStep URLs
5081 @cindex addURL
5083 Each BuildStep has a collection of ``links''. Like its collection of
5084 LogFiles, each link has a name and a target URL. The web status page
5085 creates HREFs for each link in the same box as it does for LogFiles,
5086 except that the target of the link is the external URL instead of an
5087 internal link to a page that shows the contents of the LogFile.
5089 These external links can be used to point at build information hosted
5090 on other servers. For example, the test process might produce an
5091 intricate description of which tests passed and failed, or some sort
5092 of code coverage data in HTML form, or a PNG or GIF image with a graph
5093 of memory usage over time. The external link can provide an easy way
5094 for users to navigate from the buildbot's status page to these
5095 external web sites or file servers. Note that the step itself is
5096 responsible for insuring that there will be a document available at
5097 the given URL (perhaps by using @command{scp} to copy the HTML output
5098 to a @file{~/public_html/} directory on a remote web server). Calling
5099 @code{addURL} does not magically populate a web server.
5101 To set one of these links, the BuildStep should call the @code{addURL}
5102 method with the name of the link and the target URL. Multiple URLs can
5103 be set.
5105 In this example, we assume that the @command{make test} command causes
5106 a collection of HTML files to be created and put somewhere on the
5107 coverage.example.org web server, in a filename that incorporates the
5108 build number.
5110 @example
5111 class TestWithCodeCoverage(BuildStep):
5112     command = ["make", "test",
5113                WithProperties("buildnum=%s" % "buildnumber")]
5115     def createSummary(self, log):
5116         buildnumber = self.getProperty("buildnumber")
5117         url = "http://coverage.example.org/builds/%s.html" % buildnumber
5118         self.addURL("coverage", url)
5119 @end example
5121 You might also want to extract the URL from some special message
5122 output by the build process itself:
5124 @example
5125 class TestWithCodeCoverage(BuildStep):
5126     command = ["make", "test",
5127                WithProperties("buildnum=%s" % "buildnumber")]
5129     def createSummary(self, log):
5130         output = StringIO(log.getText())
5131         for line in output.readlines():
5132             if line.startswith("coverage-url:"):
5133                 url = line[len("coverage-url:"):].strip()
5134                 self.addURL("coverage", url)
5135                 return
5136 @end example
5138 Note that a build process which emits both stdout and stderr might
5139 cause this line to be split or interleaved between other lines. It
5140 might be necessary to restrict the getText() call to only stdout with
5141 something like this:
5143 @example
5144         output = StringIO("".join([c[1]
5145                                    for c in log.getChunks()
5146                                    if c[0] == LOG_CHANNEL_STDOUT]))
5147 @end example
5149 Of course if the build is run under a PTY, then stdout and stderr will
5150 be merged before the buildbot ever sees them, so such interleaving
5151 will be unavoidable.
5154 @node Interlocks, Build Factories, Build Steps, Build Process
5155 @section Interlocks
5157 @cindex locks
5158 @slindex buildbot.locks.MasterLock
5159 @slindex buildbot.locks.SlaveLock
5161 For various reasons, you may want to prevent certain Steps (or perhaps
5162 entire Builds) from running simultaneously. Limited CPU speed or
5163 network bandwidth to the VC server, problems with simultaneous access
5164 to a database server used by unit tests, or multiple Builds which
5165 access shared state may all require some kind of interlock to prevent
5166 corruption, confusion, or resource overload. These resources might
5167 require completely exclusive access, or it might be sufficient to
5168 establish a limit of two or three simultaneous builds.
5170 @code{Locks} are the mechanism used to express these kinds of
5171 constraints on when Builds or Steps can be run. There are two kinds of
5172 @code{Locks}, each with their own scope: @code{MasterLock} instances
5173 are scoped to the buildbot as a whole, while @code{SlaveLock}s are
5174 scoped to a single buildslave. This means that each buildslave has a
5175 separate copy of each @code{SlaveLock}, which could enforce a
5176 one-Build-at-a-time limit for each machine, but still allow as many
5177 simultaneous builds as there are machines.
5179 Each @code{Lock} is created with a unique name. Each lock gets a count
5180 of how many owners it may have: how many processes can claim it at ths
5181 same time. This limit defaults to one, and is controllable through the
5182 @code{maxCount} argument. On @code{SlaveLock}s you can set the owner
5183 count on a per-slave basis by providing a dictionary (that maps from
5184 slavename to maximum owner count) to its @code{maxCountForSlave}
5185 argument. Any buildslaves that aren't mentioned in
5186 @code{maxCountForSlave} get their owner count from @code{maxCount}.
5188 To use a lock, simply include it in the @code{locks=} argument of the
5189 @code{BuildStep} object that should obtain the lock before it runs.
5190 This argument accepts a list of @code{Lock} objects: the Step will
5191 acquire all of them before it runs.
5193 To claim a lock for the whole Build, add a @code{'locks'} key to the
5194 builder specification dictionary with the same list of @code{Lock}
5195 objects. (This is the dictionary that has the @code{'name'},
5196 @code{'slavename'}, @code{'builddir'}, and @code{'factory'} keys). The
5197 @code{Build} object also accepts a @code{locks=} argument, but unless
5198 you are writing your own @code{BuildFactory} subclass then it will be
5199 easier to set the locks in the builder dictionary.
5201 Note that there are no partial-acquire or partial-release semantics:
5202 this prevents deadlocks caused by two Steps each waiting for a lock
5203 held by the other@footnote{Also note that a clever buildmaster admin
5204 could still create the opportunity for deadlock: Build A obtains Lock
5205 1, inside which Step A.two tries to acquire Lock 2 at the Step level.
5206 Meanwhile Build B obtains Lock 2, and has a Step B.two which wants to
5207 acquire Lock 1 at the Step level. Don't Do That.}. This also means
5208 that waiting to acquire a @code{Lock} can take an arbitrarily long
5209 time: if the buildmaster is very busy, a Step or Build which requires
5210 only one @code{Lock} may starve another that is waiting for that
5211 @code{Lock} plus some others.
5214 In the following example, we run the same build on three different
5215 platforms. The unit-test steps of these builds all use a common
5216 database server, and would interfere with each other if allowed to run
5217 simultaneously. The @code{Lock} prevents more than one of these builds
5218 from happening at the same time.
5220 @example
5221 from buildbot import locks
5222 from buildbot.steps import source, shell
5223 from buildbot.process import factory
5225 db_lock = locks.MasterLock("database")
5226 f = factory.BuildFactory()
5227 f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk"))
5228 f.addStep(shell.ShellCommand(command="make all"))
5229 f.addStep(shell.ShellCommand(command="make test", locks=[db_lock]))
5230 b1 = @{'name': 'full1', 'slavename': 'bot-1', builddir='f1', 'factory': f@}
5231 b2 = @{'name': 'full2', 'slavename': 'bot-2', builddir='f2', 'factory': f@}
5232 b3 = @{'name': 'full3', 'slavename': 'bot-3', builddir='f3', 'factory': f@}
5233 c['builders'] = [b1, b2, b3]
5234 @end example
5236 In the next example, we have one buildslave hosting three separate
5237 Builders (each running tests against a different version of Python).
5238 The machine which hosts this buildslave is not particularly fast, so
5239 we want to prevent all three builds from all happening at the same
5240 time. (Assume we've experimentally determined that one build leaves
5241 unused CPU capacity, three builds causes a lot of disk thrashing, but
5242 two builds at a time is Just Right). We use a @code{SlaveLock} because
5243 the builds happening on this one slow slave should not affect builds
5244 running on other slaves, and we use the lock on the build as a whole
5245 because the slave is so slow that even multiple simultaneous SVN
5246 checkouts would be too taxing. We set @code{maxCount=2} to achieve our
5247 goal of two simultaneous builds per slave.
5249 @example
5250 from buildbot import locks
5251 from buildbot.steps import source
5252 from buildbot.process import s, factory
5254 slow_lock = locks.SlaveLock("cpu", maxCount=2)
5255 source = s(source.SVN, svnurl="http://example.org/svn/Trunk")
5256 f22 = factory.Trial(source, trialpython=["python2.2"])
5257 f23 = factory.Trial(source, trialpython=["python2.3"])
5258 f24 = factory.Trial(source, trialpython=["python2.4"])
5259 b1 = @{'name': 'p22', 'slavename': 'bot-1', builddir='p22', 'factory': f22,
5260       'locks': [slow_lock] @}
5261 b2 = @{'name': 'p23', 'slavename': 'bot-1', builddir='p23', 'factory': f23,
5262       'locks': [slow_lock] @}
5263 b3 = @{'name': 'p24', 'slavename': 'bot-1', builddir='p24', 'factory': f24,
5264       'locks': [slow_lock] @}
5265 c['builders'] = [b1, b2, b3]
5266 @end example
5268 In the last example, we use two Locks at the same time. In this case,
5269 we're concerned about both of the previous constraints, but we'll say
5270 that only the tests are computationally intensive, and that they have
5271 been split into those which use the database and those which do not.
5272 In addition, two of the Builds run on a fast machine which does not
5273 need to worry about the cpu lock, but which still must be prevented
5274 from simultaneous database access. We use @code{maxCountForSlave} to
5275 limit the slow machine to one simultanous build, but allow practically
5276 unlimited concurrent builds on the fast machine.
5278 @example
5279 from buildbot import locks
5280 from buildbot.steps import source, shell
5281 from buildbot.process import factory
5283 db_lock = locks.MasterLock("database")
5284 slavecounts = @{"bot-slow": 1, "bot-fast": 100@}
5285 cpu_lock = locks.SlaveLock("cpu", maxCountForSlave=slavecounts)
5286 f = factory.BuildFactory()
5287 f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk"))
5288 f.addStep(shell.ShellCommand(command="make all", locks=[cpu_lock]))
5289 f.addStep(shell.ShellCommand(command="make test", locks=[cpu_lock]))
5290 f.addStep(shell.ShellCommand(command="make db-test", locks=[db_lock, cpu_lock]))
5292 b1 = @{'name': 'full1', 'slavename': 'bot-slow', builddir='full1',
5293       'factory': f@}
5294 b2 = @{'name': 'full2', 'slavename': 'bot-slow', builddir='full2',
5295       'factory': f@}
5296 b3 = @{'name': 'full3', 'slavename': 'bot-fast', builddir='full3',
5297       'factory': f@}
5298 b4 = @{'name': 'full4', 'slavename': 'bot-fast', builddir='full4',
5299       'factory': f@}
5300 c['builders'] = [b1, b2, b3, b4]
5301 @end example
5303 As a final note, remember that a unit test system which breaks when
5304 multiple people run it at the same time is fragile and should be
5305 fixed. Asking your human developers to serialize themselves when
5306 running unit tests will just discourage them from running the unit
5307 tests at all. Find a way to fix this: change the database tests to
5308 create a new (uniquely-named) user or table for each test run, don't
5309 use fixed listening TCP ports for network tests (instead listen on
5310 port 0 to let the kernel choose a port for you and then query the
5311 socket to find out what port was allocated). @code{MasterLock}s can be
5312 used to accomodate broken test systems like this, but are really
5313 intended for other purposes: build processes that store or retrieve
5314 products in shared directories, or which do things that human
5315 developers would not (or which might slow down or break in ways that
5316 require human attention to deal with).
5318 @code{SlaveLocks}s can be used to keep automated performance tests
5319 from interfering with each other, when there are multiple Builders all
5320 using the same buildslave. But they can't prevent other users from
5321 running CPU-intensive jobs on that host while the tests are running.
5323 @node Build Factories,  , Interlocks, Build Process
5324 @section Build Factories
5327 Each Builder is equipped with a ``build factory'', which is
5328 responsible for producing the actual @code{Build} objects that perform
5329 each build. This factory is created in the configuration file, and
5330 attached to a Builder through the @code{factory} element of its
5331 dictionary.
5333 The standard @code{BuildFactory} object creates @code{Build} objects
5334 by default. These Builds will each execute a collection of BuildSteps
5335 in a fixed sequence. Each step can affect the results of the build,
5336 but in general there is little intelligence to tie the different steps
5337 together. You can create subclasses of @code{Build} to implement more
5338 sophisticated build processes, and then use a subclass of
5339 @code{BuildFactory} (or simply set the @code{buildClass} attribute) to
5340 create instances of your new Build subclass.
5343 @menu
5344 * BuildStep Objects::           
5345 * BuildFactory::                
5346 * Process-Specific build factories::  
5347 @end menu
5349 @node BuildStep Objects, BuildFactory, Build Factories, Build Factories
5350 @subsection BuildStep Objects
5352 The steps used by these builds are all subclasses of @code{BuildStep}.
5353 The standard ones provided with Buildbot are documented later,
5354 @xref{Build Steps}. You can also write your own subclasses to use in
5355 builds.
5357 The basic behavior for a @code{BuildStep} is to:
5359 @itemize @bullet
5360 @item
5361 run for a while, then stop
5362 @item
5363 possibly invoke some RemoteCommands on the attached build slave
5364 @item
5365 possibly produce a set of log files
5366 @item
5367 finish with a status described by one of four values defined in
5368 buildbot.status.builder: SUCCESS, WARNINGS, FAILURE, SKIPPED
5369 @item
5370 provide a list of short strings to describe the step
5371 @item
5372 define a color (generally green, orange, or red) with which the
5373 step should be displayed
5374 @end itemize
5377 More sophisticated steps may produce additional information and
5378 provide it to later build steps, or store it in the factory to provide
5379 to later builds.
5382 @menu
5383 * BuildFactory Attributes::     
5384 * Quick builds::                
5385 @end menu
5387 @node BuildFactory, Process-Specific build factories, BuildStep Objects, Build Factories
5388 @subsection BuildFactory
5390 @bfindex buildbot.process.factory.BuildFactory
5391 @bfindex buildbot.process.factory.BasicBuildFactory
5392 @c TODO: what is BasicSVN anyway?
5393 @bfindex buildbot.process.factory.BasicSVN
5395 The default @code{BuildFactory}, provided in the
5396 @code{buildbot.process.factory} module, contains an internal list of
5397 ``BuildStep specifications'': a list of @code{(step_class, kwargs)}
5398 tuples for each. These specification tuples are constructed when the
5399 config file is read, by asking the instances passed to @code{addStep}
5400 for their subclass and arguments.
5402 When asked to create a Build, the @code{BuildFactory} puts a copy of
5403 the list of step specifications into the new Build object. When the
5404 Build is actually started, these step specifications are used to
5405 create the actual set of BuildSteps, which are then executed one at a
5406 time. This serves to give each Build an independent copy of each step.
5407 For example, a build which consists of a CVS checkout followed by a
5408 @code{make build} would be constructed as follows:
5410 @example
5411 from buildbot.steps import source, shell
5412 from buildbot.process import factory
5414 f = factory.BuildFactory()
5415 f.addStep(source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"))
5416 f.addStep(shell.Compile(command=["make", "build"]))
5417 @end example
5419 (To support config files from buildbot-0.7.5 and earlier,
5420 @code{addStep} also accepts the @code{f.addStep(shell.Compile,
5421 command=["make","build"])} form, although its use is discouraged
5422 because then the @code{Compile} step doesn't get to validate or
5423 complain about its arguments until build time. The modern
5424 pass-by-instance approach allows this validation to occur while the
5425 config file is being loaded, where the admin has a better chance of
5426 noticing problems).
5428 It is also possible to pass a list of steps into the
5429 @code{BuildFactory} when it is created. Using @code{addStep} is
5430 usually simpler, but there are cases where is is more convenient to
5431 create the list of steps ahead of time.:
5433 @example
5434 from buildbot.steps import source, shell
5435 from buildbot.process import factory
5437 all_steps = [source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"),
5438              shell.Compile(command=["make", "build"]),
5439             ]
5440 f = factory.BuildFactory(all_steps)
5441 @end example
5444 Each step can affect the build process in the following ways:
5446 @itemize @bullet
5447 @item
5448 If the step's @code{haltOnFailure} attribute is True, then a failure
5449 in the step (i.e. if it completes with a result of FAILURE) will cause
5450 the whole build to be terminated immediately: no further steps will be
5451 executed. This is useful for setup steps upon which the rest of the
5452 build depends: if the CVS checkout or @code{./configure} process
5453 fails, there is no point in trying to compile or test the resulting
5454 tree.
5456 @item
5457 If the @code{flunkOnFailure} or @code{flunkOnWarnings} flag is set,
5458 then a result of FAILURE or WARNINGS will mark the build as a whole as
5459 FAILED. However, the remaining steps will still be executed. This is
5460 appropriate for things like multiple testing steps: a failure in any
5461 one of them will indicate that the build has failed, however it is
5462 still useful to run them all to completion.
5464 @item
5465 Similarly, if the @code{warnOnFailure} or @code{warnOnWarnings} flag
5466 is set, then a result of FAILURE or WARNINGS will mark the build as
5467 having WARNINGS, and the remaining steps will still be executed. This
5468 may be appropriate for certain kinds of optional build or test steps.
5469 For example, a failure experienced while building documentation files
5470 should be made visible with a WARNINGS result but not be serious
5471 enough to warrant marking the whole build with a FAILURE.
5473 @end itemize
5475 In addition, each Step produces its own results, may create logfiles,
5476 etc. However only the flags described above have any effect on the
5477 build as a whole.
5479 The pre-defined BuildSteps like @code{CVS} and @code{Compile} have
5480 reasonably appropriate flags set on them already. For example, without
5481 a source tree there is no point in continuing the build, so the
5482 @code{CVS} class has the @code{haltOnFailure} flag set to True. Look
5483 in @file{buildbot/steps/*.py} to see how the other Steps are
5484 marked.
5486 Each Step is created with an additional @code{workdir} argument that
5487 indicates where its actions should take place. This is specified as a
5488 subdirectory of the slave builder's base directory, with a default
5489 value of @code{build}. This is only implemented as a step argument (as
5490 opposed to simply being a part of the base directory) because the
5491 CVS/SVN steps need to perform their checkouts from the parent
5492 directory.
5494 @menu
5495 * BuildFactory Attributes::     
5496 * Quick builds::                
5497 @end menu
5499 @node BuildFactory Attributes, Quick builds, BuildFactory, BuildFactory
5500 @subsubsection BuildFactory Attributes
5502 Some attributes from the BuildFactory are copied into each Build.
5504 @cindex treeStableTimer
5506 @table @code
5507 @item useProgress
5508 (defaults to True): if True, the buildmaster keeps track of how long
5509 each step takes, so it can provide estimates of how long future builds
5510 will take. If builds are not expected to take a consistent amount of
5511 time (such as incremental builds in which a random set of files are
5512 recompiled or tested each time), this should be set to False to
5513 inhibit progress-tracking.
5515 @end table
5518 @node Quick builds,  , BuildFactory Attributes, BuildFactory
5519 @subsubsection Quick builds
5521 @bfindex buildbot.process.factory.QuickBuildFactory
5523 The difference between a ``full build'' and a ``quick build'' is that
5524 quick builds are generally done incrementally, starting with the tree
5525 where the previous build was performed. That simply means that the
5526 source-checkout step should be given a @code{mode='update'} flag, to
5527 do the source update in-place.
5529 In addition to that, the @code{useProgress} flag should be set to
5530 False. Incremental builds will (or at least the ought to) compile as
5531 few files as necessary, so they will take an unpredictable amount of
5532 time to run. Therefore it would be misleading to claim to predict how
5533 long the build will take.
5536 @node Process-Specific build factories,  , BuildFactory, Build Factories
5537 @subsection Process-Specific build factories
5539 Many projects use one of a few popular build frameworks to simplify
5540 the creation and maintenance of Makefiles or other compilation
5541 structures. Buildbot provides several pre-configured BuildFactory
5542 subclasses which let you build these projects with a minimum of fuss.
5544 @menu
5545 * GNUAutoconf::                 
5546 * CPAN::                        
5547 * Python distutils::            
5548 * Python/Twisted/trial projects::  
5549 @end menu
5551 @node GNUAutoconf, CPAN, Process-Specific build factories, Process-Specific build factories
5552 @subsubsection GNUAutoconf
5554 @bfindex buildbot.process.factory.GNUAutoconf
5556 @uref{http://www.gnu.org/software/autoconf/, GNU Autoconf} is a
5557 software portability tool, intended to make it possible to write
5558 programs in C (and other languages) which will run on a variety of
5559 UNIX-like systems. Most GNU software is built using autoconf. It is
5560 frequently used in combination with GNU automake. These tools both
5561 encourage a build process which usually looks like this:
5563 @example
5564 % CONFIG_ENV=foo ./configure --with-flags
5565 % make all
5566 % make check
5567 # make install
5568 @end example
5570 (except of course the Buildbot always skips the @code{make install}
5571 part).
5573 The Buildbot's @code{buildbot.process.factory.GNUAutoconf} factory is
5574 designed to build projects which use GNU autoconf and/or automake. The
5575 configuration environment variables, the configure flags, and command
5576 lines used for the compile and test are all configurable, in general
5577 the default values will be suitable.
5579 Example:
5581 @example
5582 # use the s() convenience function defined earlier
5583 f = factory.GNUAutoconf(source=s(step.SVN, svnurl=URL, mode="copy"),
5584                         flags=["--disable-nls"])
5585 @end example
5587 Required Arguments:
5589 @table @code
5590 @item source
5591 This argument must be a step specification tuple that provides a
5592 BuildStep to generate the source tree.
5593 @end table
5595 Optional Arguments:
5597 @table @code
5598 @item configure
5599 The command used to configure the tree. Defaults to
5600 @code{./configure}. Accepts either a string or a list of shell argv
5601 elements.
5603 @item configureEnv
5604 The environment used for the initial configuration step. This accepts
5605 a dictionary which will be merged into the buildslave's normal
5606 environment. This is commonly used to provide things like
5607 @code{CFLAGS="-O2 -g"} (to turn off debug symbols during the compile).
5608 Defaults to an empty dictionary.
5610 @item configureFlags
5611 A list of flags to be appended to the argument list of the configure
5612 command. This is commonly used to enable or disable specific features
5613 of the autoconf-controlled package, like @code{["--without-x"]} to
5614 disable windowing support. Defaults to an empty list.
5616 @item compile
5617 this is a shell command or list of argv values which is used to
5618 actually compile the tree. It defaults to @code{make all}. If set to
5619 None, the compile step is skipped.
5621 @item test
5622 this is a shell command or list of argv values which is used to run
5623 the tree's self-tests. It defaults to @code{make check}. If set to
5624 None, the test step is skipped.
5626 @end table
5629 @node CPAN, Python distutils, GNUAutoconf, Process-Specific build factories
5630 @subsubsection CPAN
5632 @bfindex buildbot.process.factory.CPAN
5634 Most Perl modules available from the @uref{http://www.cpan.org/, CPAN}
5635 archive use the @code{MakeMaker} module to provide configuration,
5636 build, and test services. The standard build routine for these modules
5637 looks like:
5639 @example
5640 % perl Makefile.PL
5641 % make
5642 % make test
5643 # make install
5644 @end example
5646 (except again Buildbot skips the install step)
5648 Buildbot provides a @code{CPAN} factory to compile and test these
5649 projects.
5652 Arguments:
5653 @table @code
5654 @item source
5655 (required): A step specification tuple, that that used by GNUAutoconf.
5657 @item perl
5658 A string which specifies the @code{perl} executable to use. Defaults
5659 to just @code{perl}.
5661 @end table
5664 @node Python distutils, Python/Twisted/trial projects, CPAN, Process-Specific build factories
5665 @subsubsection Python distutils
5667 @bfindex buildbot.process.factory.Distutils
5669 Most Python modules use the @code{distutils} package to provide
5670 configuration and build services. The standard build process looks
5671 like:
5673 @example
5674 % python ./setup.py build
5675 % python ./setup.py install
5676 @end example
5678 Unfortunately, although Python provides a standard unit-test framework
5679 named @code{unittest}, to the best of my knowledge @code{distutils}
5680 does not provide a standardized target to run such unit tests. (please
5681 let me know if I'm wrong, and I will update this factory).
5683 The @code{Distutils} factory provides support for running the build
5684 part of this process. It accepts the same @code{source=} parameter as
5685 the other build factories.
5688 Arguments:
5689 @table @code
5690 @item source
5691 (required): A step specification tuple, that that used by GNUAutoconf.
5692   
5693 @item python
5694 A string which specifies the @code{python} executable to use. Defaults
5695 to just @code{python}.
5697 @item test
5698 Provides a shell command which runs unit tests. This accepts either a
5699 string or a list. The default value is None, which disables the test
5700 step (since there is no common default command to run unit tests in
5701 distutils modules).
5703 @end table
5706 @node Python/Twisted/trial projects,  , Python distutils, Process-Specific build factories
5707 @subsubsection Python/Twisted/trial projects
5709 @bfindex buildbot.process.factory.Trial
5710 @c TODO: document these steps better
5711 @bsindex buildbot.steps.python_twisted.HLint
5712 @bsindex buildbot.steps.python_twisted.Trial
5713 @bsindex buildbot.steps.python_twisted.ProcessDocs
5714 @bsindex buildbot.steps.python_twisted.BuildDebs
5715 @bsindex buildbot.steps.python_twisted.RemovePYCs
5717 Twisted provides a unit test tool named @code{trial} which provides a
5718 few improvements over Python's built-in @code{unittest} module. Many
5719 python projects which use Twisted for their networking or application
5720 services also use trial for their unit tests. These modules are
5721 usually built and tested with something like the following:
5723 @example
5724 % python ./setup.py build
5725 % PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test
5726 % python ./setup.py install
5727 @end example
5729 Unfortunately, the @file{build/lib} directory into which the
5730 built/copied .py files are placed is actually architecture-dependent,
5731 and I do not yet know of a simple way to calculate its value. For many
5732 projects it is sufficient to import their libraries ``in place'' from
5733 the tree's base directory (@code{PYTHONPATH=.}).
5735 In addition, the @var{PROJECTNAME} value where the test files are
5736 located is project-dependent: it is usually just the project's
5737 top-level library directory, as common practice suggests the unit test
5738 files are put in the @code{test} sub-module. This value cannot be
5739 guessed, the @code{Trial} class must be told where to find the test
5740 files.
5742 The @code{Trial} class provides support for building and testing
5743 projects which use distutils and trial. If the test module name is
5744 specified, trial will be invoked. The library path used for testing
5745 can also be set.
5747 One advantage of trial is that the Buildbot happens to know how to
5748 parse trial output, letting it identify which tests passed and which
5749 ones failed. The Buildbot can then provide fine-grained reports about
5750 how many tests have failed, when individual tests fail when they had
5751 been passing previously, etc.
5753 Another feature of trial is that you can give it a series of source
5754 .py files, and it will search them for special @code{test-case-name}
5755 tags that indicate which test cases provide coverage for that file.
5756 Trial can then run just the appropriate tests. This is useful for
5757 quick builds, where you want to only run the test cases that cover the
5758 changed functionality.
5760 Arguments:
5761 @table @code
5762 @item source
5763 (required): A step specification tuple, like that used by GNUAutoconf.
5765 @item buildpython
5766 A list (argv array) of strings which specifies the @code{python}
5767 executable to use when building the package. Defaults to just
5768 @code{['python']}. It may be useful to add flags here, to supress
5769 warnings during compilation of extension modules. This list is
5770 extended with @code{['./setup.py', 'build']} and then executed in a
5771 ShellCommand.
5773 @item testpath
5774 Provides a directory to add to @code{PYTHONPATH} when running the unit
5775 tests, if tests are being run. Defaults to @code{.} to include the
5776 project files in-place. The generated build library is frequently
5777 architecture-dependent, but may simply be @file{build/lib} for
5778 pure-python modules.
5780 @item trialpython
5781 Another list of strings used to build the command that actually runs
5782 trial. This is prepended to the contents of the @code{trial} argument
5783 below. It may be useful to add @code{-W} flags here to supress
5784 warnings that occur while tests are being run. Defaults to an empty
5785 list, meaning @code{trial} will be run without an explicit
5786 interpreter, which is generally what you want if you're using
5787 @file{/usr/bin/trial} instead of, say, the @file{./bin/trial} that
5788 lives in the Twisted source tree.
5790 @item trial
5791 provides the name of the @code{trial} command. It is occasionally
5792 useful to use an alternate executable, such as @code{trial2.2} which
5793 might run the tests under an older version of Python. Defaults to
5794 @code{trial}.
5796 @item tests
5797 Provides a module name or names which contain the unit tests for this
5798 project. Accepts a string, typically @code{PROJECTNAME.test}, or a
5799 list of strings. Defaults to None, indicating that no tests should be
5800 run. You must either set this or @code{useTestCaseNames} to do anyting
5801 useful with the Trial factory.
5803 @item useTestCaseNames
5804 Tells the Step to provide the names of all changed .py files to trial,
5805 so it can look for test-case-name tags and run just the matching test
5806 cases. Suitable for use in quick builds. Defaults to False.
5808 @item randomly
5809 If @code{True}, tells Trial (with the @code{--random=0} argument) to
5810 run the test cases in random order, which sometimes catches subtle
5811 inter-test dependency bugs. Defaults to @code{False}.
5813 @item recurse
5814 If @code{True}, tells Trial (with the @code{--recurse} argument) to
5815 look in all subdirectories for additional test cases. It isn't clear
5816 to me how this works, but it may be useful to deal with the
5817 unknown-PROJECTNAME problem described above, and is currently used in
5818 the Twisted buildbot to accomodate the fact that test cases are now
5819 distributed through multiple twisted.SUBPROJECT.test directories.
5821 @end table  
5823 Unless one of @code{trialModule} or @code{useTestCaseNames}
5824 are set, no tests will be run.
5826 Some quick examples follow. Most of these examples assume that the
5827 target python code (the ``code under test'') can be reached directly
5828 from the root of the target tree, rather than being in a @file{lib/}
5829 subdirectory.
5831 @example
5832 #  Trial(source, tests="toplevel.test") does:
5833 #   python ./setup.py build
5834 #   PYTHONPATH=. trial -to toplevel.test
5836 #  Trial(source, tests=["toplevel.test", "other.test"]) does:
5837 #   python ./setup.py build
5838 #   PYTHONPATH=. trial -to toplevel.test other.test
5840 #  Trial(source, useTestCaseNames=True) does:
5841 #   python ./setup.py build
5842 #   PYTHONPATH=. trial -to --testmodule=foo/bar.py..  (from Changes)
5844 #  Trial(source, buildpython=["python2.3", "-Wall"], tests="foo.tests"):
5845 #   python2.3 -Wall ./setup.py build
5846 #   PYTHONPATH=. trial -to foo.tests
5848 #  Trial(source, trialpython="python2.3", trial="/usr/bin/trial",
5849 #        tests="foo.tests") does:
5850 #   python2.3 -Wall ./setup.py build
5851 #   PYTHONPATH=. python2.3 /usr/bin/trial -to foo.tests
5853 # For running trial out of the tree being tested (only useful when the
5854 # tree being built is Twisted itself):
5855 #  Trial(source, trialpython=["python2.3", "-Wall"], trial="./bin/trial",
5856 #        tests="foo.tests") does:
5857 #   python2.3 -Wall ./setup.py build
5858 #   PYTHONPATH=. python2.3 -Wall ./bin/trial -to foo.tests
5859 @end example
5861 If the output directory of @code{./setup.py build} is known, you can
5862 pull the python code from the built location instead of the source
5863 directories. This should be able to handle variations in where the
5864 source comes from, as well as accomodating binary extension modules:
5866 @example
5867 # Trial(source,tests="toplevel.test",testpath='build/lib.linux-i686-2.3')
5868 # does:
5869 #  python ./setup.py build
5870 #  PYTHONPATH=build/lib.linux-i686-2.3 trial -to toplevel.test
5871 @end example
5874 @node Status Delivery, Command-line tool, Build Process, Top
5875 @chapter Status Delivery
5877 More details are available in the docstrings for each class, use
5878 @code{pydoc buildbot.status.html.Waterfall} to see them. Most status
5879 delivery objects take a @code{categories=} argument, which can contain
5880 a list of ``category'' names: in this case, it will only show status
5881 for Builders that are in one of the named categories.
5883 (implementor's note: each of these objects should be a
5884 service.MultiService which will be attached to the BuildMaster object
5885 when the configuration is processed. They should use
5886 @code{self.parent.getStatus()} to get access to the top-level IStatus
5887 object, either inside @code{startService} or later. They may call
5888 @code{status.subscribe()} in @code{startService} to receive
5889 notifications of builder events, in which case they must define
5890 @code{builderAdded} and related methods. See the docstrings in
5891 @file{buildbot/interfaces.py} for full details.)
5893 @menu
5894 * HTML Waterfall::              
5895 * WebStatus::                   
5896 * MailNotifier::                
5897 * IRC Bot::                     
5898 * PBListener::                  
5899 * Writing New Status Plugins::  
5900 @end menu
5902 @c @node Email Delivery,  , Status Delivery, Status Delivery
5903 @c @subsection Email Delivery
5905 @c DOCUMENT THIS
5907 @node HTML Waterfall, WebStatus, Status Delivery, Status Delivery
5908 @section HTML Waterfall
5910 @cindex Waterfall
5911 @stindex buildbot.status.html.Waterfall
5914 @example
5915 from buildbot.status import html
5916 w = html.Waterfall(http_port=8080)
5917 c['status'].append(w)
5918 @end example
5920 The @code{buildbot.status.html.Waterfall} status target creates an
5921 HTML ``waterfall display'', which shows a time-based chart of events.
5922 This display provides detailed information about all steps of all
5923 recent builds, and provides hyperlinks to look at individual build
5924 logs and source changes. If the @code{http_port} argument is provided,
5925 it provides a strports specification for the port that the web server
5926 should listen on. This can be a simple port number, or a string like
5927 @code{tcp:8080:interface=127.0.0.1} (to limit connections to the
5928 loopback interface, and therefore to clients running on the same
5929 host)@footnote{It may even be possible to provide SSL access by using
5930 a specification like
5931 @code{"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"}, but this is
5932 completely untested}.
5934 If instead (or in addition) you provide the @code{distrib_port}
5935 argument, a twisted.web distributed server will be started either on a
5936 TCP port (if @code{distrib_port} is like @code{"tcp:12345"}) or more
5937 likely on a UNIX socket (if @code{distrib_port} is like
5938 @code{"unix:/path/to/socket"}).
5940 The @code{distrib_port} option means that, on a host with a
5941 suitably-configured twisted-web server, you do not need to consume a
5942 separate TCP port for the buildmaster's status web page. When the web
5943 server is constructed with @code{mktap web --user}, URLs that point to
5944 @code{http://host/~username/} are dispatched to a sub-server that is
5945 listening on a UNIX socket at @code{~username/.twisted-web-pb}. On
5946 such a system, it is convenient to create a dedicated @code{buildbot}
5947 user, then set @code{distrib_port} to
5948 @code{"unix:"+os.path.expanduser("~/.twistd-web-pb")}. This
5949 configuration will make the HTML status page available at
5950 @code{http://host/~buildbot/} . Suitable URL remapping can make it
5951 appear at @code{http://host/buildbot/}, and the right virtual host
5952 setup can even place it at @code{http://buildbot.host/} .
5954 Other arguments:
5956 @table @code
5957 @item allowForce
5958 If set to True (the default), then the web page will provide a ``Force
5959 Build'' button that allows visitors to manually trigger builds. This
5960 is useful for developers to re-run builds that have failed because of
5961 intermittent problems in the test suite, or because of libraries that
5962 were not installed at the time of the previous build. You may not wish
5963 to allow strangers to cause a build to run: in that case, set this to
5964 False to remove these buttons.
5966 @item favicon
5967 If set to a string, this will be interpreted as a filename containing
5968 a ``favicon'': a small image that contains an icon for the web site.
5969 This is returned to browsers that request the @code{favicon.ico} file,
5970 and should point to a .png or .ico image file. The default value uses
5971 the buildbot/buildbot.png image (a small hex nut) contained in the
5972 buildbot distribution. You can set this to None to avoid using a
5973 favicon at all.
5975 @item robots_txt
5976 If set to a string, this will be interpreted as a filename containing
5977 the contents of ``robots.txt''. Many search engine spiders request
5978 this file before indexing the site. Setting it to a file which
5979 contains:
5980 @example
5981 User-agent: *
5982 Disallow: /
5983 @end example
5984 will prevent most search engines from trawling the (voluminous)
5985 generated status pages.
5987 @end table
5990 @node WebStatus, MailNotifier, HTML Waterfall, Status Delivery
5991 @section WebStatus
5993 @cindex WebStatus
5994 @stindex buildbot.status.web.baseweb.WebStatus
5996 The Waterfall object is actually a subset of the views available with
5997 the more generalized @code{WebStatus} target. When you use
5998 @code{WebStatus}, you can put HTML files, CSS stylesheets, robots.txt,
5999 and other resources in a @file{public_html/} directory for use by the
6000 built-in webserver.
6002 When the buildmaster is created, a subdirectory named
6003 @file{public_html/} is created in its base directory. @code{WebStatus}
6004 will serve files from this directory: for example, when a user points
6005 their browser at the buildbot's @code{WebStatus} URL, they will see
6006 the contents of the @file{public_html/index.html} file. Likewise,
6007 @file{public_html/robots.txt} and @file{public_html/buildbot.css} are
6008 useful things to have in there. The first time a buildmaster is
6009 created, the @file{public_html} directory is populated with some
6010 sample files, which you will probably want to customize for your own
6011 project.
6013 @example
6014 from buildbot.status.html import WebStatus
6015 c['status'].append(WebStatus(8080))
6016 @end example
6018 Certain URL prefixes are handled specially by code within the
6019 buildbot. The pages available in these spaces provide various views into
6020 the buildbot status, each with a different focus. These pages can be
6021 configured further by adding query arguments, for example to restrict
6022 the page to only display certain Builders, or limit it to builds of a
6023 specific branch.
6025 In addition, if you are familiar with twisted.web @emph{Resource
6026 Trees}, you can write code to add additional pages at places inside
6027 this web space. Just use @code{webstatus.putChild} to place these
6028 resources.
6030 The following section describes the special URLs and the status views
6031 they provide.
6034 @menu
6035 * Buildbot Web Resources::      
6036 * XMLRPC server::               
6037 @end menu
6039 @node Buildbot Web Resources, XMLRPC server, WebStatus, WebStatus
6040 @subsection Buildbot Web Resources
6042 Certain URLs are ``magic'', and the pages they serve are created by
6043 code in various classes in the @file{buildbot.status.web} package
6044 instead of being read from disk. The most common way to access these
6045 pages is for the buildmaster admin to write or modify the
6046 @file{index.html} page to contain links to them. Of course other
6047 project web pages can contain links to these buildbot pages as well.
6049 Many pages can be modified by adding query arguments to the URL. For
6050 example, a page which shows the results of the most recent build
6051 normally does this for all builders at once. But by appending
6052 ``?builder=i386'' to the end of the URL, the page will show only the
6053 results for the ``i386'' builder. When used in this way, you can add
6054 multiple ``builder='' arguments to see multiple builders. Remembering
6055 that URL query arguments are separated @emph{from each other} with
6056 ampersands, a URL that ends in ``?builder=i386&builder=ppc'' would
6057 show builds for just those two Builders.
6059 The @code{branch=} query argument can be used on some pages. This
6060 filters the information displayed by that page down to only the builds
6061 or changes which involved the given branch. Multiple @code{branch=}
6062 arguments can be used to examine multiple branches at once (so
6063 appending @code{?branch=foo&branch=bar} to the URL will show builds
6064 involving either branch). No @code{branch=} arguments means to show
6065 builds and changes for all branches.
6067 Note that branch-handling still needs to be cleaned up: in particular
6068 there is currently no way to refer to the default (or ``trunk'')
6069 branch using @code{branch=} arguments. This will be improved in a
6070 future release.
6072 Some pages may include the Builder name or the build number in the
6073 main part of the URL itself. For example, a page that describes Build
6074 #7 of the ``i386'' builder would live at @file{/builders/i386/builds/7}.
6076 The table below lists all of the internal pages and the URLs that can
6077 be used to access them.
6079 NOTE: of the pages described here, @code{/slave_status_timeline} and
6080 @code{/last_build} have not yet been implemented, and @code{/xmlrpc}
6081 has only a few methods so far. Future releases will improve this.
6083 @table @code
6085 @item /waterfall
6087 This provides a chronologically-oriented display of the activity of
6088 all builders. It is the same display used by the Waterfall display.
6090 By adding one or more ``builder='' query arguments, the Waterfall is
6091 restricted to only showing information about the given Builders. By
6092 adding one or more ``branch='' query arguments, the display is
6093 restricted to showing information about the given branches.
6095 A 'show_events=true' query argument causes the display to include
6096 non-Build events, like slaves attaching and detaching, as well as
6097 reconfiguration events. 'show_events=false' hides these events. The
6098 default is to show them.
6100 The @code{last_time=}, @code{first_time=}, and @code{show_time=}
6101 arguments will control what interval of time is displayed. The default
6102 is to show the latest events, but these can be used to look at earlier
6103 periods in history. The @code{num_events=} argument also provides a
6104 limit on the size of the displayed page.
6106 The Waterfall has references to resources many of the other portions
6107 of the URL space: @file{/builders} for access to individual builds,
6108 @file{/changes} for access to information about source code changes,
6109 etc.
6111 @item /builders/$BUILDERNAME/
6113 This describes the given Builder, and provides buttons to force a build.
6115 @item /builders/$BUILDERNAME/builds/$BUILDNUM/
6117 This describes a specific Build.
6119 @item /builders/$BUILDERNAME/builds/$BUILDNUM/steps/$STEPNAME
6121 This describes a specific BuildStep.
6123 @item /builders/$BUILDERNAME/builds/$BUILDNUM/steps/$STEPNAME/logs/$LOGNAME
6125 This provides an HTML representation of a specific logfile.
6127 @item /builders/$BUILDERNAME/builds/$BUILDNUM/steps/$STEPNAME/logs/$LOGNAME/text
6129 This returns the logfile as plain text, without any HTML coloring
6130 markup. It also removes the ``headers'', which are the lines that
6131 describe what command was run and what the environment variable
6132 settings were like. This maybe be useful for saving to disk and
6133 feeding to tools like 'grep'.
6136 @item /one_line_per_build
6138 This page shows one line of text for each build, merging information
6139 from all Builders@footnote{Apparently this is the same way
6140 http://buildd.debian.org displays build status}. Each line specifies
6141 the name of the Builder, the number of the Build, what revision it
6142 used, and a summary of the results. Successful builds are in green,
6143 while failing builds are in red. The date and time of the build are
6144 added to the right-hand edge of the line. The lines are ordered by
6145 build finish timestamp.
6147 One or more @code{builder=} or @code{branch=} arguments can be used to
6148 restrict the list. In addition, a @code{numbuilds=} argument will
6149 control how many lines are displayed (20 by default).
6151 @item /slave_status_timeline
6153 This provides a chronological display of configuration and operational
6154 events: master startup/shutdown, slave connect/disconnect, and
6155 config-file changes. When a config-file reload is abandoned because of
6156 an error in the config file, the error is displayed on this page.
6158 This page does not show any builds.
6161 @item /last_build
6163 This shows one box per Builder, showing the results of the most recent
6164 complete build. It does not show the individual steps, or the current
6165 status.
6167 There are some options to limit the boxes displayed:
6169 @itemize @bullet
6170 @item
6171 branches: only show builds of specific branches
6172 @item only show specific builders
6173 @end itemize
6176 @item /last_build/$BUILDERNAME/status.png
6178 This returns a PNG image that describes the results of the most recent
6179 build, which can be referenced in an IMG tag by other pages, perhaps
6180 from a completely different site. Use it as you would a webcounter.
6182 @end table
6184 There are also a set of web-status resources that are intended for use
6185 by other programs, rather than humans.
6187 @table @code
6189 @item /xmlrpc
6191 This runs an XML-RPC server which can be used to query status
6192 information about various builds. See @ref{XMLRPC server} for more
6193 details.
6195 @end table
6197 @node XMLRPC server,  , Buildbot Web Resources, WebStatus
6198 @subsection XMLRPC server
6200 When using WebStatus, the buildbot runs an XML-RPC server at
6201 @file{/xmlrpc} that can be used by other programs to query build
6202 status. The following table lists the methods that can be invoked
6203 using this interface.
6205 @table @code
6207 @end table
6210 @node MailNotifier, IRC Bot, WebStatus, Status Delivery
6211 @section MailNotifier
6213 @cindex email
6214 @cindex mail
6215 @stindex buildbot.status.mail.MailNotifier
6217 The buildbot can also send email when builds finish. The most common
6218 use of this is to tell developers when their change has caused the
6219 build to fail. It is also quite common to send a message to a mailing
6220 list (usually named ``builds'' or similar) about every build.
6222 The @code{MailNotifier} status target is used to accomplish this. You
6223 configure it by specifying who mail should be sent to, under what
6224 circumstances mail should be sent, and how to deliver the mail. It can
6225 be configured to only send out mail for certain builders, and only
6226 send messages when the build fails, or when the builder transitions
6227 from success to failure. It can also be configured to include various
6228 build logs in each message.
6231 By default, the message will be sent to the Interested Users list
6232 (@pxref{Doing Things With Users}), which includes all developers who
6233 made changes in the build. You can add additional recipients with the
6234 extraRecipients argument.
6236 Each MailNotifier sends mail to a single set of recipients. To send
6237 different kinds of mail to different recipients, use multiple
6238 MailNotifiers.
6240 The following simple example will send an email upon the completion of
6241 each build, to just those developers whose Changes were included in
6242 the build. The email contains a description of the Build, its results,
6243 and URLs where more information can be obtained.
6245 @example
6246 from buildbot.status.mail import MailNotifier
6247 mn = MailNotifier(fromaddr="buildbot@@example.org", lookup="example.org")
6248 c['status'].append(mn)
6249 @end example
6251 To get a simple one-message-per-build (say, for a mailing list), use
6252 the following form instead. This form does not send mail to individual
6253 developers (and thus does not need the @code{lookup=} argument,
6254 explained below), instead it only ever sends mail to the ``extra
6255 recipients'' named in the arguments:
6257 @example
6258 mn = MailNotifier(fromaddr="buildbot@@example.org",
6259                   sendToInterestedUsers=False,
6260                   extraRecipients=['listaddr@@example.org'])
6261 @end example
6263 @heading MailNotifier arguments
6265 @table @code
6266 @item fromaddr
6267 The email address to be used in the 'From' header.
6269 @item sendToInterestedUsers
6270 (boolean). If True (the default), send mail to all of the Interested
6271 Users. If False, only send mail to the extraRecipients list.
6273 @item extraRecipients
6274 (tuple of strings). A list of email addresses to which messages should
6275 be sent (in addition to the InterestedUsers list, which includes any
6276 developers who made Changes that went into this build). It is a good
6277 idea to create a small mailing list and deliver to that, then let
6278 subscribers come and go as they please.
6280 @item subject
6281 (string). A string to be used as the subject line of the message.
6282 @code{%(builder)s} will be replaced with the name of the builder which
6283 provoked the message.
6285 @item mode
6286 (string). Default to 'all'. One of:
6287 @table @code
6288 @item all
6289 Send mail about all builds, bothpassing and failing
6290 @item failing
6291 Only send mail about builds which fail
6292 @item problem
6293 Only send mail about a build which failed when the previous build has passed.
6294 If your builds usually pass, then this will only send mail when a problem
6295 occurs.
6296 @end table
6298 @item builders
6299 (list of strings). A list of builder names for which mail should be
6300 sent. Defaults to None (send mail for all builds). Use either builders
6301 or categories, but not both.
6303 @item categories
6304 (list of strings). A list of category names to serve status
6305 information for. Defaults to None (all categories). Use either
6306 builders or categories, but not both.
6308 @item addLogs
6309 (boolean). If True, include all build logs as attachments to the
6310 messages. These can be quite large. This can also be set to a list of
6311 log names, to send a subset of the logs. Defaults to False.
6313 @item relayhost
6314 (string). The host to which the outbound SMTP connection should be
6315 made. Defaults to 'localhost'
6317 @item lookup
6318 (implementor of @code{IEmailLookup}). Object which provides
6319 IEmailLookup, which is responsible for mapping User names (which come
6320 from the VC system) into valid email addresses. If not provided, the
6321 notifier will only be able to send mail to the addresses in the
6322 extraRecipients list. Most of the time you can use a simple Domain
6323 instance. As a shortcut, you can pass as string: this will be treated
6324 as if you had provided Domain(str). For example,
6325 lookup='twistedmatrix.com' will allow mail to be sent to all
6326 developers whose SVN usernames match their twistedmatrix.com account
6327 names. See buildbot/status/mail.py for more details.
6329 @end table
6332 @node IRC Bot, PBListener, MailNotifier, Status Delivery
6333 @section IRC Bot
6335 @cindex IRC
6336 @stindex buildbot.status.words.IRC
6339 The @code{buildbot.status.words.IRC} status target creates an IRC bot
6340 which will attach to certain channels and be available for status
6341 queries. It can also be asked to announce builds as they occur, or be
6342 told to shut up.
6344 @example
6345 from twisted.status import words
6346 irc = words.IRC("irc.example.org", "botnickname", 
6347                 channels=["channel1", "channel2"],
6348                 password="mysecretpassword")
6349 c['status'].append(irc)
6350 @end example
6352 Take a look at the docstring for @code{words.IRC} for more details on
6353 configuring this service. The @code{password} argument, if provided,
6354 will be sent to Nickserv to claim the nickname: some IRC servers will
6355 not allow clients to send private messages until they have logged in
6356 with a password.
6358 To use the service, you address messages at the buildbot, either
6359 normally (@code{botnickname: status}) or with private messages
6360 (@code{/msg botnickname status}). The buildbot will respond in kind.
6362 Some of the commands currently available:
6364 @table @code
6366 @item list builders
6367 Emit a list of all configured builders
6368 @item status BUILDER
6369 Announce the status of a specific Builder: what it is doing right now.
6370 @item status all
6371 Announce the status of all Builders
6372 @item watch BUILDER
6373 If the given Builder is currently running, wait until the Build is
6374 finished and then announce the results.
6375 @item last BUILDER
6376 Return the results of the last build to run on the given Builder.
6378 @item help COMMAND
6379 Describe a command. Use @code{help commands} to get a list of known
6380 commands.
6381 @item source
6382 Announce the URL of the Buildbot's home page.
6383 @item version
6384 Announce the version of this Buildbot.
6385 @end table
6387 If the @code{allowForce=True} option was used, some addtional commands
6388 will be available:
6390 @table @code
6391 @item force build BUILDER REASON
6392 Tell the given Builder to start a build of the latest code. The user
6393 requesting the build and REASON are recorded in the Build status. The
6394 buildbot will announce the build's status when it finishes.
6396 @item stop build BUILDER REASON
6397 Terminate any running build in the given Builder. REASON will be added
6398 to the build status to explain why it was stopped. You might use this
6399 if you committed a bug, corrected it right away, and don't want to
6400 wait for the first build (which is destined to fail) to complete
6401 before starting the second (hopefully fixed) build.
6402 @end table
6404 @node PBListener, Writing New Status Plugins, IRC Bot, Status Delivery
6405 @section PBListener
6407 @cindex PBListener
6408 @stindex buildbot.status.client.PBListener
6411 @example
6412 import buildbot.status.client
6413 pbl = buildbot.status.client.PBListener(port=int, user=str,
6414                                         passwd=str)
6415 c['status'].append(pbl)
6416 @end example
6418 This sets up a PB listener on the given TCP port, to which a PB-based
6419 status client can connect and retrieve status information.
6420 @code{buildbot statusgui} (@pxref{statusgui}) is an example of such a
6421 status client. The @code{port} argument can also be a strports
6422 specification string.
6424 @node Writing New Status Plugins,  , PBListener, Status Delivery
6425 @section Writing New Status Plugins
6427 TODO: this needs a lot more examples
6429 Each status plugin is an object which provides the
6430 @code{twisted.application.service.IService} interface, which creates a
6431 tree of Services with the buildmaster at the top [not strictly true].
6432 The status plugins are all children of an object which implements
6433 @code{buildbot.interfaces.IStatus}, the main status object. From this
6434 object, the plugin can retrieve anything it wants about current and
6435 past builds. It can also subscribe to hear about new and upcoming
6436 builds.
6438 Status plugins which only react to human queries (like the Waterfall
6439 display) never need to subscribe to anything: they are idle until
6440 someone asks a question, then wake up and extract the information they
6441 need to answer it, then they go back to sleep. Plugins which need to
6442 act spontaneously when builds complete (like the MailNotifier plugin)
6443 need to subscribe to hear about new builds.
6445 If the status plugin needs to run network services (like the HTTP
6446 server used by the Waterfall plugin), they can be attached as Service
6447 children of the plugin itself, using the @code{IServiceCollection}
6448 interface.
6452 @node Command-line tool, Resources, Status Delivery, Top
6453 @chapter Command-line tool
6455 The @command{buildbot} command-line tool can be used to start or stop a
6456 buildmaster or buildbot, and to interact with a running buildmaster.
6457 Some of its subcommands are intended for buildmaster admins, while
6458 some are for developers who are editing the code that the buildbot is
6459 monitoring.
6461 @menu
6462 * Administrator Tools::         
6463 * Developer Tools::             
6464 * Other Tools::                 
6465 * .buildbot config directory::  
6466 @end menu
6468 @node Administrator Tools, Developer Tools, Command-line tool, Command-line tool
6469 @section Administrator Tools
6471 The following @command{buildbot} sub-commands are intended for
6472 buildmaster administrators:
6474 @heading create-master
6476 This creates a new directory and populates it with files that allow it
6477 to be used as a buildmaster's base directory.
6479 @example
6480 buildbot create-master BASEDIR
6481 @end example
6483 @heading create-slave
6485 This creates a new directory and populates it with files that let it
6486 be used as a buildslave's base directory. You must provide several
6487 arguments, which are used to create the initial @file{buildbot.tac}
6488 file.
6490 @example
6491 buildbot create-slave @var{BASEDIR} @var{MASTERHOST}:@var{PORT} @var{SLAVENAME} @var{PASSWORD}
6492 @end example
6494 @heading start
6496 This starts a buildmaster or buildslave which was already created in
6497 the given base directory. The daemon is launched in the background,
6498 with events logged to a file named @file{twistd.log}.
6500 @example
6501 buildbot start BASEDIR
6502 @end example
6504 @heading stop
6506 This terminates the daemon (either buildmaster or buildslave) running
6507 in the given directory.
6509 @example
6510 buildbot stop BASEDIR
6511 @end example
6513 @heading sighup
6515 This sends a SIGHUP to the buildmaster running in the given directory,
6516 which causes it to re-read its @file{master.cfg} file.
6518 @example
6519 buildbot sighup BASEDIR
6520 @end example
6522 @node Developer Tools, Other Tools, Administrator Tools, Command-line tool
6523 @section Developer Tools
6525 These tools are provided for use by the developers who are working on
6526 the code that the buildbot is monitoring.
6528 @menu
6529 * statuslog::                   
6530 * statusgui::                   
6531 * try::                         
6532 @end menu
6534 @node statuslog, statusgui, Developer Tools, Developer Tools
6535 @subsection statuslog
6537 @example
6538 buildbot statuslog --master @var{MASTERHOST}:@var{PORT}
6539 @end example
6541 This command starts a simple text-based status client, one which just
6542 prints out a new line each time an event occurs on the buildmaster.
6544 The @option{--master} option provides the location of the
6545 @code{buildbot.status.client.PBListener} status port, used to deliver
6546 build information to realtime status clients. The option is always in
6547 the form of a string, with hostname and port number separated by a
6548 colon (@code{HOSTNAME:PORTNUM}). Note that this port is @emph{not} the
6549 same as the slaveport (although a future version may allow the same
6550 port number to be used for both purposes). If you get an error message
6551 to the effect of ``Failure: twisted.cred.error.UnauthorizedLogin:'',
6552 this may indicate that you are connecting to the slaveport rather than
6553 a @code{PBListener} port.
6555 The @option{--master} option can also be provided by the
6556 @code{masterstatus} name in @file{.buildbot/options} (@pxref{.buildbot
6557 config directory}).
6559 @node statusgui, try, statuslog, Developer Tools
6560 @subsection statusgui
6562 @cindex statusgui
6564 If you have set up a PBListener (@pxref{PBListener}), you will be able
6565 to monitor your Buildbot using a simple Gtk+ application invoked with
6566 the @code{buildbot statusgui} command:
6568 @example
6569 buildbot statusgui --master @var{MASTERHOST}:@var{PORT}
6570 @end example
6572 This command starts a simple Gtk+-based status client, which contains
6573 a few boxes for each Builder that change color as events occur. It
6574 uses the same @option{--master} argument as the @command{buildbot
6575 statuslog} command (@pxref{statuslog}).
6577 @node try,  , statusgui, Developer Tools
6578 @subsection try
6580 This lets a developer to ask the question ``What would happen if I
6581 committed this patch right now?''. It runs the unit test suite (across
6582 multiple build platforms) on the developer's current code, allowing
6583 them to make sure they will not break the tree when they finally
6584 commit their changes.
6586 The @command{buildbot try} command is meant to be run from within a
6587 developer's local tree, and starts by figuring out the base revision
6588 of that tree (what revision was current the last time the tree was
6589 updated), and a patch that can be applied to that revision of the tree
6590 to make it match the developer's copy. This (revision, patch) pair is
6591 then sent to the buildmaster, which runs a build with that
6592 SourceStamp. If you want, the tool will emit status messages as the
6593 builds run, and will not terminate until the first failure has been
6594 detected (or the last success).
6596 There is an alternate form which accepts a pre-made patch file
6597 (typically the output of a command like 'svn diff'). This ``--diff''
6598 form does not require a local tree to run from. See @xref{try --diff}.
6600 For this command to work, several pieces must be in place:
6603 @heading TryScheduler
6605 @slindex buildbot.scheduler.Try_Jobdir
6606 @slindex buildbot.scheduler.Try_Userpass
6608 The buildmaster must have a @code{scheduler.Try} instance in
6609 the config file's @code{c['schedulers']} list. This lets the
6610 administrator control who may initiate these ``trial'' builds, which
6611 branches are eligible for trial builds, and which Builders should be
6612 used for them.
6614 The @code{TryScheduler} has various means to accept build requests:
6615 all of them enforce more security than the usual buildmaster ports do.
6616 Any source code being built can be used to compromise the buildslave
6617 accounts, but in general that code must be checked out from the VC
6618 repository first, so only people with commit privileges can get
6619 control of the buildslaves. The usual force-build control channels can
6620 waste buildslave time but do not allow arbitrary commands to be
6621 executed by people who don't have those commit privileges. However,
6622 the source code patch that is provided with the trial build does not
6623 have to go through the VC system first, so it is important to make
6624 sure these builds cannot be abused by a non-committer to acquire as
6625 much control over the buildslaves as a committer has. Ideally, only
6626 developers who have commit access to the VC repository would be able
6627 to start trial builds, but unfortunately the buildmaster does not, in
6628 general, have access to VC system's user list.
6630 As a result, the @code{TryScheduler} requires a bit more
6631 configuration. There are currently two ways to set this up:
6633 @table @strong
6634 @item jobdir (ssh)
6636 This approach creates a command queue directory, called the
6637 ``jobdir'', in the buildmaster's working directory. The buildmaster
6638 admin sets the ownership and permissions of this directory to only
6639 grant write access to the desired set of developers, all of whom must
6640 have accounts on the machine. The @code{buildbot try} command creates
6641 a special file containing the source stamp information and drops it in
6642 the jobdir, just like a standard maildir. When the buildmaster notices
6643 the new file, it unpacks the information inside and starts the builds.
6645 The config file entries used by 'buildbot try' either specify a local
6646 queuedir (for which write and mv are used) or a remote one (using scp
6647 and ssh).
6649 The advantage of this scheme is that it is quite secure, the
6650 disadvantage is that it requires fiddling outside the buildmaster
6651 config (to set the permissions on the jobdir correctly). If the
6652 buildmaster machine happens to also house the VC repository, then it
6653 can be fairly easy to keep the VC userlist in sync with the
6654 trial-build userlist. If they are on different machines, this will be
6655 much more of a hassle. It may also involve granting developer accounts
6656 on a machine that would not otherwise require them.
6658 To implement this, the buildslave invokes 'ssh -l username host
6659 buildbot tryserver ARGS', passing the patch contents over stdin. The
6660 arguments must include the inlet directory and the revision
6661 information.
6663 @item user+password (PB)
6665 In this approach, each developer gets a username/password pair, which
6666 are all listed in the buildmaster's configuration file. When the
6667 developer runs @code{buildbot try}, their machine connects to the
6668 buildmaster via PB and authenticates themselves using that username
6669 and password, then sends a PB command to start the trial build.
6671 The advantage of this scheme is that the entire configuration is
6672 performed inside the buildmaster's config file. The disadvantages are
6673 that it is less secure (while the ``cred'' authentication system does
6674 not expose the password in plaintext over the wire, it does not offer
6675 most of the other security properties that SSH does). In addition, the
6676 buildmaster admin is responsible for maintaining the username/password
6677 list, adding and deleting entries as developers come and go.
6679 @end table
6682 For example, to set up the ``jobdir'' style of trial build, using a
6683 command queue directory of @file{MASTERDIR/jobdir} (and assuming that
6684 all your project developers were members of the @code{developers} unix
6685 group), you would first create that directory (with @command{mkdir
6686 MASTERDIR/jobdir MASTERDIR/jobdir/new MASTERDIR/jobdir/cur
6687 MASTERDIR/jobdir/tmp; chgrp developers MASTERDIR/jobdir
6688 MASTERDIR/jobdir/*; chmod g+rwx,o-rwx MASTERDIR/jobdir
6689 MASTERDIR/jobdir/*}), and then use the following scheduler in the
6690 buildmaster's config file:
6692 @example
6693 from buildbot.scheduler import Try_Jobdir
6694 s = Try_Jobdir("try1", ["full-linux", "full-netbsd", "full-OSX"],
6695                jobdir="jobdir")
6696 c['schedulers'] = [s]
6697 @end example
6699 Note that you must create the jobdir before telling the buildmaster to
6700 use this configuration, otherwise you will get an error. Also remember
6701 that the buildmaster must be able to read and write to the jobdir as
6702 well. Be sure to watch the @file{twistd.log} file (@pxref{Logfiles})
6703 as you start using the jobdir, to make sure the buildmaster is happy
6704 with it.
6706 To use the username/password form of authentication, create a
6707 @code{Try_Userpass} instance instead. It takes the same
6708 @code{builderNames} argument as the @code{Try_Jobdir} form, but
6709 accepts an addtional @code{port} argument (to specify the TCP port to
6710 listen on) and a @code{userpass} list of username/password pairs to
6711 accept. Remember to use good passwords for this: the security of the
6712 buildslave accounts depends upon it:
6714 @example
6715 from buildbot.scheduler import Try_Userpass
6716 s = Try_Userpass("try2", ["full-linux", "full-netbsd", "full-OSX"],
6717                  port=8031, userpass=[("alice","pw1"), ("bob", "pw2")] )
6718 c['schedulers'] = [s]
6719 @end example
6721 Like most places in the buildbot, the @code{port} argument takes a
6722 strports specification. See @code{twisted.application.strports} for
6723 details.
6726 @heading locating the master
6728 The @command{try} command needs to be told how to connect to the
6729 @code{TryScheduler}, and must know which of the authentication
6730 approaches described above is in use by the buildmaster. You specify
6731 the approach by using @option{--connect=ssh} or @option{--connect=pb}
6732 (or @code{try_connect = 'ssh'} or @code{try_connect = 'pb'} in
6733 @file{.buildbot/options}).
6735 For the PB approach, the command must be given a @option{--master}
6736 argument (in the form HOST:PORT) that points to TCP port that you
6737 picked in the @code{Try_Userpass} scheduler. It also takes a
6738 @option{--username} and @option{--passwd} pair of arguments that match
6739 one of the entries in the buildmaster's @code{userpass} list. These
6740 arguments can also be provided as @code{try_master},
6741 @code{try_username}, and @code{try_password} entries in the
6742 @file{.buildbot/options} file.
6744 For the SSH approach, the command must be given @option{--tryhost},
6745 @option{--username}, and optionally @option{--password} (TODO:
6746 really?) to get to the buildmaster host. It must also be given
6747 @option{--trydir}, which points to the inlet directory configured
6748 above. The trydir can be relative to the user's home directory, but
6749 most of the time you will use an explicit path like
6750 @file{~buildbot/project/trydir}. These arguments can be provided in
6751 @file{.buildbot/options} as @code{try_host}, @code{try_username},
6752 @code{try_password}, and @code{try_dir}.
6754 In addition, the SSH approach needs to connect to a PBListener status
6755 port, so it can retrieve and report the results of the build (the PB
6756 approach uses the existing connection to retrieve status information,
6757 so this step is not necessary). This requires a @option{--master}
6758 argument, or a @code{masterstatus} entry in @file{.buildbot/options},
6759 in the form of a HOSTNAME:PORT string.
6762 @heading choosing the Builders
6764 A trial build is performed on multiple Builders at the same time, and
6765 the developer gets to choose which Builders are used (limited to a set
6766 selected by the buildmaster admin with the TryScheduler's
6767 @code{builderNames=} argument). The set you choose will depend upon
6768 what your goals are: if you are concerned about cross-platform
6769 compatibility, you should use multiple Builders, one from each
6770 platform of interest. You might use just one builder if that platform
6771 has libraries or other facilities that allow better test coverage than
6772 what you can accomplish on your own machine, or faster test runs.
6774 The set of Builders to use can be specified with multiple
6775 @option{--builder} arguments on the command line. It can also be
6776 specified with a single @code{try_builders} option in
6777 @file{.buildbot/options} that uses a list of strings to specify all
6778 the Builder names:
6780 @example
6781 try_builders = ["full-OSX", "full-win32", "full-linux"]
6782 @end example
6784 @heading specifying the VC system
6786 The @command{try} command also needs to know how to take the
6787 developer's current tree and extract the (revision, patch)
6788 source-stamp pair. Each VC system uses a different process, so you
6789 start by telling the @command{try} command which VC system you are
6790 using, with an argument like @option{--vc=cvs} or @option{--vc=tla}.
6791 This can also be provided as @code{try_vc} in
6792 @file{.buildbot/options}.
6794 The following names are recognized: @code{cvs} @code{svn} @code{baz}
6795 @code{tla} @code{hg} @code{darcs}
6798 @heading finding the top of the tree
6800 Some VC systems (notably CVS and SVN) track each directory
6801 more-or-less independently, which means the @command{try} command
6802 needs to move up to the top of the project tree before it will be able
6803 to construct a proper full-tree patch. To accomplish this, the
6804 @command{try} command will crawl up through the parent directories
6805 until it finds a marker file. The default name for this marker file is
6806 @file{.buildbot-top}, so when you are using CVS or SVN you should
6807 @code{touch .buildbot-top} from the top of your tree before running
6808 @command{buildbot try}. Alternatively, you can use a filename like
6809 @file{ChangeLog} or @file{README}, since many projects put one of
6810 these files in their top-most directory (and nowhere else). To set
6811 this filename, use @option{--try-topfile=ChangeLog}, or set it in the
6812 options file with @code{try_topfile = 'ChangeLog'}.
6814 You can also manually set the top of the tree with
6815 @option{--try-topdir=~/trees/mytree}, or @code{try_topdir =
6816 '~/trees/mytree'}. If you use @code{try_topdir}, in a
6817 @file{.buildbot/options} file, you will need a separate options file
6818 for each tree you use, so it may be more convenient to use the
6819 @code{try_topfile} approach instead.
6821 Other VC systems which work on full projects instead of individual
6822 directories (tla, baz, darcs, monotone, mercurial) do not require
6823 @command{try} to know the top directory, so the @option{--try-topfile}
6824 and @option{--try-topdir} arguments will be ignored.
6825 @c is this true? I think I currently require topdirs all the time.
6827 If the @command{try} command cannot find the top directory, it will
6828 abort with an error message.
6830 @heading determining the branch name
6832 Some VC systems record the branch information in a way that ``try''
6833 can locate it, in particular Arch (both @command{tla} and
6834 @command{baz}). For the others, if you are using something other than
6835 the default branch, you will have to tell the buildbot which branch
6836 your tree is using. You can do this with either the @option{--branch}
6837 argument, or a @option{try_branch} entry in the
6838 @file{.buildbot/options} file.
6840 @heading determining the revision and patch
6842 Each VC system has a separate approach for determining the tree's base
6843 revision and computing a patch.
6845 @table @code
6847 @item CVS
6849 @command{try} pretends that the tree is up to date. It converts the
6850 current time into a @code{-D} time specification, uses it as the base
6851 revision, and computes the diff between the upstream tree as of that
6852 point in time versus the current contents. This works, more or less,
6853 but requires that the local clock be in reasonably good sync with the
6854 repository.
6856 @item SVN
6857 @command{try} does a @code{svn status -u} to find the latest
6858 repository revision number (emitted on the last line in the ``Status
6859 against revision: NN'' message). It then performs an @code{svn diff
6860 -rNN} to find out how your tree differs from the repository version,
6861 and sends the resulting patch to the buildmaster. If your tree is not
6862 up to date, this will result in the ``try'' tree being created with
6863 the latest revision, then @emph{backwards} patches applied to bring it
6864 ``back'' to the version you actually checked out (plus your actual
6865 code changes), but this will still result in the correct tree being
6866 used for the build.
6868 @item baz
6869 @command{try} does a @code{baz tree-id} to determine the
6870 fully-qualified version and patch identifier for the tree
6871 (ARCHIVE/VERSION--patch-NN), and uses the VERSION--patch-NN component
6872 as the base revision. It then does a @code{baz diff} to obtain the
6873 patch.
6875 @item tla
6876 @command{try} does a @code{tla tree-version} to get the
6877 fully-qualified version identifier (ARCHIVE/VERSION), then takes the
6878 first line of @code{tla logs --reverse} to figure out the base
6879 revision. Then it does @code{tla changes --diffs} to obtain the patch.
6881 @item Darcs
6882 @code{darcs changes --context} emits a text file that contains a list
6883 of all patches back to and including the last tag was made. This text
6884 file (plus the location of a repository that contains all these
6885 patches) is sufficient to re-create the tree. Therefore the contents
6886 of this ``context'' file @emph{are} the revision stamp for a
6887 Darcs-controlled source tree.
6889 So @command{try} does a @code{darcs changes --context} to determine
6890 what your tree's base revision is, and then does a @code{darcs diff
6891 -u} to compute the patch relative to that revision.
6893 @item Mercurial
6894 @code{hg identify} emits a short revision ID (basically a truncated
6895 SHA1 hash of the current revision's contents), which is used as the
6896 base revision. @code{hg diff} then provides the patch relative to that
6897 revision. For @command{try} to work, your working directory must only
6898 have patches that are available from the same remotely-available
6899 repository that the build process' @code{step.Mercurial} will use.
6901 @c TODO: monotone, git
6902 @end table
6904 @heading waiting for results
6906 If you provide the @option{--wait} option (or @code{try_wait = True}
6907 in @file{.buildbot/options}), the @command{buildbot try} command will
6908 wait until your changes have either been proven good or bad before
6909 exiting. Unless you use the @option{--quiet} option (or
6910 @code{try_quiet=True}), it will emit a progress message every 60
6911 seconds until the builds have completed.
6913 @menu
6914 * try --diff::                  
6915 @end menu
6917 @node try --diff,  , try, try
6918 @subsubsection try --diff
6920 Sometimes you might have a patch from someone else that you want to
6921 submit to the buildbot. For example, a user may have created a patch
6922 to fix some specific bug and sent it to you by email. You've inspected
6923 the patch and suspect that it might do the job (and have at least
6924 confirmed that it doesn't do anything evil). Now you want to test it
6925 out.
6927 One approach would be to check out a new local tree, apply the patch,
6928 run your local tests, then use ``buildbot try'' to run the tests on
6929 other platforms. An alternate approach is to use the @command{buildbot
6930 try --diff} form to have the buildbot test the patch without using a
6931 local tree.
6933 This form takes a @option{--diff} argument which points to a file that
6934 contains the patch you want to apply. By default this patch will be
6935 applied to the TRUNK revision, but if you give the optional
6936 @option{--baserev} argument, a tree of the given revision will be used
6937 as a starting point instead of TRUNK.
6939 You can also use @command{buildbot try --diff=-} to read the patch
6940 from stdin.
6942 Each patch has a ``patchlevel'' associated with it. This indicates the
6943 number of slashes (and preceding pathnames) that should be stripped
6944 before applying the diff. This exactly corresponds to the @option{-p}
6945 or @option{--strip} argument to the @command{patch} utility. By
6946 default @command{buildbot try --diff} uses a patchlevel of 0, but you
6947 can override this with the @option{-p} argument.
6949 When you use @option{--diff}, you do not need to use any of the other
6950 options that relate to a local tree, specifically @option{--vc},
6951 @option{--try-topfile}, or @option{--try-topdir}. These options will
6952 be ignored. Of course you must still specify how to get to the
6953 buildmaster (with @option{--connect}, @option{--tryhost}, etc).
6956 @node Other Tools, .buildbot config directory, Developer Tools, Command-line tool
6957 @section Other Tools
6959 These tools are generally used by buildmaster administrators.
6961 @menu
6962 * sendchange::                  
6963 * debugclient::                 
6964 @end menu
6966 @node sendchange, debugclient, Other Tools, Other Tools
6967 @subsection sendchange
6969 This command is used to tell the buildmaster about source changes. It
6970 is intended to be used from within a commit script, installed on the
6971 VC server. It requires that you have a PBChangeSource
6972 (@pxref{PBChangeSource}) running in the buildmaster (by being set in
6973 @code{c['change_source']}).
6976 @example
6977 buildbot sendchange --master @var{MASTERHOST}:@var{PORT} --username @var{USER} @var{FILENAMES..}
6978 @end example
6980 There are other (optional) arguments which can influence the
6981 @code{Change} that gets submitted:
6983 @table @code
6984 @item --branch
6985 This provides the (string) branch specifier. If omitted, it defaults
6986 to None, indicating the ``default branch''. All files included in this
6987 Change must be on the same branch.
6989 @item --revision_number
6990 This provides a (numeric) revision number for the change, used for VC systems
6991 that use numeric transaction numbers (like Subversion).
6993 @item --revision
6994 This provides a (string) revision specifier, for VC systems that use
6995 strings (Arch would use something like patch-42 etc).
6997 @item --revision_file
6998 This provides a filename which will be opened and the contents used as
6999 the revision specifier. This is specifically for Darcs, which uses the
7000 output of @command{darcs changes --context} as a revision specifier.
7001 This context file can be a couple of kilobytes long, spanning a couple
7002 lines per patch, and would be a hassle to pass as a command-line
7003 argument.
7005 @item --comments
7006 This provides the change comments as a single argument. You may want
7007 to use @option{--logfile} instead.
7009 @item --logfile
7010 This instructs the tool to read the change comments from the given
7011 file. If you use @code{-} as the filename, the tool will read the
7012 change comments from stdin.
7013 @end table
7016 @node debugclient,  , sendchange, Other Tools
7017 @subsection debugclient
7019 @example
7020 buildbot debugclient --master @var{MASTERHOST}:@var{PORT} --passwd @var{DEBUGPW}
7021 @end example
7023 This launches a small Gtk+/Glade-based debug tool, connecting to the
7024 buildmaster's ``debug port''. This debug port shares the same port
7025 number as the slaveport (@pxref{Setting the slaveport}), but the
7026 @code{debugPort} is only enabled if you set a debug password in the
7027 buildmaster's config file (@pxref{Debug options}). The
7028 @option{--passwd} option must match the @code{c['debugPassword']}
7029 value.
7031 @option{--master} can also be provided in @file{.debug/options} by the
7032 @code{master} key. @option{--passwd} can be provided by the
7033 @code{debugPassword} key.
7035 The @code{Connect} button must be pressed before any of the other
7036 buttons will be active. This establishes the connection to the
7037 buildmaster. The other sections of the tool are as follows:
7039 @table @code
7040 @item Reload .cfg
7041 Forces the buildmaster to reload its @file{master.cfg} file. This is
7042 equivalent to sending a SIGHUP to the buildmaster, but can be done
7043 remotely through the debug port. Note that it is a good idea to be
7044 watching the buildmaster's @file{twistd.log} as you reload the config
7045 file, as any errors which are detected in the config file will be
7046 announced there.
7048 @item Rebuild .py
7049 (not yet implemented). The idea here is to use Twisted's ``rebuild''
7050 facilities to replace the buildmaster's running code with a new
7051 version. Even if this worked, it would only be used by buildbot
7052 developers.
7054 @item poke IRC
7055 This locates a @code{words.IRC} status target and causes it to emit a
7056 message on all the channels to which it is currently connected. This
7057 was used to debug a problem in which the buildmaster lost the
7058 connection to the IRC server and did not attempt to reconnect.
7060 @item Commit
7061 This allows you to inject a Change, just as if a real one had been
7062 delivered by whatever VC hook you are using. You can set the name of
7063 the committed file and the name of the user who is doing the commit.
7064 Optionally, you can also set a revision for the change. If the
7065 revision you provide looks like a number, it will be sent as an
7066 integer, otherwise it will be sent as a string.
7068 @item Force Build
7069 This lets you force a Builder (selected by name) to start a build of
7070 the current source tree.
7072 @item Currently
7073 (obsolete). This was used to manually set the status of the given
7074 Builder, but the status-assignment code was changed in an incompatible
7075 way and these buttons are no longer meaningful.
7077 @end table
7080 @node .buildbot config directory,  , Other Tools, Command-line tool
7081 @section .buildbot config directory
7083 Many of the @command{buildbot} tools must be told how to contact the
7084 buildmaster that they interact with. This specification can be
7085 provided as a command-line argument, but most of the time it will be
7086 easier to set them in an ``options'' file. The @command{buildbot}
7087 command will look for a special directory named @file{.buildbot},
7088 starting from the current directory (where the command was run) and
7089 crawling upwards, eventually looking in the user's home directory. It
7090 will look for a file named @file{options} in this directory, and will
7091 evaluate it as a python script, looking for certain names to be set.
7092 You can just put simple @code{name = 'value'} pairs in this file to
7093 set the options.
7095 For a description of the names used in this file, please see the
7096 documentation for the individual @command{buildbot} sub-commands. The
7097 following is a brief sample of what this file's contents could be.
7099 @example
7100 # for status-reading tools
7101 masterstatus = 'buildbot.example.org:12345'
7102 # for 'sendchange' or the debug port
7103 master = 'buildbot.example.org:18990'
7104 debugPassword = 'eiv7Po'
7105 @end example
7107 @table @code
7108 @item masterstatus
7109 Location of the @code{client.PBListener} status port, used by
7110 @command{statuslog} and @command{statusgui}.
7112 @item master
7113 Location of the @code{debugPort} (for @command{debugclient}). Also the
7114 location of the @code{pb.PBChangeSource} (for @command{sendchange}).
7115 Usually shares the slaveport, but a future version may make it
7116 possible to have these listen on a separate port number.
7118 @item debugPassword
7119 Must match the value of @code{c['debugPassword']}, used to protect the
7120 debug port, for the @command{debugclient} command.
7122 @item username
7123 Provides a default username for the @command{sendchange} command.
7125 @end table
7128 The following options are used by the @code{buildbot try} command
7129 (@pxref{try}):
7131 @table @code
7132 @item try_connect
7133 This specifies how the ``try'' command should deliver its request to
7134 the buildmaster. The currently accepted values are ``ssh'' and ``pb''.
7135 @item try_builders
7136 Which builders should be used for the ``try'' build.
7137 @item try_vc
7138 This specifies the version control system being used.
7139 @item try_branch
7140 This indicates that the current tree is on a non-trunk branch.
7141 @item try_topdir
7142 @item try_topfile
7143 Use @code{try_topdir} to explicitly indicate the top of your working
7144 tree, or @code{try_topfile} to name a file that will only be found in
7145 that top-most directory.
7147 @item try_host
7148 @item try_username
7149 @item try_dir
7150 When try_connect is ``ssh'', the command will pay attention to
7151 @code{try_host}, @code{try_username}, and @code{try_dir}.
7153 @item try_username
7154 @item try_password
7155 @item try_master
7156 Instead, when @code{try_connect} is ``pb'', the command will pay
7157 attention to @code{try_username}, @code{try_password}, and
7158 @code{try_master}.
7160 @item try_wait
7161 @item masterstatus
7162 @code{try_wait} and @code{masterstatus} are used to ask the ``try''
7163 command to wait for the requested build to complete.
7165 @end table
7169 @node Resources, Developer's Appendix, Command-line tool, Top
7170 @chapter Resources
7172 The Buildbot's home page is at @uref{http://buildbot.sourceforge.net/}
7174 For configuration questions and general discussion, please use the
7175 @code{buildbot-devel} mailing list. The subscription instructions and
7176 archives are available at
7177 @uref{http://lists.sourceforge.net/lists/listinfo/buildbot-devel}
7179 @node Developer's Appendix, Index of Useful Classes, Resources, Top
7180 @unnumbered Developer's Appendix
7182 This appendix contains random notes about the implementation of the
7183 Buildbot, and is likely to only be of use to people intending to
7184 extend the Buildbot's internals.
7186 The buildmaster consists of a tree of Service objects, which is shaped
7187 as follows:
7189 @example
7190 BuildMaster
7191  ChangeMaster  (in .change_svc)
7192   [IChangeSource instances]
7193  [IScheduler instances]  (in .schedulers)
7194  BotMaster  (in .botmaster)
7195   [IBuildSlave instances]
7196  [IStatusTarget instances]  (in .statusTargets)
7197 @end example
7199 The BotMaster has a collection of Builder objects as values of its
7200 @code{.builders} dictionary.
7203 @node Index of Useful Classes, Index of master.cfg keys, Developer's Appendix, Top
7204 @unnumbered Index of Useful Classes
7206 This is a list of all user-visible classes. There are the ones that
7207 are useful in @file{master.cfg}, the buildmaster's configuration file.
7208 Classes that are not listed here are generally internal things that
7209 admins are unlikely to have much use for.
7212 @heading Change Sources
7213 @printindex cs
7215 @heading Schedulers and Locks
7216 @printindex sl
7218 @heading Build Factories
7219 @printindex bf
7221 @heading Build Steps
7222 @printindex bs
7224 @c undocumented steps
7225 @bsindex buildbot.steps.source.Git
7226 @bsindex buildbot.steps.maxq.MaxQ
7229 @heading Status Targets
7230 @printindex st
7232 @c TODO: undocumented targets
7234 @node Index of master.cfg keys, Index, Index of Useful Classes, Top
7235 @unnumbered Index of master.cfg keys
7237 This is a list of all of the significant keys in master.cfg . Recall
7238 that master.cfg is effectively a small python program with exactly one
7239 responsibility: create a dictionary named @code{BuildmasterConfig}.
7240 The keys of this dictionary are listed here. The beginning of the
7241 master.cfg file typically starts with something like:
7243 @example
7244 BuildmasterConfig = c = @{@}
7245 @end example
7247 Therefore a config key of @code{change_source} will usually appear in
7248 master.cfg as @code{c['change_source']}.
7250 @printindex bc
7253 @node Index,  , Index of master.cfg keys, Top
7254 @unnumbered Index
7256 @printindex cp
7259 @bye