blob: 9e27f8721372322ea1e1bde526c1f6439c27dcf4 [file] [log] [blame]
James E. Blaircdd00072012-06-08 19:17:28 -07001:title: Launchers
2
James E. Blair1f4c2bb2013-04-26 08:40:46 -07003.. _Gearman: http://gearman.org/
Antoine Mussod06f2a62012-11-16 17:40:58 +01004
James E. Blair1f4c2bb2013-04-26 08:40:46 -07005.. _`Gearman Plugin`:
6 https://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin
7
8.. _launchers:
Antoine Mussod06f2a62012-11-16 17:40:58 +01009
James E. Blaircdd00072012-06-08 19:17:28 -070010Launchers
11=========
12
James E. Blair1f4c2bb2013-04-26 08:40:46 -070013Zuul has a modular architecture for launching jobs. Currently, the
14only supported module interfaces with Gearman_. This design allows
15any system to run jobs for Zuul simply by interfacing with a Gearman
16server. The recommended way of integrating a new job-runner with Zuul
17is via this method.
James E. Blaircdd00072012-06-08 19:17:28 -070018
James E. Blair1f4c2bb2013-04-26 08:40:46 -070019If Gearman is unsuitable, Zuul may be extended with a new launcher
20module. Zuul makes very few assumptions about the interface to a
21launcher -- if it can trigger jobs, cancel them, and receive success
22or failure reports, it should be able to be used with Zuul. Patches
23to this effect are welcome.
24
25Gearman
James E. Blaircdd00072012-06-08 19:17:28 -070026-------
27
James E. Blair1f4c2bb2013-04-26 08:40:46 -070028Gearman_ is a general-purpose protocol for distributing jobs to any
29number of workers. Zuul works with Gearman by sending specific
30information with job requests to Gearman, and expects certain
31information to be returned on completion. This protocol is described
32in `Zuul-Gearman Protocol`_.
James E. Blaircdd00072012-06-08 19:17:28 -070033
James E. Blair1f4c2bb2013-04-26 08:40:46 -070034The `Gearman Jenkins Plugin`_ makes it easy to use Jenkins with Zuul
35by providing an interface between Jenkins and Gearman. In this
36configuration, Zuul asks Gearman to run jobs, and Gearman can then
37distribute those jobs to any number of Jenkins systems (including
38multiple Jenkins masters).
James E. Blaircdd00072012-06-08 19:17:28 -070039
James E. Blair1f4c2bb2013-04-26 08:40:46 -070040In order for Zuul to run any jobs, you will need a running Gearman
James E. Blair77cc7b82013-07-15 13:22:37 -070041server. Zuul includes a Gearman server, and it is recommended that it
42be used as it supports the following features needed by Zuul:
43
44* Canceling jobs in the queue (admin protocol command "cancel job").
45* Strict FIFO queue operation (gearmand's round-robin mode may be
46 sufficient, but is untested).
47
48To enable the built-in server, see the ``gearman_server`` section of
49``zuul.conf``. Be sure that the host allows connections from Zuul and
50any workers (e.g., Jenkins masters) on TCP port 4730, and nowhere else
James E. Blair1f4c2bb2013-04-26 08:40:46 -070051(as the Gearman protocol does not include any provision for
Michael Prokop526926a2013-10-24 16:16:57 +020052authentication).
James E. Blaircdd00072012-06-08 19:17:28 -070053
James E. Blair1f4c2bb2013-04-26 08:40:46 -070054Gearman Jenkins Plugin
55----------------------
James E. Blaircdd00072012-06-08 19:17:28 -070056
James E. Blair1f4c2bb2013-04-26 08:40:46 -070057The `Gearman Plugin`_ can be installed in Jenkins in order to
58facilitate Jenkins running jobs for Zuul. Install the plugin and
59configure it with the hostname or IP address of your Gearman server
60and the port on which it is listening (4730 by default). It will
61automatically register all known Jenkins jobs as functions that Zuul
62can invoke via Gearman.
James E. Blaircdd00072012-06-08 19:17:28 -070063
James E. Blair1f4c2bb2013-04-26 08:40:46 -070064Any number of masters can be configured in this way, and Gearman will
65distribute jobs to all of them as appropriate.
James E. Blaircdd00072012-06-08 19:17:28 -070066
James E. Blair1f4c2bb2013-04-26 08:40:46 -070067No special Jenkins job configuration is needed to support triggering
68by Zuul.
James E. Blaircdd00072012-06-08 19:17:28 -070069
James E. Blair1f4c2bb2013-04-26 08:40:46 -070070Zuul Parameters
71---------------
James E. Blaircdd00072012-06-08 19:17:28 -070072
James E. Blair1f4c2bb2013-04-26 08:40:46 -070073Zuul will pass some parameters with every job it launches. The
74Gearman Plugin will ensure these are supplied as Jenkins build
75parameters, so they will be available for use in the job configuration
Antoine Mussoe0f5bb42014-03-04 11:30:37 +010076as well as to the running job as environment variables. Builds can
77be triggered either by an action on a change or by a reference update.
78Both events share a common set of parameters and more specific
79parameters as follows:
80
81Common parameters
82~~~~~~~~~~~~~~~~~
James E. Blaircdd00072012-06-08 19:17:28 -070083
James E. Blair81515ad2012-10-01 18:29:08 -070084**ZUUL_UUID**
James E. Blaircdd00072012-06-08 19:17:28 -070085 Zuul provided key to link builds with Gerrit events
James E. Blair81515ad2012-10-01 18:29:08 -070086**ZUUL_REF**
87 Zuul provided ref that includes commit(s) to build
88**ZUUL_COMMIT**
89 The commit SHA1 at the head of ZUUL_REF
James E. Blair81515ad2012-10-01 18:29:08 -070090**ZUUL_PROJECT**
91 The project that triggered this build
92**ZUUL_PIPELINE**
93 The Zuul pipeline that is building this job
Arx Cruzb1b010d2013-10-28 19:49:59 -020094**ZUUL_URL**
Joshua Heskethba8776a2014-01-12 14:35:40 +080095 The url for the zuul server as configured in zuul.conf.
96 A test runner may use this URL as the basis for fetching
Arx Cruzb1b010d2013-10-28 19:49:59 -020097 git commits.
James E. Blaircdd00072012-06-08 19:17:28 -070098
Antoine Mussoe0f5bb42014-03-04 11:30:37 +010099Change related parameters
100~~~~~~~~~~~~~~~~~~~~~~~~~
101
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700102The following additional parameters will only be provided for builds
103associated with changes (i.e., in response to patchset-created or
104comment-added events):
James E. Blaircdd00072012-06-08 19:17:28 -0700105
James E. Blair81515ad2012-10-01 18:29:08 -0700106**ZUUL_BRANCH**
107 The target branch for the change that triggered this build
108**ZUUL_CHANGE**
109 The Gerrit change ID for the change that triggered this build
110**ZUUL_CHANGE_IDS**
111 All of the Gerrit change IDs that are included in this build (useful
112 when the DependentPipelineManager combines changes for testing)
113**ZUUL_PATCHSET**
114 The Gerrit patchset number for the change that triggered this build
James E. Blaircdd00072012-06-08 19:17:28 -0700115
Antoine Mussoe0f5bb42014-03-04 11:30:37 +0100116Reference updated parameters
117~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700119The following additional parameters will only be provided for
James E. Blair81515ad2012-10-01 18:29:08 -0700120post-merge (ref-updated) builds:
James E. Blaircdd00072012-06-08 19:17:28 -0700121
James E. Blair81515ad2012-10-01 18:29:08 -0700122**ZUUL_OLDREV**
123 The SHA1 of the old revision at this ref (recall the ref name is
124 in ZUUL_REF)
125**ZUUL_NEWREV**
126 The SHA1 of the new revision at this ref (recall the ref name is
127 in ZUUL_REF)
128**ZUUL_SHORT_OLDREV**
129 The shortened (7 character) SHA1 of the old revision
130**ZUUL_SHORT_NEWREV**
131 The shortened (7 character) SHA1 of the new revision
James E. Blaircdd00072012-06-08 19:17:28 -0700132
Antoine Mussoe0f5bb42014-03-04 11:30:37 +0100133Unset revisions default to 00000000000000000000000000000000.
134
135Examples:
136
137When a reference is created::
138
139 ZUUL_OLDREV=00000000000000000000000000000000
140 ZUUL_NEWREV=123456789abcdef123456789abcdef12
141 ZUUL_SHORT_OLDREV=0000000
142 ZUUL_SHORT_NEWREV=1234567
143
144When a reference is deleted::
145
146 ZUUL_OLDREV=123456789abcdef123456789abcdef12
147 ZUUL_NEWREV=00000000000000000000000000000000
148 ZUUL_SHORT_OLDREV=1234567
149 ZUUL_SHORT_NEWREV=0000000
150
151And finally a reference being altered::
152
153 ZUUL_OLDREV=123456789abcdef123456789abcdef12
154 ZUUL_NEWREV=abcdef123456789abcdef123456789ab
155 ZUUL_SHORT_OLDREV=1234567
156 ZUUL_SHORT_NEWREV=abcdef1
157
158Your jobs can check whether the parameters are ``000000`` to act
159differently on each kind of event.
160
161Jenkins git plugin configuration
162~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
163
James E. Blair81515ad2012-10-01 18:29:08 -0700164In order to test the correct build, configure the Jenkins Git SCM
165plugin as follows::
James E. Blaircdd00072012-06-08 19:17:28 -0700166
James E. Blair81515ad2012-10-01 18:29:08 -0700167 Source Code Management:
168 Git
169 Repositories:
170 Repository URL: <your Gerrit or Zuul repository URL>
171 Advanced:
172 Refspec: ${ZUUL_REF}
173 Branches to build:
174 Branch Specifier: ${ZUUL_COMMIT}
James E. Blaire2819012013-06-28 17:17:26 -0400175 Advanced:
176 Clean after checkout: True
James E. Blaircdd00072012-06-08 19:17:28 -0700177
James E. Blair81515ad2012-10-01 18:29:08 -0700178That should be sufficient for a job that only builds a single project.
179If you have multiple interrelated projects (i.e., they share a Zuul
180Change Queue) that are built together, you may be able to configure
181the Git plugin to prepare them, or you may chose to use a shell script
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700182instead. As an example, the OpenStack project uses the following
183script to prepare the workspace for its integration testing:
James E. Blair81515ad2012-10-01 18:29:08 -0700184
K Jonathan Harker97e457e2013-02-26 13:29:38 -0800185 https://github.com/openstack-infra/devstack-gate/blob/master/devstack-vm-gate-wrap.sh
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700186
187
188Zuul-Gearman Protocol
189---------------------
190
191This section is only relevant if you intend to implement a new kind of
192worker that runs jobs for Zuul via Gearman. If you just want to use
193Jenkins, see `Gearman Jenkins Plugin`_ instead.
194
195The Zuul protocol as used with Gearman is as follows:
196
197Starting Builds
198~~~~~~~~~~~~~~~
199
200To start a build, Zuul invokes a Gearman function with the following
201format:
202
203 build:FUNCTION_NAME
204
205where **FUNCTION_NAME** is the name of the job that should be run. If
206the job should run on a specific node (or class of node), Zuul will
207instead invoke:
208
209 build:FUNCTION_NAME:NODE_NAME
210
211where **NODE_NAME** is the name or class of node on which the job
212should be run. This can be specified by setting the ZUUL_NODE
Antoine Musso7c5db972013-09-26 11:48:26 +0200213parameter in a parameter-function (see :ref:`includes` section in
214:ref:`zuulconf`).
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700215
216Zuul sends the ZUUL_* parameters described in `Zuul Parameters`_
217encoded in JSON format as the argument included with the
218SUBMIT_JOB_UNIQ request to Gearman. A unique ID (equal to the
219ZUUL_UUID parameter) is also supplied to Gearman, and is accessible as
220an added Gearman parameter with GRAB_JOB_UNIQ.
221
222When a Gearman worker starts running a job for Zuul, it should
223immediately send a WORK_DATA packet with the following information
224encoded in JSON format:
225
James E. Blair3c483cf2013-06-04 16:30:43 -0700226**name**
227 The name of the job.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700228
229**number**
230 The build number (unique to this job).
231
James E. Blair3c483cf2013-06-04 16:30:43 -0700232**manager**
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700233 A unique identifier associated with the Gearman worker that can
234 abort this build. See `Stopping Builds`_ for more information.
235
James E. Blair3c483cf2013-06-04 16:30:43 -0700236**url** (optional)
237 The URL with the status or results of the build. Will be used in
238 the status page and the final report.
239
Joshua Heskethba8776a2014-01-12 14:35:40 +0800240To help with debugging builds a worker may send back some optional
241metadata:
242
243**worker_name** (optional)
244 The name of the worker.
245
246**worker_hostname** (optional)
247 The hostname of the worker.
248
249**worker_ips** (optional)
250 A list of IPs for the worker.
251
252**worker_fqdn** (optional)
253 The FQDN of the worker.
254
255**worker_program** (optional)
256 The program name of the worker. For example Jenkins or turbo-hipster.
257
258**worker_version** (optional)
259 The version of the software running the job.
260
261**worker_extra** (optional)
262 A dictionary of any extra metadata you may want to pass along.
263
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700264It should then immediately send a WORK_STATUS packet with a value of 0
265percent complete. It may then optionally send subsequent WORK_STATUS
266packets with updated completion values.
267
268When the build is complete, it should send a final WORK_DATA packet
269with the following in JSON format:
270
271**result**
272 Either the string 'SUCCESS' if the job succeeded, or any other value
273 that describes the result if the job failed.
274
275Finally, it should send either a WORK_FAIL or WORK_COMPLETE packet as
276appropriate. A WORK_EXCEPTION packet will be interpreted as a
277WORK_FAIL, but the exception will be logged in Zuul's error log.
278
279Stopping Builds
280~~~~~~~~~~~~~~~
281
282If Zuul needs to abort a build already in progress, it will invoke the
283following function through Gearman:
284
James E. Blair3c483cf2013-06-04 16:30:43 -0700285 stop:MANAGER_NAME
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700286
James E. Blair3c483cf2013-06-04 16:30:43 -0700287Where **MANAGER_NAME** is the name of the manager worker supplied in
288the initial WORK_DATA packet when the job started. This is used to
289direct the stop: function invocation to the correct Gearman worker
290that is capable of stopping that particular job. The argument to the
291function should be the following encoded in JSON format:
292
293**name**
294 The job name of the build to stop.
295
296**number**
297 The build number of the build to stop.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700298
299The original job is expected to complete with a WORK_DATA and
300WORK_FAIL packet as described in `Starting Builds`_.
301
302Build Descriptions
303~~~~~~~~~~~~~~~~~~
304
305In order to update the job running system with a description of the
306current state of all related builds, the job runner may optionally
307implement the following Gearman function:
308
James E. Blair3c483cf2013-06-04 16:30:43 -0700309 set_description:MANAGER_NAME
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700310
James E. Blair3c483cf2013-06-04 16:30:43 -0700311Where **MANAGER_NAME** is used as described in `Stopping Builds`_.
312The argument to the function is the following encoded in JSON format:
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700313
James E. Blair3c483cf2013-06-04 16:30:43 -0700314**name**
315 The job name of the build to describe.
316
317**number**
318 The build number of the build to describe.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700319
320**html_description**
321 The description of the build in HTML format.