{"id":280,"date":"2026-10-13T07:51:23","date_gmt":"2026-10-13T07:51:23","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/07\/24\/hudson-master-slave-setup\/"},"modified":"2026-10-13T07:51:23","modified_gmt":"2026-10-13T07:51:23","slug":"hudson-master-slave-setup","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/hudson-master-slave-setup\/","title":{"rendered":"Hudson Master-Slave Setup: Distributed Build Architecture and Agent Launch Methods"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This guide explains Hudson\u2019s distributed build model (master-slave), how jobs are scheduled across nodes, and how to launch slave agents reliably. It is most useful for teams maintaining legacy Hudson installations and for engineers translating older Hudson documentation into modern CI node practices.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-07-24; fully revised and updated.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/07\/hudson-master-slave-setup.png\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/07\/hudson-master-slave-setup.png\" alt=\"Hudson master slave setup\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How Hudson master-slave scheduling works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In Hudson, the <strong>master<\/strong> handles the web interface, accepts user requests, and coordinates build execution. It can run builds locally or delegate them to <strong>slave<\/strong> machines where slave agents are running. Jobs can be pinned to specific nodes or allowed to run on any available node.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>The master remains the central control plane.<\/li><li>Slave nodes execute delegated builds from the master.<\/li><li>One machine can host multiple slave agents when needed.<\/li><li>Users view all job results from the master, regardless of where builds ran.<\/li><\/ul>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Build triggered on master] --> B[Master checks job rules]\n    B --> C{Execution target}\n    C --> D[Run on master node]\n    C --> E[Run on labeled slave]\n    C --> F[Run on any free slave]\n    E --> G[Slave agent executes build]\n    F --> G\n    D --> H[Build result returned]\n    G --> H\n    H --> I[Result visible in master UI]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Where this model helps most<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original guide highlights multi-OS build coverage as a primary use case: for example, running jobs across Linux, Solaris, and Windows. This setup is also useful when you want to offload heavy jobs from the master or reuse existing desktops as occasional build nodes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Slave agent launch methods compared<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hudson supports multiple ways to connect and launch slave agents. The best choice depends on network reachability, operating system, and operational control requirements.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Launch method<\/th><th>How it starts<\/th><th>Best for<\/th><th>Trade-off<\/th><\/tr><\/thead><tbody><tr><td>Launch via SSH (Unix)<\/td><td>Master initiates SSH to slave and starts agent<\/td><td>Unix\/Linux nodes with reachable SSH<\/td><td>Requires SSH connectivity and credentials<\/td><\/tr><tr><td>Launch via JNLP (Java Web Start)<\/td><td>User starts agent from slave-side browser<\/td><td>Cases where slave can reach master but reverse access is limited<\/td><td>If node goes down, master cannot always relaunch automatically<\/td><\/tr><tr><td>Headless JNLP<\/td><td>Run <code>slave.jar<\/code> with <code>-jnlpUrl<\/code> on slave<\/td><td>Daemon-style agent startup without GUI<\/td><td>Needs process supervision on slave host<\/td><\/tr><tr><td>Launch by command from master<\/td><td>Master executes custom script (for example SSH wrapper)<\/td><td>Custom environments and nonstandard login flows<\/td><td>More scripting and maintenance effort<\/td><\/tr><tr><td>Windows service mode<\/td><td>Hudson controls a Windows slave as a service<\/td><td>Persistent Windows build hosts<\/td><td>Service setup and permissions must be managed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Original screenshots referenced in the source article: <a href=\"http:\/\/3.bp.blogspot.com\/_dWL7A18AuFA\/S3p7yGMyE4I\/AAAAAAAABEo\/h6x1l2oCndM\/s640\/hudson-slave-modes.png\">slave launch modes<\/a> and <a href=\"http:\/\/3.bp.blogspot.com\/_dWL7A18AuFA\/S3qBFN_G-CI\/AAAAAAAABEw\/GYdxfv2w__4\/s400\/hudson-slave-2.png\">slave configuration parameters<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Practical setup examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Unix slave via SSH<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>In Hudson, go to <em>Manage Hudson<\/em> and then <em>Manage Nodes<\/em>.<\/li><li>Create a new node and select SSH-based launch.<\/li><li>Provide host, user, and credentials (password or key-based auth).<\/li><li>If using keys, ensure the public key is present in <code>~\/.ssh\/authorized_keys<\/code> on the slave.<\/li><\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ssh-copy-id<\/span> <span class=\"hljs-selector-tag\">hudson<\/span><span class=\"hljs-keyword\">@slave-host<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">JNLP \/ Java Web Start startup<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">From the slave machine, open the master-provided JAR location and launch the agent through the JNLP flow.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">curl -O http:<span class=\"hljs-comment\">\/\/masterserver:port\/hudson\/jnlpJars\/slave.jar<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Headless JNLP launch<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The source article provides this daemon-friendly pattern. Replace <code>slave-name<\/code> with the node name configured in Hudson.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">java -jar slave.jar -jnlpUrl http:<span class=\"hljs-comment\">\/\/yourserver:port\/computer\/slave-name\/slave-agent.jnlp<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Custom script launch from master<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If built-in modes do not fit, Hudson can run a custom command on the master to establish the remote session and start the agent process.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">ssh myslave java -jar ~<span class=\"hljs-regexp\">\/bin\/<\/span>slave.jar<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For this mode, standard input and output are expected to remain connected correctly between master and agent startup command.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls in legacy Hudson node setups<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Network direction mismatch:<\/strong> SSH launch needs master-to-slave access; JNLP depends on slave-to-master reachability.<\/li><li><strong>Node naming errors:<\/strong> Incorrect <code>slave-name<\/code> in JNLP URLs prevents agent registration.<\/li><li><strong>Agent resilience gaps:<\/strong> Browser-launched agents may not restart automatically after host reboot.<\/li><li><strong>Credential drift:<\/strong> Expired keys or changed passwords break SSH-based startup.<\/li><li><strong>Resource contention:<\/strong> Using a user desktop as a slave can impact interactive workload during heavy builds.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The original article also notes Hudson commonly running on port <code>8080<\/code> by default and being manageable without superuser privileges, but these should be validated against your actual installation and service model.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how Hudson distributes builds between a master and one or more slave nodes, and how to launch agents using SSH, JNLP, scripts, or Windows service mode. This revised guide clarifies the execution flow, configuration options, and common pitfalls in legacy Hudson environments.<\/p>\n","protected":false},"author":1,"featured_media":4420,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[1122,3113,429,4249,4244,4250,919,4246,4248,4240,593,230,4247,4245,732,213,1452],"class_list":["post-280","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-guide","tag-how-to","tag-hudson","tag-hudson-master-slave-configuration","tag-hudson-master-slave-setup","tag-hudson-master-slave-setup-guide","tag-instructions","tag-master-slave-setup","tag-master-slave-hudson","tag-method","tag-process","tag-setup","tag-slave-agents-setup-method","tag-slave-setup","tag-steps","tag-tutorial","tag-ways"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=280"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/280\/revisions"}],"predecessor-version":[{"id":79108,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/280\/revisions\/79108"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4420"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}