blob: ef8c6e91f267421f4045bf4fe0de70e17024606a [file] [log] [blame]
James E. Blaircdd00072012-06-08 19:17:28 -07001:title: Zuul
2
3Zuul
4====
5
6Configuration
7-------------
8
9Zuul has three configuration files:
10
11**zuul.conf**
James E. Blair1f4c2bb2013-04-26 08:40:46 -070012 Connection information for Gerrit and Gearman, locations of the
13 other config files
James E. Blaircdd00072012-06-08 19:17:28 -070014**layout.yaml**
Clark Boylan00635dc2012-09-19 14:03:08 -070015 Project and pipeline configuration -- what Zuul does
James E. Blaircdd00072012-06-08 19:17:28 -070016**logging.conf**
17 Python logging config
18
19Examples of each of the three files can be found in the etc/ directory
20of the source distribution.
21
James E. Blair6aea36d2012-12-17 13:03:24 -080022.. _zuulconf:
23
James E. Blaircdd00072012-06-08 19:17:28 -070024zuul.conf
25~~~~~~~~~
26
27Zuul will look for ``/etc/zuul/zuul.conf`` or ``~/zuul.conf`` to
28bootstrap its configuration. Alternately, you may specify ``-c
29/path/to/zuul.conf`` on the command line.
30
James E. Blair1f4c2bb2013-04-26 08:40:46 -070031Gerrit and Gearman connection information are each described in a
32section of zuul.conf. The location of the other two configuration
33files (as well as the location of the PID file when running Zuul as a
34server) are specified in a third section.
James E. Blaircdd00072012-06-08 19:17:28 -070035
Clark Boylan9b670902012-09-28 13:47:56 -070036The three sections of this config and their options are documented below.
37You can also find an example zuul.conf file in the git
38`repository
K Jonathan Harker97e457e2013-02-26 13:29:38 -080039<https://github.com/openstack-infra/zuul/blob/master/etc/zuul.conf-sample>`_
Clark Boylan9b670902012-09-28 13:47:56 -070040
James E. Blair1f4c2bb2013-04-26 08:40:46 -070041gearman
Clark Boylan9b670902012-09-28 13:47:56 -070042"""""""
43
44**server**
James E. Blair1f4c2bb2013-04-26 08:40:46 -070045 Hostname or IP address of the Gearman server.
46 ``server=gearman.example.com``
Clark Boylan9b670902012-09-28 13:47:56 -070047
James E. Blair1f4c2bb2013-04-26 08:40:46 -070048**port**
49 Port on which the Gearman server is listening
50 ``port=4730``
Clark Boylan9b670902012-09-28 13:47:56 -070051
James E. Blair77cc7b82013-07-15 13:22:37 -070052gearman_server
53""""""""""""""
54
55**start**
56 Whether to start the internal Gearman server (default: False).
57 ``start=true``
58
59**log_config**
60 Path to log config file for internal Gearman server.
61 ``log_config=/etc/zuul/gearman-logging.yaml``
62
Clark Boylan9b670902012-09-28 13:47:56 -070063gerrit
64""""""
65
66**server**
67 FQDN of Gerrit server.
68 ``server=review.example.com``
69
Antoine Musso27475012012-11-26 09:53:01 +010070**baseurl**
71 Optional: path to Gerrit web interface. Defaults to ``https://<value
72 of server>/``. ``baseurl=https://review.example.com/review_site/``
73
Clark Boylan9b670902012-09-28 13:47:56 -070074**user**
75 User name to use when logging into above server via ssh.
James E. Blair1f4c2bb2013-04-26 08:40:46 -070076 ``user=zuul``
Clark Boylan9b670902012-09-28 13:47:56 -070077
78**sshkey**
79 Path to SSH key to use when logging into above server.
James E. Blair1f4c2bb2013-04-26 08:40:46 -070080 ``sshkey=/home/zuul/.ssh/id_rsa``
Clark Boylan9b670902012-09-28 13:47:56 -070081
82zuul
83""""
84
85**layout_config**
86 Path to layout config file.
87 ``layout_config=/etc/zuul/layout.yaml``
88
89**log_config**
90 Path to log config file.
91 ``log_config=/etc/zuul/logging.yaml``
92
93**pidfile**
94 Path to PID lock file.
95 ``pidfile=/var/run/zuul/zuul.pid``
96
97**state_dir**
98 Path to directory that Zuul should save state to.
99 ``state_dir=/var/lib/zuul``
100
101**git_dir**
102 Directory that Zuul should clone local git repositories to.
103 ``git_dir=/var/lib/zuul/git``
104
Paul Belangerb67aba12013-05-13 19:22:14 -0400105**git_user_email**
106 Optional: Value to pass to `git config user.email`.
107 ``git_user_email=zuul@example.com``
108
109**git_user_name**
110 Optional: Value to pass to `git config user.name`.
111 ``git_user_name=zuul``
112
James E. Blair0ac6c012013-04-26 09:04:23 -0700113**report_times**
114 Boolean value (``true`` or ``false``) that determines if Zuul should
115 include elapsed times for each job in the textual report.
116 ``report_times=true``
117
Clark Boylan9b670902012-09-28 13:47:56 -0700118**status_url**
119 URL that will be posted in Zuul comments made to Gerrit changes when
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700120 starting jobs for a change.
121 ``status_url=https://zuul.example.com/status``
Clark Boylan9b670902012-09-28 13:47:56 -0700122
123**url_pattern**
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700124 If you are storing build logs external to the system that originally
125 ran jobs and wish to link to those logs when Zuul makes comments on
126 Gerrit changes for completed jobs this setting configures what the
127 URLs for those links should be.
Clark Boylan9b670902012-09-28 13:47:56 -0700128 ``http://logs.example.com/{change.number}/{change.patchset}/{pipeline.name}/{job.name}/{build.number}``
129
James E. Blair8fef52b2013-08-17 17:32:50 -0700130**job_name_in_report**
131 Boolean value (``true`` or ``false``) that indicates whether the
132 job name should be included in the report (normally only the URL
133 is included). Defaults to ``false``.
134 ``job_name_in_report=true``
135
Arx Cruzb1b010d2013-10-28 19:49:59 -0200136**zuul_url**
137 URL of Zuul's git repos, accessible to test workers.
138 Usually "http://zuul.example.com/p".
139
Joshua Hesketh5fea8672013-08-19 17:32:01 +1000140smtp
141""""
142
143**server**
144 SMTP server hostname or address to use.
145 ``server=localhost``
146
147**default_from**
148 Who the email should appear to be sent from when emailing the report.
149 This can be overridden by individual pipelines.
150 ``default_from=zuul@example.com``
151
152**default_to**
153 Who the report should be emailed to by default.
154 This can be overridden by individual pipelines.
155 ``default_to=you@example.com``
156
James E. Blaircdd00072012-06-08 19:17:28 -0700157layout.yaml
158~~~~~~~~~~~
159
Clark Boylan00635dc2012-09-19 14:03:08 -0700160This is the main configuration file for Zuul, where all of the pipelines
James E. Blaircdd00072012-06-08 19:17:28 -0700161and projects are defined, what tests should be run, and what actions
Clark Boylan00635dc2012-09-19 14:03:08 -0700162Zuul should perform. There are three sections: pipelines, jobs, and
James E. Blaircdd00072012-06-08 19:17:28 -0700163projects.
164
James E. Blaire5a847f2012-07-10 15:29:14 -0700165.. _includes:
166
167Includes
168""""""""
169
170Custom functions to be used in Zuul's configuration may be provided
171using the ``includes`` directive. It accepts a list of files to
172include, and currently supports one type of inclusion, a python file::
173
174 includes:
175 - python-file: local_functions.py
176
177**python-file**
178 The path to a python file. The file will be loaded and objects that
179 it defines will be placed in a special environment which can be
180 referenced in the Zuul configuration. Currently only the
181 parameter-function attribute of a Job uses this feature.
182
Clark Boylan00635dc2012-09-19 14:03:08 -0700183Pipelines
184"""""""""
James E. Blaircdd00072012-06-08 19:17:28 -0700185
Clark Boylan00635dc2012-09-19 14:03:08 -0700186Zuul can have any number of independent pipelines. Whenever a matching
187Gerrit event is found for a pipeline, that event is added to the
188pipeline, and the jobs specified for that pipeline are run. When all
189jobs specified for the pipeline that were triggered by an event are
190completed, Zuul reports back to Gerrit the results.
James E. Blaircdd00072012-06-08 19:17:28 -0700191
Clark Boylan00635dc2012-09-19 14:03:08 -0700192There are no pre-defined pipelines in Zuul, rather you can define
193whatever pipelines you need in the layout file. This is a very flexible
194system that can accommodate many kinds of workflows.
James E. Blaircdd00072012-06-08 19:17:28 -0700195
Clark Boylan00635dc2012-09-19 14:03:08 -0700196Here is a quick example of a pipeline definition followed by an
James E. Blaircdd00072012-06-08 19:17:28 -0700197explanation of each of the parameters::
198
199 - name: check
Clark Boylan00635dc2012-09-19 14:03:08 -0700200 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700201 trigger:
James E. Blair6c358e72013-07-29 17:06:47 -0700202 gerrit:
203 - event: patchset-created
James E. Blaircdd00072012-06-08 19:17:28 -0700204 success:
205 verified: 1
206 failure:
207 verified: -1
208
209**name**
210 This is used later in the project definition to indicate what jobs
Clark Boylan00635dc2012-09-19 14:03:08 -0700211 should be run for events in the pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700212
James E. Blair8dbd56a2012-12-22 10:55:10 -0800213**description**
214 This is an optional field that may be used to provide a textual
215 description of the pipeline.
216
James E. Blair56370192013-01-14 15:47:28 -0800217**success-message**
218 An optional field that supplies the introductory text in message
219 reported back to Gerrit when all the voting builds are successful.
220 Defaults to "Build successful."
221
222**failure-message**
223 An optional field that supplies the introductory text in message
224 reported back to Gerrit when at least one voting build fails.
225 Defaults to "Build failed."
226
James E. Blaircdd00072012-06-08 19:17:28 -0700227**manager**
Clark Boylan00635dc2012-09-19 14:03:08 -0700228 There are currently two schemes for managing pipelines:
James E. Blaircdd00072012-06-08 19:17:28 -0700229
Clark Boylan00635dc2012-09-19 14:03:08 -0700230 *IndependentPipelineManager*
231 Every event in this pipeline should be treated as independent of
232 other events in the pipeline. This is appropriate when the order of
233 events in the pipeline doesn't matter because the results of the
234 actions this pipeline performs can not affect other events in the
235 pipeline. For example, when a change is first uploaded for review,
James E. Blaircdd00072012-06-08 19:17:28 -0700236 you may want to run tests on that change to provide early feedback
237 to reviewers. At the end of the tests, the change is not going to
238 be merged, so it is safe to run these tests in parallel without
Clark Boylan00635dc2012-09-19 14:03:08 -0700239 regard to any other changes in the pipeline. They are independent.
James E. Blaircdd00072012-06-08 19:17:28 -0700240
Clark Boylan00635dc2012-09-19 14:03:08 -0700241 Another type of pipeline that is independent is a post-merge
242 pipeline. In that case, the changes have already merged, so the
243 results can not affect any other events in the pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700244
Clark Boylan00635dc2012-09-19 14:03:08 -0700245 *DependentPipelineManager*
246 The dependent pipeline manager is designed for gating. It ensures
James E. Blaircdd00072012-06-08 19:17:28 -0700247 that every change is tested exactly as it is going to be merged
248 into the repository. An ideal gating system would test one change
249 at a time, applied to the tip of the repository, and only if that
250 change passed tests would it be merged. Then the next change in
251 line would be tested the same way. In order to achieve parallel
Clark Boylan00635dc2012-09-19 14:03:08 -0700252 testing of changes, the dependent pipeline manager performs
James E. Blaircdd00072012-06-08 19:17:28 -0700253 speculative execution on changes. It orders changes based on
Clark Boylan00635dc2012-09-19 14:03:08 -0700254 their entry into the pipeline. It begins testing all changes in
255 parallel, assuming that each change ahead in the pipeline will pass
James E. Blaircdd00072012-06-08 19:17:28 -0700256 its tests. If they all succeed, all the changes can be tested and
Clark Boylan00635dc2012-09-19 14:03:08 -0700257 merged in parallel. If a change near the front of the pipeline
258 fails its tests, each change behind it ignores whatever tests have
259 been completed and are tested again without the change in front.
260 This way gate tests may run in parallel but still be tested
261 correctly, exactly as they will appear in the repository when
262 merged.
James E. Blaircdd00072012-06-08 19:17:28 -0700263
Clark Boylan00635dc2012-09-19 14:03:08 -0700264 One important characteristic of the DependentPipelineManager is that
James E. Blaircdd00072012-06-08 19:17:28 -0700265 it analyzes the jobs that are triggered by different projects, and
266 if those projects have jobs in common, it treats those projects as
267 related, and they share a single virtual queue of changes. Thus,
268 if there is a job that performs integration testing on two
269 projects, those two projects will automatically share a virtual
270 change queue. If a third project does not invoke that job, it
Clark Boylan00635dc2012-09-19 14:03:08 -0700271 will be part of a separate virtual change queue, and changes to
272 it will not depend on changes to the first two jobs.
James E. Blaircdd00072012-06-08 19:17:28 -0700273
274 For more detail on the theory and operation of Zuul's
Clark Boylan00635dc2012-09-19 14:03:08 -0700275 DependentPipelineManager, see: :doc:`gating`.
James E. Blaircdd00072012-06-08 19:17:28 -0700276
277**trigger**
James E. Blair6c358e72013-07-29 17:06:47 -0700278 Exactly one trigger source must be supplied for each pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700279 Triggers are not exclusive -- matching events may be placed in
James E. Blair6c358e72013-07-29 17:06:47 -0700280 multiple pipelines, and they will behave independently in each of
281 the pipelines they match. You may select from the following:
James E. Blaircdd00072012-06-08 19:17:28 -0700282
James E. Blair6c358e72013-07-29 17:06:47 -0700283 **gerrit**
284 This describes what Gerrit events should be placed in the
285 pipeline. Multiple gerrit triggers may be listed. Further
286 parameters describe the kind of events that match:
James E. Blaircdd00072012-06-08 19:17:28 -0700287
James E. Blair6c358e72013-07-29 17:06:47 -0700288 *event*
289 The event name from gerrit. Examples: ``patchset-created``,
290 ``comment-added``, ``ref-updated``. This field is treated as a
291 regular expression.
James E. Blaircdd00072012-06-08 19:17:28 -0700292
James E. Blair6c358e72013-07-29 17:06:47 -0700293 *branch*
294 The branch associated with the event. Example: ``master``. This
295 field is treated as a regular expression, and multiple branches may
296 be listed.
James E. Blaircdd00072012-06-08 19:17:28 -0700297
James E. Blair6c358e72013-07-29 17:06:47 -0700298 *ref*
299 On ref-updated events, the branch parameter is not used, instead the
300 ref is provided. Currently Gerrit has the somewhat idiosyncratic
301 behavior of specifying bare refs for branch names (e.g., ``master``),
302 but full ref names for other kinds of refs (e.g., ``refs/tags/foo``).
303 Zuul matches what you put here exactly against what Gerrit
304 provides. This field is treated as a regular expression, and
305 multiple refs may be listed.
James E. Blaircdd00072012-06-08 19:17:28 -0700306
James E. Blair6c358e72013-07-29 17:06:47 -0700307 *approval*
308 This is only used for ``comment-added`` events. It only matches if
309 the event has a matching approval associated with it. Example:
310 ``code-review: 2`` matches a ``+2`` vote on the code review category.
311 Multiple approvals may be listed.
Antoine Mussob4e809e2012-12-06 16:58:06 +0100312
James E. Blair6c358e72013-07-29 17:06:47 -0700313 *email_filter*
314 This is used for any event. It takes a regex applied on the performer
Michael Prokop526926a2013-10-24 16:16:57 +0200315 email, i.e. Gerrit account email address. If you want to specify
James E. Blair6c358e72013-07-29 17:06:47 -0700316 several email filters, you must use a YAML list. Make sure to use non
317 greedy matchers and to escapes dots!
318 Example: ``email_filter: ^.*?@example\.org$``.
319
Joshua Heskethb8a817e2013-12-27 11:21:38 +1100320 *username_filter*
321 This is used for any event. It takes a regex applied on the performer
322 username, i.e. Gerrit account name. If you want to specify several
323 username filters, you must use a YAML list. Make sure to use non greedy
324 matchers and to escapes dots!
325 Example: ``username_filter: ^jenkins$``.
326
James E. Blair6c358e72013-07-29 17:06:47 -0700327 *comment_filter*
328 This is only used for ``comment-added`` events. It accepts a list of
329 regexes that are searched for in the comment string. If any of these
330 regexes matches a portion of the comment string the trigger is
331 matched. ``comment_filter: retrigger`` will match when comments
332 containing 'retrigger' somewhere in the comment text are added to a
333 change.
Clark Boylanb9bcb402012-06-29 17:44:05 -0700334
James E. Blairc053d022014-01-22 14:57:33 -0800335 *require-approval*
336 This may be used for any event. It requires that a certain kind
337 of approval be present for the current patchset of the change (the
338 approval could be added by the event in question). It takes
339 several sub-parameters, all of which are optional and are combined
340 together so that there must be an approval matching all specified
341 requirements.
342
343 *username*
344 If present, an approval from this username is required.
345
346 *email-filter*
347 If present, an approval with this email address is required. It
348 is treated as a regular expression as above.
349
350 *older-than*
351 If present, the approval must be older than this amount of time
352 to match. Provide a time interval as a number with a suffix of
353 "w" (weeks), "d" (days), "h" (hours), "m" (minutes), "s"
354 (seconds). Example "48h" or "2d".
355
356 *newer-than*
357 If present, the approval must be newer than this amount of time
358 to match. Same format as "older-than".
359
360 Any other field is interpreted as a review category and value
361 pair. For example "verified: 1" would require that the approval
362 be for a +1 vote in the "Verified" column.
363
James E. Blair63bb0ef2013-07-29 17:14:51 -0700364 **timer**
365 This trigger will run based on a cron-style time specification.
366 It will enqueue an event into its pipeline for every project
367 defined in the configuration. Any job associated with the
368 pipeline will run in response to that event.
369
370 *time*
371 The time specification in cron syntax. Only the 5 part syntax is
372 supported, not the symbolic names. Example: ``0 0 * * *`` runs
373 at midnight.
374
375
James E. Blair2fa50962013-01-30 21:50:41 -0800376**dequeue-on-new-patchset**
377 Normally, if a new patchset is uploaded to a change that is in a
378 pipeline, the existing entry in the pipeline will be removed (with
379 jobs canceled and any dependent changes that can no longer merge as
380 well. To suppress this behavior (and allow jobs to continue
381 running), set this to ``false``. Default: ``true``.
382
James E. Blaircdd00072012-06-08 19:17:28 -0700383**success**
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000384 Describes where Zuul should report to if all the jobs complete
385 successfully.
James E. Blaircdd00072012-06-08 19:17:28 -0700386 This section is optional; if it is omitted, Zuul will run jobs and
387 do nothing on success; it will not even report a message to Gerrit.
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000388 If the section is present, the listed reporter plugins will be
389 asked to report on the jobs.
390 Each reporter's value dictionary is handled by the reporter. See
391 reporters for more details.
James E. Blaircdd00072012-06-08 19:17:28 -0700392
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400393**failure**
James E. Blaircdd00072012-06-08 19:17:28 -0700394 Uses the same syntax as **success**, but describes what Zuul should
395 do if at least one job fails.
James E. Blairdc253862012-06-13 17:12:42 -0700396
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400397**start**
James E. Blairdc253862012-06-13 17:12:42 -0700398 Uses the same syntax as **success**, but describes what Zuul should
Clark Boylan00635dc2012-09-19 14:03:08 -0700399 do when a change is added to the pipeline manager. This can be used,
James E. Blairdc253862012-06-13 17:12:42 -0700400 for example, to reset the value of the Verified review category.
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400401
James E. Blair64ed6f22013-07-10 14:07:23 -0700402**precedence**
403 Indicates how the build scheduler should prioritize jobs for
404 different pipelines. Each pipeline may have one precedence, jobs
405 for pipelines with a higher precedence will be run before ones with
406 lower. The value should be one of ``high``, ``normal``, or ``low``.
407 Default: ``normal``.
408
Clark Boylan00635dc2012-09-19 14:03:08 -0700409Some example pipeline configurations are included in the sample layout
410file. The first is called a *check* pipeline::
James E. Blaircdd00072012-06-08 19:17:28 -0700411
412 - name: check
Clark Boylan00635dc2012-09-19 14:03:08 -0700413 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700414 trigger:
415 - event: patchset-created
416 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000417 gerrit:
418 verified: 1
James E. Blaircdd00072012-06-08 19:17:28 -0700419 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000420 gerrit:
421 verified: -1
James E. Blaircdd00072012-06-08 19:17:28 -0700422
423This will trigger jobs each time a new patchset (or change) is
424uploaded to Gerrit, and report +/-1 values to Gerrit in the
425``verified`` review category. ::
426
427 - name: gate
Clark Boylan00635dc2012-09-19 14:03:08 -0700428 manager: DependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700429 trigger:
430 - event: comment-added
431 approval:
432 - approved: 1
433 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000434 gerrit:
435 verified: 2
436 submit: true
James E. Blaircdd00072012-06-08 19:17:28 -0700437 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000438 gerrit:
439 verified: -2
James E. Blaircdd00072012-06-08 19:17:28 -0700440
441This will trigger jobs whenever a reviewer leaves a vote of ``1`` in the
442``approved`` review category in Gerrit (a non-standard category).
443Changes will be tested in such a way as to guarantee that they will be
444merged exactly as tested, though that will happen in parallel by
445creating a virtual queue of dependent changes and performing
446speculative execution of jobs. ::
447
448 - name: post
Clark Boylan00635dc2012-09-19 14:03:08 -0700449 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700450 trigger:
451 - event: ref-updated
452 ref: ^(?!refs/).*$
453
454This will trigger jobs whenever a change is merged to a named branch
455(e.g., ``master``). No output will be reported to Gerrit. This is
456useful for side effects such as creating per-commit tarballs. ::
457
458 - name: silent
Clark Boylan00635dc2012-09-19 14:03:08 -0700459 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700460 trigger:
461 - event: patchset-created
462
463This also triggers jobs when changes are uploaded to Gerrit, but no
464results are reported to Gerrit. This is useful for jobs that are in
Antoine Mussoce333842012-10-16 14:42:35 +0200465development and not yet ready to be presented to developers. ::
466
467 pipelines:
468 - name: post-merge
469 manager: IndependentPipelineManager
470 trigger:
471 - event: change-merged
472 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000473 gerrit:
474 force-message: True
Antoine Mussoce333842012-10-16 14:42:35 +0200475 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000476 gerrit:
477 force-message: True
Antoine Mussoce333842012-10-16 14:42:35 +0200478
479The ``change-merged`` events happen when a change has been merged in the git
480repository. The change is thus closed and Gerrit will not accept modifications
481to the review scoring such as ``code-review`` or ``verified``. By using the
482``force-message: True`` parameter, Zuul will pass ``--force-message`` to the
483``gerrit review`` command, thus making sure the message is actually
484sent back to Gerrit regardless of approval scores.
485That kind of pipeline is nice to run regression or performance tests.
486
487.. note::
488 The ``change-merged`` event does not include the commit sha1 which can be
489 hazardous, it would let you report back to Gerrit though. If you were to
Michael Prokop526926a2013-10-24 16:16:57 +0200490 build a tarball for a specific commit, you should consider instead using
Antoine Mussoce333842012-10-16 14:42:35 +0200491 the ``ref-updated`` event which does include the commit sha1 (but lack the
492 Gerrit change number).
James E. Blaircdd00072012-06-08 19:17:28 -0700493
494Jobs
495""""
496
497The jobs section is optional, and can be used to set attributes of
498jobs that are independent of their association with a project. For
499example, if a job should return a customized message on failure, that
500may be specified here. Otherwise, Zuul does not need to be told about
501each job as it builds a list from the project specification.
502
503**name**
504 The name of the job. This field is treated as a regular expression
505 and will be applied to each job that matches.
506
James E. Blaire5a847f2012-07-10 15:29:14 -0700507**failure-message (optional)**
508 The message that should be reported to Gerrit if the job fails.
James E. Blaircdd00072012-06-08 19:17:28 -0700509
James E. Blaire5a847f2012-07-10 15:29:14 -0700510**success-message (optional)**
511 The message that should be reported to Gerrit if the job fails.
James E. Blaircdd00072012-06-08 19:17:28 -0700512
James E. Blair6aea36d2012-12-17 13:03:24 -0800513**failure-pattern (optional)**
514 The URL that should be reported to Gerrit if the job fails.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700515 Defaults to the build URL or the url_pattern configured in
James E. Blair6aea36d2012-12-17 13:03:24 -0800516 zuul.conf. May be supplied as a string pattern with substitutions
517 as described in url_pattern in :ref:`zuulconf`.
518
519**success-pattern (optional)**
520 The URL that should be reported to Gerrit if the job succeeds.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700521 Defaults to the build URL or the url_pattern configured in
James E. Blair6aea36d2012-12-17 13:03:24 -0800522 zuul.conf. May be supplied as a string pattern with substitutions
523 as described in url_pattern in :ref:`zuulconf`.
524
James E. Blair222d4982012-07-16 09:31:19 -0700525**hold-following-changes (optional)**
526 This is a boolean that indicates that changes that follow this
Clark Boylan00635dc2012-09-19 14:03:08 -0700527 change in a dependent change pipeline should wait until this job
James E. Blair222d4982012-07-16 09:31:19 -0700528 succeeds before launching. If this is applied to a very short job
529 that can predict whether longer jobs will fail early, this can be
530 used to reduce the number of jobs that Zuul will launch and
531 ultimately have to cancel. In that case, a small amount of
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400532 parallelization of jobs is traded for more efficient use of testing
James E. Blair222d4982012-07-16 09:31:19 -0700533 resources. On the other hand, to apply this to a long running job
534 would largely defeat the parallelization of dependent change testing
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400535 that is the main feature of Zuul. Default: ``false``.
James E. Blair222d4982012-07-16 09:31:19 -0700536
James E. Blaire5a847f2012-07-10 15:29:14 -0700537**branch (optional)**
James E. Blaircdd00072012-06-08 19:17:28 -0700538 This job should only be run on matching branches. This field is
539 treated as a regular expression and multiple branches may be
540 listed.
541
James E. Blair70c71582013-03-06 08:50:50 -0800542**files (optional)**
543 This job should only be run if at least one of the files involved in
544 the change (added, deleted, or modified) matches at least one of the
545 file patterns listed here. This field is treated as a regular
546 expression and multiple expressions may be listed.
547
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400548**voting (optional)**
549 Boolean value (``true`` or ``false``) that indicates whatever
550 a job is voting or not. Default: ``true``.
551
James E. Blaire5a847f2012-07-10 15:29:14 -0700552**parameter-function (optional)**
553 Specifies a function that should be applied to the parameters before
554 the job is launched. The function should be defined in a python file
555 included with the :ref:`includes` directive. The function
556 should have the following signature:
557
James E. Blaird0470972013-07-29 10:05:43 -0700558 .. function:: parameters(item, job, parameters)
James E. Blaire5a847f2012-07-10 15:29:14 -0700559
560 Manipulate the parameters passed to a job before a build is
561 launched. The ``parameters`` dictionary will already contain the
562 standard Zuul job parameters, and is expected to be modified
563 in-place.
564
James E. Blaird78576a2013-07-09 10:39:17 -0700565 :param item: the current queue item
566 :type item: zuul.model.QueueItem
James E. Blaird0470972013-07-29 10:05:43 -0700567 :param job: the job about to be run
568 :type job: zuul.model.Job
James E. Blaire5a847f2012-07-10 15:29:14 -0700569 :param parameters: parameters to be passed to the job
570 :type parameters: dict
571
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700572 If the parameter **ZUUL_NODE** is set by this function, then it will
573 be used to specify on what node (or class of node) the job should be
574 run.
575
James E. Blaircdd00072012-06-08 19:17:28 -0700576Here is an example of setting the failure message for jobs that check
577whether a change merges cleanly::
578
579 - name: ^.*-merge$
580 failure-message: This change was unable to be automatically merged
581 with the current state of the repository. Please rebase your
582 change and upload a new patchset.
583
584Projects
585""""""""
586
Clark Boylan00635dc2012-09-19 14:03:08 -0700587The projects section indicates what jobs should be run in each pipeline
James E. Blaircdd00072012-06-08 19:17:28 -0700588for events associated with each project. It contains a list of
589projects. Here is an example::
590
591 - name: example/project
592 check:
593 - project-merge:
594 - project-unittest
Clark Boylan00635dc2012-09-19 14:03:08 -0700595 - project-pep8
596 - project-pyflakes
James E. Blaircdd00072012-06-08 19:17:28 -0700597 gate:
598 - project-merge:
599 - project-unittest
Clark Boylan00635dc2012-09-19 14:03:08 -0700600 - project-pep8
601 - project-pyflakes
James E. Blaircdd00072012-06-08 19:17:28 -0700602 post:
603 - project-publish
604
605**name**
606 The name of the project (as known by Gerrit).
607
James E. Blair19deff22013-08-25 13:17:35 -0700608**merge-mode (optional)**
609 An optional value that indicates what strategy should be used to
610 merge changes to this project. Supported values are:
611
612 ** merge-resolve **
613 Equivalent to 'git merge -s resolve'. This corresponds closely to
614 what Gerrit performs (using JGit) for a project if the "Merge if
615 necessary" merge mode is selected and "Automatically resolve
616 conflicts" is checked. This is the default.
617
618 ** merge **
619 Equivalent to 'git merge'.
620
621 ** cherry-pick **
622 Equivalent to 'git cherry-pick'.
623
Clark Boylan00635dc2012-09-19 14:03:08 -0700624This is followed by a section for each of the pipelines defined above.
625Pipelines may be omitted if no jobs should run for this project in a
626given pipeline. Within the pipeline section, the jobs that should be
James E. Blaircdd00072012-06-08 19:17:28 -0700627executed are listed. If a job is entered as a dictionary key, then
628jobs contained within that key are only executed if the key job
629succeeds. In the above example, project-unittest, project-pep8, and
630project-pyflakes are only executed if project-merge succeeds. This
631can help avoid running unnecessary jobs.
632
Paul Belangerffef9e42013-02-11 22:15:18 -0500633.. seealso:: The OpenStack Zuul configuration for a comprehensive example: https://github.com/openstack-infra/config/blob/master/modules/openstack_project/files/zuul/layout.yaml
James E. Blaircdd00072012-06-08 19:17:28 -0700634
Antoine Musso80edd5a2013-02-13 15:37:53 +0100635Project Templates
636"""""""""""""""""
637
Michael Prokop526926a2013-10-24 16:16:57 +0200638Whenever you have lot of similar projects (such as plugins for a project) you
Antoine Musso80edd5a2013-02-13 15:37:53 +0100639will most probably want to use the same pipeline configurations. The
640project templates let you define pipelines and job name templates to trigger.
641One can then just apply the template on its project which make it easier to
Michael Prokop526926a2013-10-24 16:16:57 +0200642update several similar projects. As an example::
Antoine Musso80edd5a2013-02-13 15:37:53 +0100643
644 project-templates:
645 # Name of the template
646 - name: plugin-triggering
647 # Definition of pipelines just like for a `project`
648 check:
649 - '{jobprefix}-merge':
650 - '{jobprefix}-pep8'
651 - '{jobprefix}-pyflakes'
652 gate:
653 - '{jobprefix}-merge':
654 - '{jobprefix}-unittest'
655 - '{jobprefix}-pep8'
656 - '{jobprefix}-pyflakes'
657
658In your projects definition, you will then apply the template using the template
659key::
660
661 projects:
662 - name: plugin/foobar
663 template:
664 - name: plugin-triggering
665 jobprefix: plugin-foobar
666
James E. Blairaea6cf62013-12-16 15:38:12 -0800667You can pass several parameters to a template. A ``parameter`` value
668will be used for expansion of ``{parameter}`` in the template
669strings. The parameter ``name`` will be automatically provided and
670will contain the short name of the project, that is the portion of the
671project name after the last ``/`` character.
James E. Blaircdd00072012-06-08 19:17:28 -0700672
James E. Blair3e98c022013-12-16 15:25:38 -0800673Multiple templates can be combined in a project, and the jobs from all
674of those templates will be added to the project. Individual jobs may
675also be added::
676
677 projects:
678 - name: plugin/foobar
679 template:
680 - name: plugin-triggering
681 jobprefix: plugin-foobar
682 - name: plugin-extras
683 jobprefix: plugin-foobar
684 check:
685 - foobar-extra-special-job
686
687The order of the jobs listed in the project (which only affects the
688order of jobs listed on the report) will be the jobs from each
689template in the order listed, followed by any jobs individually listed
690for the project.
691
692Note that if multiple templates are used for a project and one
693template specifies a job that is also specified in another template,
694or specified in the project itself, those jobs will be duplicated in
695the resulting project configuration.
696
James E. Blaircdd00072012-06-08 19:17:28 -0700697logging.conf
698~~~~~~~~~~~~
699This file is optional. If provided, it should be a standard
700:mod:`logging.config` module configuration file. If not present, Zuul will
701output all log messages of DEBUG level or higher to the console.
702
703Starting Zuul
704-------------
705
706To start Zuul, run **zuul-server**::
707
Antoine Mussob3aa8282013-04-19 15:16:59 +0200708 usage: zuul-server [-h] [-c CONFIG] [-l LAYOUT] [-d] [-t] [--version]
James E. Blaircdd00072012-06-08 19:17:28 -0700709
710 Project gating system.
711
712 optional arguments:
713 -h, --help show this help message and exit
714 -c CONFIG specify the config file
Antoine Mussob3aa8282013-04-19 15:16:59 +0200715 -l LAYOUT specify the layout file
James E. Blaircdd00072012-06-08 19:17:28 -0700716 -d do not run as a daemon
Antoine Mussob3aa8282013-04-19 15:16:59 +0200717 -t validate layout file syntax
718 --version show zuul version
James E. Blaircdd00072012-06-08 19:17:28 -0700719
720You may want to use the ``-d`` argument while you are initially setting
721up Zuul so you can detect any configuration errors quickly. Under
722normal operation, omit ``-d`` and let Zuul run as a daemon.
723
724If you send signal 1 (SIGHUP) to the zuul-server process, Zuul will
725stop executing new jobs, wait until all executing jobs are finished,
726reload its configuration, and resume. Any values in any of the
727configuration files may be changed, except the location of Zuul's PID
728file (a change to that will be ignored until Zuul is restarted).
Clark Boylanf231fa22013-02-08 12:28:53 -0800729
730If you send a SIGUSR1 to the zuul-server process, Zuul will stop
731executing new jobs, wait until all executing jobs are finished,
732then exit. While waiting to exit Zuul will queue Gerrit events and
733save these events prior to exiting. When Zuul starts again it will
734read these saved events and act on them.
Jeremy Stanley93e05f42013-03-08 17:29:17 +0000735
Michael Prokop526926a2013-10-24 16:16:57 +0200736If you need to abort Zuul and intend to manually requeue changes for
Jeremy Stanley93e05f42013-03-08 17:29:17 +0000737jobs which were running in its pipelines, prior to terminating you can
738use the zuul-changes.py tool script to simplify the process. For
739example, this would give you a list of Gerrit commands to reverify or
740recheck changes for the gate and check pipelines respectively::
741
742 ./tools/zuul-changes.py --review-host=review.openstack.org \
743 http://zuul.openstack.org/ gate 'reverify no bug'
744 ./tools/zuul-changes.py --review-host=review.openstack.org \
745 http://zuul.openstack.org/ check 'recheck no bug'
Clark Boylanfba9b242013-08-20 10:11:17 -0700746
747If you send a SIGUSR2 to the zuul-server process, Zuul will dump a stack
748trace for each running thread into its debug log. This is useful for
749tracking down deadlock or otherwise slow threads.