|
Hudson supports the "master/slave" mode, where the workload of building projects are delegated to multiple "slave" nodes, allowing single Hudson installation to host a large number of projects, or provide different environments needed for builds/tests. This document describes this mode and how to use it. How does this work?A "master" is an installation of Hudson. When you weren't using the master/slave support, a master was all you had. Even in the master/slave mode, the role of a master remains the same. It will serve all HTTP requests, and it can still build projects on its own. Slaves are computers that are set up to build projects for a master. Hudson runs a separate program called "slave agent" on slaves. There are various ways to start slave agents, but in the end a slave agent and Hudson master needs to establish a bi-directional byte stream (for example a TCP/IP socket.) When slaves are registered to a master, a master starts distributing loads to slaves. The exact delegation behavior depends on configuration of each project. Some projects may choose to "stick" to a particular machine for a build, while others may choose to roam freely between slaves. For people accessing Hudson website, things works mostly transparently. You can still browse javadoc, see test results, download build results from a master, without ever noticing that builds were done by slaves. Follow the Step by step guide to set up master and slave machines to quickly start using distributed builds. Different ways of starting slave agentsPick the right method depending on your environment and OS that master/slaves run. Have master launch slave agent via sshHudson has a built-in SSH client implementation that it can use to talk to remote sshd and start a slave agent. This is the most convenient and preferred method for Unix slaves, which normally has sshd out-of-the-box. Click Manage Hudson, then Manage Nodes, then click "New Node." In this set up, you'll supply the connection information (the slave host name, user name, and ssh credential). Note that the slave will need the master's public ssh key copied to ~/.ssh/authorized_keys. (This is a decent howto if you need ssh help). Hudson will do the rest of the work by itself, including copying the binary needed for a slave agent, and starting/stopping slaves. If your project has external dependecies (like a special ~/.m2/settings.xml, or a special version of java), you'll need to set that up yourself, though. [Where is this documented?] This is the most convenient set up on Unix. Have master launch slave agent on WindowsFor Windows slaves, Hudson can use the remote management facility built into Windows 2000 or later (WMI+DCOM, to be more specific.) In this set up, you'll supply the username and the password of the user who has the administrative access to the system, and Hudson will use that remotely create a Windows service and remotely start/stop them. This is the most convenient set up on Windows. Write your own script to launch Hudson slavesIf the above turn-key solutions do not provide flexibility necessary, you can write your own script to start a slave. You place this script on the master, and tell Hudson to run this script whenever it needs to connect to a slave. Typically, your script uses a remote program execution mechanism like SSH, RSH, or other similar means (on Windows, this could be done by the same protocols through cygwin or tools like psexec), but Hudson doesn't really assume any specific method of connectivity. What Hudson expects from your script is that, in the end, it has to execute the slave agent program like java -jar slave.jar, on the right computer, and have its stdin/stdout connect to your script's stdin/stdout. For example, a script that does "ssh myslave java -jar ~/bin/slave.jar" would satisfy this. A copy of slave.jar can be downloaded from http://yourserver/hudson/jnlpJars/slave.jar. Many people write scripts in such a way that this 160K jar is downloaded during the script, to make sure the consistent version of slave.jar is always used.
Launching slaves this way often requires an additional initial set up on slaves (especially on Windows, where remote login mechanism is not available out of box), but the benefits of this approach is that when the connection goes bad, you can use Hudson's web interface to re-establish the connection. Launch slave agent via Java Web StartAnother way of doing this is to start a slave agent through Java Web Start (JNLP). In this approach, you'll interactively logon to the slave node, open a browser, and open the slave page. You'll be then presented with the JNLP launch icon. Upon clicking it, Java Web Start will kick in, and it launchs a slave agent on the computer where the browser was running. On Windows, you can do this manually once, then from the launched JNLP slave agent, you can install it as a Windows service so that you don't need to interactively start the slave from then on. Launch slave agent headlesslyThis launch mode uses a mechanism very similar to Java Web Start, except that it runs without using GUI, making it convenient for an execution as a daemon on Unix. To do this, configure this slave to be a JNLP slave, take slave.jar as discussed above, and then from the slave, run a command like this: $ java -jar slave.jar -jnlpUrl http://hudson.acme.org/computer/slave-name/slave-agent.jnlp Other RequirementsAlso note that the slaves are a kind of a cluster, and operating a cluster (especially a large one or heterogeneous one) is always a non-trivial task. For example, you need to make sure that all slaves have JDKs, Ant, CVS, and/or any other tools you need for builds. You need to make sure that slaves are up and running, etc. Hudson is not a clustering middleware, and therefore it doesn't make this any easier. Example: Configuration on UnixThis section describes my current set up of Hudson slaves that I use inside Sun for my day job. My master Hudson node is running on a SPARC Solaris box, and I have many SPARC Solaris slaves, Opteron Linux slaves, and a few Windows slaves.
Scheduling strategySome slaves are faster, while others are slow. Some slaves are closer (network wise) to a master, others are far away. So doing a good build distribution is a challenge. Currently, Hudson employs the following strategy:
If you have interesting ideas (or better yet, implementations), please let me know. Transition from master-only to master/slaveTypically, you start with a master-only installation and then much later you add slaves as your projects grow. When you enable the master/slave mode, Hudson automatically configures all your existing projects to stick to the master node. This is a precaution to avoid disturbing existing projects, since most likely you won't be able to configure slaves correctly without trial and error. After you configure slaves successfully, you need to individually configure projects to let them roam freely. This is tedious, but it allows you to work on one project at a time. Projects that are newly created on master/slave-enabled Hudson will be by default configured to roam freely. Master on public network, slaves within firewallOne might consider setting up the Hudson master on the public network (so that people can see it), while leaving the build slaves within the firewall (because having a lot of machines on the internet is expensive.) This can generally be made to work in two means:
Note that in both cases, once the master is compromised, all your slaves can be easily compromised (IOW, malicious master can execute arbitrary program on slaves), so both set-up leaves much to be desired in terms of isolating security breach. Build Publisher Plugin (which looks almost ready as of this writing) provides another way of doing this, in more secure fashion. Running Multiple Slaves on the Same MachineIt is possible to run multiple slave instaces on a Windows machine, and have them installed as separate Windows services so they can start up on system startup.While the correct use of executors largely obviates the need for multiple slave instances on the same machine, there are some unique use cases to consider:
Follow these steps to get multiple slaves working on the same Windows box:
When you go to create the second node, it is nice to be able to copy an existing node, and copy the first node you setup. Then you just tweak the Remote FS Root and a couple other settings to make it distinct. When you are done you should have two (or more) Hudson slave services in the list of Windows services. Troubleshooting tips
Other readings |

Comments (20)
Jun 29, 2007
Anonymous says:
You should consider expanding on the section about launching slaves via Java Web...You should consider expanding on the section about launching slaves via Java WebStart. Took me a bit to figure it out. I'll even write it up of you like.
Jun 29, 2007
Kohsuke Kawaguchi says:
Yes, please! Much appreciated.Yes, please! Much appreciated.
Aug 01, 2007
Anonymous says:
Can someone give me a hint please how to open the slave page (url) ? thx\! Can someone give me a hint please how to open the slave page (url) ?
thx!
Sep 20, 2007
Anonymous says:
On my master (Linux) node I have added an Ant instance which points to the /opt/...On my master (Linux) node I have added an Ant instance which points to the /opt/ant-1.7.0 directory. Now, some build can be performed only on Windows so I've defined a Windows slave spawned via JNLP. But every build will fail, because Ant is not in /opt/ant-1.7.0 but somewhere else (c:\ant or whatever).
Same question about JDK path.
Sep 20, 2007
Anonymous says:
Ok, I have found that if I put Ant into c:\opt\ant1.7.0 it seems to work. Nevert...Ok, I have found that if I put Ant into c:\opt\ant-1.7.0 it seems to work. Nevertheless I think that such things could be configurable per slave. Of course plugins could be able to contribute paths to slave configurations
Oct 24, 2007
Anonymous says:
If the Hudson master is running atIf the Hudson master is running at
http://hudsonmaster:8080/hudsonthen you would login to the remote slave server, open a browser and enter the above URL. On the left-hand menu, you will see Build Executor Status section with "Master" and your remote slave listed below. Click the slave name link and on the resulting page you will see the "Launch" button for Java Web Start.
Oct 10, 2007
Daniel Pike says:
Something very useful in corporate networks in the ability to run slaves as a wi...Something very useful in corporate networks in the ability to run slaves as a windows service. After a fair bit of playing I have been able to achieve this using the Tanuki software's Java service wrapper. I am happy to write something up and send it through if it would be useful?
Oct 10, 2007
Kohsuke Kawaguchi says:
Yes, by all means!Yes, by all means!
Oct 18, 2007
Daniel Pike says:
Done, sent through to Kohsuke's address :)Done, sent through to Kohsuke's address
Oct 16, 2007
Jeff Black says:
Second that\!Second that!
Jan 07, 2008
Anonymous says:
When hudson tries to launch a slave it complains that it cannot find mavenagent....When hudson tries to launch a slave it complains that it cannot find maven-agent.jar I don't know what maven is. What do I need to do to make hudson happy?
Jan 25, 2008
Anonymous says:
Within a \nix system, you might be able to view top or uptime looking for load a...Within a *nix system, you might be able to view top or uptime - looking for load average on a that host. Weighting it then scheduling work based on that value.
Feb 13, 2008
Anonymous says:
If I have 2 slaves build machines building the same project, is there a way to c...If I have 2 slaves build machines building the same project, is there a way to configure Hudson to utilize the build machines at the same time? for example, if machine 1 is already building and Hudson detects a change in the source code repository, can machine 2 start the build for the new checkin? That way there is no need to wait for machine 1 to finish to get feedback on the last checkin.
Jun 18
Thomas Guieu says:
I would appreciate this feature too \! Is there a way to do that ? Or to manuall...I would appreciate this feature too !
Is there a way to do that ? Or to manually start several builds of the same job ?
May 23, 2008
Michael Manz says:
An idea for a further rule for the scheduling strategy: 4. If a build depends on...An idea for a further rule for the scheduling strategy:
4. If a build depends on another build, try to build it on the same node that previously build the parent build.
Dec 01, 2008
Leon Franzen says:
Our organization uses Maven2. We deploy a master POM that nearly all projects di...Our organization uses Maven2. We deploy a master POM that nearly all projects directly or indirectly inherit from. The POM project is a job in Hudson. We intend to deploy the SNAPSHOT build when changes committed to the POM are picked up and when all downstream jobs pass. Does Hudson provide a mechanism for synchronizing successful slave artifact SNAPSHOT builds so that all downstream builds on different slaves use the CI-installed (as opposed to deployed) artifacts?
Optimally I would like to do the following:
1) Hudson job "master pom": mvn install
2) Do all downstream jobs (triggered by Hudson)
3) If step 2 successful perform snapshot deploy "master pom" to primary repository.
4) Deploy downstream projects
Or, because we are using various (identically configured) slaves to perform the jobs, do we have to install a Hudson dedicated repository and do the following?:
1) Hudson job "master pom": mvn deploy to Hudson repository.
2) Do all downstream jobs
3) If step 2 successful, mvn deploy "master pom" to primary repository.
4) Deploy downstream projects
Dec 12, 2008
Kin Namier says:
Is it possible to have a slave authenticate as a certain user? I've finally got ...Is it possible to have a slave authenticate as a certain user? I've finally got a nice master/slave network up and running, but in order to do so, I had to grant read access to the "Anonymous" user on my main Hudson server, which opens up the site to anybody who wants to browse our projects, download build artifacts, etc. I would really prefer to have the anonymous user have no rights at all, and require usernames/passwords for all of our users, but then this would break our slaves...
So, is it possible to tell the slave to log into hudson with a given username and password? I've looked through the documents here on the wiki, the config XML, and tried passing "-help" to all available programs, but I can't seem to find anything.
Jan 29
David Multer says:
If you configure a Windows slave using Cygwin for sshd, I recommend not using th...If you configure a Windows slave using Cygwin for sshd, I recommend not using the CVS client that's part of Cygwin. I noticed that it was munging CRLF line terminations on DOS format files. It's possible that some combination of settings could avoid the problem, but I decided to uninstall Cygwin CVS and install TortoiseCVS (with CVSNT) instead. Once CVSNT is added to the PATH, everything worked perfectly.
Apr 22
Homer Yau says:
Thanks for the writeup on the master/slave setup.Thanks for the writeup on the master/slave setup.
May 22
Chris Hines says:
I have a working Master (Linux) / Slave (Windows XP) setup. I use the WMI ...I have a working Master (Linux) / Slave (Windows XP) setup. I use the WMI interface to launch the slave.
Getting the master to successfully connect to the slave and launch Hudson remotely required some configuration changes on the Windows machine that were not documented here. The exception message returned during the initial failed attepts provided just enough information for me to find this useful page on the J-Integra site that solved my problem. Maybe others will find this information useful too.