blob: 72743421f06627190cfdc8dfb493aeb3eee80863 [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
Łukasz Jernaś048acb42014-03-02 18:49:41 +010013 other config files.
James E. Blaircdd00072012-06-08 19:17:28 -070014**layout.yaml**
Łukasz Jernaś048acb42014-03-02 18:49:41 +010015 Project and pipeline configuration -- what Zuul does.
James E. Blaircdd00072012-06-08 19:17:28 -070016**logging.conf**
Łukasz Jernaś048acb42014-03-02 18:49:41 +010017 Python logging config.
James E. Blaircdd00072012-06-08 19:17:28 -070018
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**
Łukasz Jernaś048acb42014-03-02 18:49:41 +010049 Port on which the Gearman server is listening.
James E. Blair1f4c2bb2013-04-26 08:40:46 -070050 ``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**
James E. Blair4076e2b2014-01-28 12:42:20 -080086 Path to layout config file. Used by zuul-server only.
Clark Boylan9b670902012-09-28 13:47:56 -070087 ``layout_config=/etc/zuul/layout.yaml``
88
89**log_config**
James E. Blaira4430132014-02-17 08:32:07 -080090 Path to log config file. Used by zuul-server only.
Clark Boylan9b670902012-09-28 13:47:56 -070091 ``log_config=/etc/zuul/logging.yaml``
92
93**pidfile**
James E. Blaira4430132014-02-17 08:32:07 -080094 Path to PID lock file. Used by zuul-server only.
Clark Boylan9b670902012-09-28 13:47:56 -070095 ``pidfile=/var/run/zuul/zuul.pid``
96
97**state_dir**
James E. Blair4076e2b2014-01-28 12:42:20 -080098 Path to directory that Zuul should save state to. Used by all Zuul
99 commands.
Clark Boylan9b670902012-09-28 13:47:56 -0700100 ``state_dir=/var/lib/zuul``
101
James E. Blair4076e2b2014-01-28 12:42:20 -0800102**report_times**
103 Boolean value (``true`` or ``false``) that determines if Zuul should
104 include elapsed times for each job in the textual report. Used by
105 zuul-server only.
106 ``report_times=true``
107
108**status_url**
109 URL that will be posted in Zuul comments made to Gerrit changes when
110 starting jobs for a change. Used by zuul-server only.
111 ``status_url=https://zuul.example.com/status``
112
113**url_pattern**
114 If you are storing build logs external to the system that originally
115 ran jobs and wish to link to those logs when Zuul makes comments on
116 Gerrit changes for completed jobs this setting configures what the
117 URLs for those links should be. Used by zuul-server only.
118 ``http://logs.example.com/{change.number}/{change.patchset}/{pipeline.name}/{job.name}/{build.number}``
119
120**job_name_in_report**
121 Boolean value (``true`` or ``false``) that indicates whether the
122 job name should be included in the report (normally only the URL
123 is included). Defaults to ``false``. Used by zuul-server only.
124 ``job_name_in_report=true``
125
126merger
127""""""
128
Clark Boylan9b670902012-09-28 13:47:56 -0700129**git_dir**
130 Directory that Zuul should clone local git repositories to.
131 ``git_dir=/var/lib/zuul/git``
132
Paul Belangerb67aba12013-05-13 19:22:14 -0400133**git_user_email**
134 Optional: Value to pass to `git config user.email`.
135 ``git_user_email=zuul@example.com``
136
137**git_user_name**
138 Optional: Value to pass to `git config user.name`.
139 ``git_user_name=zuul``
140
Arx Cruzb1b010d2013-10-28 19:49:59 -0200141**zuul_url**
James E. Blair4076e2b2014-01-28 12:42:20 -0800142 URL of this merger's git repos, accessible to test workers. Usually
143 "http://zuul.example.com/p" or "http://zuul-merger01.example.com/p"
144 depending on whether the merger is co-located with the Zuul server.
Arx Cruzb1b010d2013-10-28 19:49:59 -0200145
James E. Blaira4430132014-02-17 08:32:07 -0800146**log_config**
147 Path to log config file for the merger process.
148 ``log_config=/etc/zuul/logging.yaml``
149
150**pidfile**
151 Path to PID lock file for the merger process.
152 ``pidfile=/var/run/zuul-merger/merger.pid``
153
Joshua Hesketh5fea8672013-08-19 17:32:01 +1000154smtp
155""""
156
157**server**
158 SMTP server hostname or address to use.
159 ``server=localhost``
160
161**default_from**
162 Who the email should appear to be sent from when emailing the report.
163 This can be overridden by individual pipelines.
164 ``default_from=zuul@example.com``
165
166**default_to**
167 Who the report should be emailed to by default.
168 This can be overridden by individual pipelines.
169 ``default_to=you@example.com``
170
James E. Blaircdd00072012-06-08 19:17:28 -0700171layout.yaml
172~~~~~~~~~~~
173
Clark Boylan00635dc2012-09-19 14:03:08 -0700174This is the main configuration file for Zuul, where all of the pipelines
James E. Blaircdd00072012-06-08 19:17:28 -0700175and projects are defined, what tests should be run, and what actions
Clark Boylan00635dc2012-09-19 14:03:08 -0700176Zuul should perform. There are three sections: pipelines, jobs, and
James E. Blaircdd00072012-06-08 19:17:28 -0700177projects.
178
James E. Blaire5a847f2012-07-10 15:29:14 -0700179.. _includes:
180
181Includes
182""""""""
183
184Custom functions to be used in Zuul's configuration may be provided
185using the ``includes`` directive. It accepts a list of files to
186include, and currently supports one type of inclusion, a python file::
187
188 includes:
189 - python-file: local_functions.py
190
191**python-file**
192 The path to a python file. The file will be loaded and objects that
193 it defines will be placed in a special environment which can be
194 referenced in the Zuul configuration. Currently only the
195 parameter-function attribute of a Job uses this feature.
196
Clark Boylan00635dc2012-09-19 14:03:08 -0700197Pipelines
198"""""""""
James E. Blaircdd00072012-06-08 19:17:28 -0700199
Clark Boylan00635dc2012-09-19 14:03:08 -0700200Zuul can have any number of independent pipelines. Whenever a matching
201Gerrit event is found for a pipeline, that event is added to the
202pipeline, and the jobs specified for that pipeline are run. When all
203jobs specified for the pipeline that were triggered by an event are
204completed, Zuul reports back to Gerrit the results.
James E. Blaircdd00072012-06-08 19:17:28 -0700205
Clark Boylan00635dc2012-09-19 14:03:08 -0700206There are no pre-defined pipelines in Zuul, rather you can define
207whatever pipelines you need in the layout file. This is a very flexible
208system that can accommodate many kinds of workflows.
James E. Blaircdd00072012-06-08 19:17:28 -0700209
Clark Boylan00635dc2012-09-19 14:03:08 -0700210Here is a quick example of a pipeline definition followed by an
James E. Blaircdd00072012-06-08 19:17:28 -0700211explanation of each of the parameters::
212
213 - name: check
Clark Boylan00635dc2012-09-19 14:03:08 -0700214 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700215 trigger:
James E. Blair6c358e72013-07-29 17:06:47 -0700216 gerrit:
217 - event: patchset-created
James E. Blaircdd00072012-06-08 19:17:28 -0700218 success:
219 verified: 1
220 failure:
221 verified: -1
222
223**name**
224 This is used later in the project definition to indicate what jobs
Clark Boylan00635dc2012-09-19 14:03:08 -0700225 should be run for events in the pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700226
James E. Blair8dbd56a2012-12-22 10:55:10 -0800227**description**
228 This is an optional field that may be used to provide a textual
229 description of the pipeline.
230
James E. Blair56370192013-01-14 15:47:28 -0800231**success-message**
232 An optional field that supplies the introductory text in message
233 reported back to Gerrit when all the voting builds are successful.
234 Defaults to "Build successful."
235
236**failure-message**
237 An optional field that supplies the introductory text in message
238 reported back to Gerrit when at least one voting build fails.
239 Defaults to "Build failed."
240
Joshua Heskethb7179772014-01-30 23:30:46 +1100241**merge-failure-message**
242 An optional field that supplies the introductory text in message
243 reported back to Gerrit when a change fails to merge with the
244 current state of the repository.
245 Defaults to "Merge failed."
246
Joshua Hesketh3979e3e2014-03-04 11:21:10 +1100247**footer-message**
248 An optional field to supply additional information after test results.
249 Useful for adding information about the CI system such as debugging
250 and contact details.
251
James E. Blaircdd00072012-06-08 19:17:28 -0700252**manager**
Clark Boylan00635dc2012-09-19 14:03:08 -0700253 There are currently two schemes for managing pipelines:
James E. Blaircdd00072012-06-08 19:17:28 -0700254
Clark Boylan00635dc2012-09-19 14:03:08 -0700255 *IndependentPipelineManager*
256 Every event in this pipeline should be treated as independent of
257 other events in the pipeline. This is appropriate when the order of
258 events in the pipeline doesn't matter because the results of the
259 actions this pipeline performs can not affect other events in the
260 pipeline. For example, when a change is first uploaded for review,
James E. Blaircdd00072012-06-08 19:17:28 -0700261 you may want to run tests on that change to provide early feedback
262 to reviewers. At the end of the tests, the change is not going to
263 be merged, so it is safe to run these tests in parallel without
Clark Boylan00635dc2012-09-19 14:03:08 -0700264 regard to any other changes in the pipeline. They are independent.
James E. Blaircdd00072012-06-08 19:17:28 -0700265
Clark Boylan00635dc2012-09-19 14:03:08 -0700266 Another type of pipeline that is independent is a post-merge
267 pipeline. In that case, the changes have already merged, so the
268 results can not affect any other events in the pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700269
Clark Boylan00635dc2012-09-19 14:03:08 -0700270 *DependentPipelineManager*
271 The dependent pipeline manager is designed for gating. It ensures
James E. Blaircdd00072012-06-08 19:17:28 -0700272 that every change is tested exactly as it is going to be merged
273 into the repository. An ideal gating system would test one change
274 at a time, applied to the tip of the repository, and only if that
275 change passed tests would it be merged. Then the next change in
276 line would be tested the same way. In order to achieve parallel
Clark Boylan00635dc2012-09-19 14:03:08 -0700277 testing of changes, the dependent pipeline manager performs
James E. Blaircdd00072012-06-08 19:17:28 -0700278 speculative execution on changes. It orders changes based on
Clark Boylan00635dc2012-09-19 14:03:08 -0700279 their entry into the pipeline. It begins testing all changes in
280 parallel, assuming that each change ahead in the pipeline will pass
James E. Blaircdd00072012-06-08 19:17:28 -0700281 its tests. If they all succeed, all the changes can be tested and
Clark Boylan00635dc2012-09-19 14:03:08 -0700282 merged in parallel. If a change near the front of the pipeline
283 fails its tests, each change behind it ignores whatever tests have
284 been completed and are tested again without the change in front.
285 This way gate tests may run in parallel but still be tested
286 correctly, exactly as they will appear in the repository when
287 merged.
James E. Blaircdd00072012-06-08 19:17:28 -0700288
Clark Boylan00635dc2012-09-19 14:03:08 -0700289 One important characteristic of the DependentPipelineManager is that
James E. Blaircdd00072012-06-08 19:17:28 -0700290 it analyzes the jobs that are triggered by different projects, and
291 if those projects have jobs in common, it treats those projects as
292 related, and they share a single virtual queue of changes. Thus,
293 if there is a job that performs integration testing on two
294 projects, those two projects will automatically share a virtual
295 change queue. If a third project does not invoke that job, it
Clark Boylan00635dc2012-09-19 14:03:08 -0700296 will be part of a separate virtual change queue, and changes to
297 it will not depend on changes to the first two jobs.
James E. Blaircdd00072012-06-08 19:17:28 -0700298
299 For more detail on the theory and operation of Zuul's
Clark Boylan00635dc2012-09-19 14:03:08 -0700300 DependentPipelineManager, see: :doc:`gating`.
James E. Blaircdd00072012-06-08 19:17:28 -0700301
302**trigger**
James E. Blair6c358e72013-07-29 17:06:47 -0700303 Exactly one trigger source must be supplied for each pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700304 Triggers are not exclusive -- matching events may be placed in
James E. Blair6c358e72013-07-29 17:06:47 -0700305 multiple pipelines, and they will behave independently in each of
306 the pipelines they match. You may select from the following:
James E. Blaircdd00072012-06-08 19:17:28 -0700307
James E. Blair6c358e72013-07-29 17:06:47 -0700308 **gerrit**
309 This describes what Gerrit events should be placed in the
310 pipeline. Multiple gerrit triggers may be listed. Further
311 parameters describe the kind of events that match:
James E. Blaircdd00072012-06-08 19:17:28 -0700312
James E. Blair6c358e72013-07-29 17:06:47 -0700313 *event*
314 The event name from gerrit. Examples: ``patchset-created``,
315 ``comment-added``, ``ref-updated``. This field is treated as a
316 regular expression.
James E. Blaircdd00072012-06-08 19:17:28 -0700317
James E. Blair6c358e72013-07-29 17:06:47 -0700318 *branch*
319 The branch associated with the event. Example: ``master``. This
320 field is treated as a regular expression, and multiple branches may
321 be listed.
James E. Blaircdd00072012-06-08 19:17:28 -0700322
James E. Blair6c358e72013-07-29 17:06:47 -0700323 *ref*
324 On ref-updated events, the branch parameter is not used, instead the
325 ref is provided. Currently Gerrit has the somewhat idiosyncratic
326 behavior of specifying bare refs for branch names (e.g., ``master``),
327 but full ref names for other kinds of refs (e.g., ``refs/tags/foo``).
328 Zuul matches what you put here exactly against what Gerrit
329 provides. This field is treated as a regular expression, and
330 multiple refs may be listed.
James E. Blaircdd00072012-06-08 19:17:28 -0700331
James E. Blair6c358e72013-07-29 17:06:47 -0700332 *approval*
333 This is only used for ``comment-added`` events. It only matches if
334 the event has a matching approval associated with it. Example:
335 ``code-review: 2`` matches a ``+2`` vote on the code review category.
336 Multiple approvals may be listed.
Antoine Mussob4e809e2012-12-06 16:58:06 +0100337
James E. Blair6c358e72013-07-29 17:06:47 -0700338 *email_filter*
339 This is used for any event. It takes a regex applied on the performer
Michael Prokop526926a2013-10-24 16:16:57 +0200340 email, i.e. Gerrit account email address. If you want to specify
James E. Blair6c358e72013-07-29 17:06:47 -0700341 several email filters, you must use a YAML list. Make sure to use non
342 greedy matchers and to escapes dots!
343 Example: ``email_filter: ^.*?@example\.org$``.
344
Joshua Heskethb8a817e2013-12-27 11:21:38 +1100345 *username_filter*
346 This is used for any event. It takes a regex applied on the performer
347 username, i.e. Gerrit account name. If you want to specify several
348 username filters, you must use a YAML list. Make sure to use non greedy
349 matchers and to escapes dots!
350 Example: ``username_filter: ^jenkins$``.
351
James E. Blair6c358e72013-07-29 17:06:47 -0700352 *comment_filter*
353 This is only used for ``comment-added`` events. It accepts a list of
354 regexes that are searched for in the comment string. If any of these
355 regexes matches a portion of the comment string the trigger is
356 matched. ``comment_filter: retrigger`` will match when comments
357 containing 'retrigger' somewhere in the comment text are added to a
358 change.
Clark Boylanb9bcb402012-06-29 17:44:05 -0700359
James E. Blairc053d022014-01-22 14:57:33 -0800360 *require-approval*
361 This may be used for any event. It requires that a certain kind
362 of approval be present for the current patchset of the change (the
363 approval could be added by the event in question). It takes
364 several sub-parameters, all of which are optional and are combined
365 together so that there must be an approval matching all specified
366 requirements.
367
368 *username*
369 If present, an approval from this username is required.
370
371 *email-filter*
372 If present, an approval with this email address is required. It
373 is treated as a regular expression as above.
374
375 *older-than*
376 If present, the approval must be older than this amount of time
377 to match. Provide a time interval as a number with a suffix of
378 "w" (weeks), "d" (days), "h" (hours), "m" (minutes), "s"
Łukasz Jernaś048acb42014-03-02 18:49:41 +0100379 (seconds). Example ``48h`` or ``2d``.
James E. Blairc053d022014-01-22 14:57:33 -0800380
381 *newer-than*
382 If present, the approval must be newer than this amount of time
383 to match. Same format as "older-than".
384
385 Any other field is interpreted as a review category and value
Łukasz Jernaś048acb42014-03-02 18:49:41 +0100386 pair. For example ``verified: 1`` would require that the approval
James E. Blairc053d022014-01-22 14:57:33 -0800387 be for a +1 vote in the "Verified" column.
388
James E. Blair63bb0ef2013-07-29 17:14:51 -0700389 **timer**
390 This trigger will run based on a cron-style time specification.
391 It will enqueue an event into its pipeline for every project
392 defined in the configuration. Any job associated with the
393 pipeline will run in response to that event.
394
395 *time*
396 The time specification in cron syntax. Only the 5 part syntax is
397 supported, not the symbolic names. Example: ``0 0 * * *`` runs
398 at midnight.
399
400
James E. Blair2fa50962013-01-30 21:50:41 -0800401**dequeue-on-new-patchset**
402 Normally, if a new patchset is uploaded to a change that is in a
403 pipeline, the existing entry in the pipeline will be removed (with
404 jobs canceled and any dependent changes that can no longer merge as
405 well. To suppress this behavior (and allow jobs to continue
406 running), set this to ``false``. Default: ``true``.
407
James E. Blaircdd00072012-06-08 19:17:28 -0700408**success**
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000409 Describes where Zuul should report to if all the jobs complete
410 successfully.
James E. Blaircdd00072012-06-08 19:17:28 -0700411 This section is optional; if it is omitted, Zuul will run jobs and
412 do nothing on success; it will not even report a message to Gerrit.
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000413 If the section is present, the listed reporter plugins will be
414 asked to report on the jobs.
415 Each reporter's value dictionary is handled by the reporter. See
416 reporters for more details.
James E. Blaircdd00072012-06-08 19:17:28 -0700417
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400418**failure**
James E. Blaircdd00072012-06-08 19:17:28 -0700419 Uses the same syntax as **success**, but describes what Zuul should
420 do if at least one job fails.
James E. Blairdc253862012-06-13 17:12:42 -0700421
Joshua Heskethb7179772014-01-30 23:30:46 +1100422**merge-failure**
423 Uses the same syntax as **success**, but describes what Zuul should
424 do if it is unable to merge in the patchset. If no merge-failure
425 reporters are listed then the ``failure`` reporters will be used to
426 notify of unsuccessful merges.
427
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400428**start**
James E. Blairdc253862012-06-13 17:12:42 -0700429 Uses the same syntax as **success**, but describes what Zuul should
Clark Boylan00635dc2012-09-19 14:03:08 -0700430 do when a change is added to the pipeline manager. This can be used,
James E. Blairdc253862012-06-13 17:12:42 -0700431 for example, to reset the value of the Verified review category.
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400432
James E. Blair64ed6f22013-07-10 14:07:23 -0700433**precedence**
434 Indicates how the build scheduler should prioritize jobs for
435 different pipelines. Each pipeline may have one precedence, jobs
436 for pipelines with a higher precedence will be run before ones with
437 lower. The value should be one of ``high``, ``normal``, or ``low``.
438 Default: ``normal``.
439
Clark Boylanc2d19e42014-01-23 14:08:58 -0800440**window**
441 DependentPipelineManagers only. Zuul can rate limit
442 DependentPipelineManagers in a manner similar to TCP flow control.
443 Jobs are only started for changes in the queue if they sit in the
444 actionable window for the pipeline. The initial length of this window
445 is configurable with this value. The value given should be a positive
446 integer value. A value of ``0`` disables rate limiting on the
447 DependentPipelineManager.
448 Default: ``20``.
449
450**window-floor**
451 DependentPipelineManagers only. This is the minimum value for the
452 window described above. Should be a positive non zero integer value.
453 Default: ``3``.
454
455**window-increase-type**
456 DependentPipelineManagers only. This value describes how the window
457 should grow when changes are successfully merged by zuul. A value of
458 ``linear`` indicates that ``window-increase-factor`` should be added
459 to the previous window value. A value of ``exponential`` indicates
460 that ``window-increase-factor`` should be multiplied against the
461 previous window value and the result will become the window size.
462 Default: ``linear``.
463
464**window-increase-factor**
465 DependentPipelineManagers only. The value to be added or mulitplied
466 against the previous window value to determine the new window after
467 successful change merges.
468 Default: ``1``.
469
470**window-decrease-type**
471 DependentPipelineManagers only. This value describes how the window
472 should shrink when changes are not able to be merged by Zuul. A value
473 of ``linear`` indicates that ``window-decrease-factor`` should be
474 subtracted from the previous window value. A value of ``exponential``
475 indicates that ``window-decrease-factor`` should be divided against
476 the previous window value and the result will become the window size.
477 Default: ``exponential``.
478
479**window-decrease-factor**
480 DependentPipelineManagers only. The value to be subtracted or divided
481 against the previous window value to determine the new window after
482 unsuccessful change merges.
483 Default: ``2``.
484
Clark Boylan00635dc2012-09-19 14:03:08 -0700485Some example pipeline configurations are included in the sample layout
486file. The first is called a *check* pipeline::
James E. Blaircdd00072012-06-08 19:17:28 -0700487
488 - name: check
Clark Boylan00635dc2012-09-19 14:03:08 -0700489 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700490 trigger:
491 - event: patchset-created
492 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000493 gerrit:
494 verified: 1
James E. Blaircdd00072012-06-08 19:17:28 -0700495 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000496 gerrit:
497 verified: -1
James E. Blaircdd00072012-06-08 19:17:28 -0700498
499This will trigger jobs each time a new patchset (or change) is
500uploaded to Gerrit, and report +/-1 values to Gerrit in the
501``verified`` review category. ::
502
503 - name: gate
Clark Boylan00635dc2012-09-19 14:03:08 -0700504 manager: DependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700505 trigger:
506 - event: comment-added
507 approval:
508 - approved: 1
509 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000510 gerrit:
511 verified: 2
512 submit: true
James E. Blaircdd00072012-06-08 19:17:28 -0700513 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000514 gerrit:
515 verified: -2
James E. Blaircdd00072012-06-08 19:17:28 -0700516
517This will trigger jobs whenever a reviewer leaves a vote of ``1`` in the
518``approved`` review category in Gerrit (a non-standard category).
519Changes will be tested in such a way as to guarantee that they will be
520merged exactly as tested, though that will happen in parallel by
521creating a virtual queue of dependent changes and performing
522speculative execution of jobs. ::
523
524 - name: post
Clark Boylan00635dc2012-09-19 14:03:08 -0700525 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700526 trigger:
527 - event: ref-updated
528 ref: ^(?!refs/).*$
529
530This will trigger jobs whenever a change is merged to a named branch
531(e.g., ``master``). No output will be reported to Gerrit. This is
532useful for side effects such as creating per-commit tarballs. ::
533
534 - name: silent
Clark Boylan00635dc2012-09-19 14:03:08 -0700535 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700536 trigger:
537 - event: patchset-created
538
539This also triggers jobs when changes are uploaded to Gerrit, but no
540results are reported to Gerrit. This is useful for jobs that are in
Antoine Mussoce333842012-10-16 14:42:35 +0200541development and not yet ready to be presented to developers. ::
542
543 pipelines:
544 - name: post-merge
545 manager: IndependentPipelineManager
546 trigger:
547 - event: change-merged
548 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000549 gerrit:
550 force-message: True
Antoine Mussoce333842012-10-16 14:42:35 +0200551 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000552 gerrit:
553 force-message: True
Antoine Mussoce333842012-10-16 14:42:35 +0200554
555The ``change-merged`` events happen when a change has been merged in the git
556repository. The change is thus closed and Gerrit will not accept modifications
557to the review scoring such as ``code-review`` or ``verified``. By using the
558``force-message: True`` parameter, Zuul will pass ``--force-message`` to the
559``gerrit review`` command, thus making sure the message is actually
560sent back to Gerrit regardless of approval scores.
561That kind of pipeline is nice to run regression or performance tests.
562
563.. note::
564 The ``change-merged`` event does not include the commit sha1 which can be
565 hazardous, it would let you report back to Gerrit though. If you were to
Michael Prokop526926a2013-10-24 16:16:57 +0200566 build a tarball for a specific commit, you should consider instead using
Łukasz Jernaś048acb42014-03-02 18:49:41 +0100567 the ``ref-updated`` event which does include the commit sha1 (but lacks the
Antoine Mussoce333842012-10-16 14:42:35 +0200568 Gerrit change number).
James E. Blaircdd00072012-06-08 19:17:28 -0700569
570Jobs
571""""
572
573The jobs section is optional, and can be used to set attributes of
574jobs that are independent of their association with a project. For
575example, if a job should return a customized message on failure, that
576may be specified here. Otherwise, Zuul does not need to be told about
577each job as it builds a list from the project specification.
578
579**name**
580 The name of the job. This field is treated as a regular expression
581 and will be applied to each job that matches.
582
James E. Blaire5a847f2012-07-10 15:29:14 -0700583**failure-message (optional)**
584 The message that should be reported to Gerrit if the job fails.
James E. Blaircdd00072012-06-08 19:17:28 -0700585
James E. Blaire5a847f2012-07-10 15:29:14 -0700586**success-message (optional)**
587 The message that should be reported to Gerrit if the job fails.
James E. Blaircdd00072012-06-08 19:17:28 -0700588
James E. Blair6aea36d2012-12-17 13:03:24 -0800589**failure-pattern (optional)**
590 The URL that should be reported to Gerrit if the job fails.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700591 Defaults to the build URL or the url_pattern configured in
James E. Blair6aea36d2012-12-17 13:03:24 -0800592 zuul.conf. May be supplied as a string pattern with substitutions
593 as described in url_pattern in :ref:`zuulconf`.
594
595**success-pattern (optional)**
596 The URL that should be reported to Gerrit if the job succeeds.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700597 Defaults to the build URL or the url_pattern configured in
James E. Blair6aea36d2012-12-17 13:03:24 -0800598 zuul.conf. May be supplied as a string pattern with substitutions
599 as described in url_pattern in :ref:`zuulconf`.
600
James E. Blair222d4982012-07-16 09:31:19 -0700601**hold-following-changes (optional)**
602 This is a boolean that indicates that changes that follow this
Clark Boylan00635dc2012-09-19 14:03:08 -0700603 change in a dependent change pipeline should wait until this job
James E. Blair222d4982012-07-16 09:31:19 -0700604 succeeds before launching. If this is applied to a very short job
605 that can predict whether longer jobs will fail early, this can be
606 used to reduce the number of jobs that Zuul will launch and
607 ultimately have to cancel. In that case, a small amount of
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400608 parallelization of jobs is traded for more efficient use of testing
James E. Blair222d4982012-07-16 09:31:19 -0700609 resources. On the other hand, to apply this to a long running job
610 would largely defeat the parallelization of dependent change testing
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400611 that is the main feature of Zuul. Default: ``false``.
James E. Blair222d4982012-07-16 09:31:19 -0700612
James E. Blaire5a847f2012-07-10 15:29:14 -0700613**branch (optional)**
James E. Blaircdd00072012-06-08 19:17:28 -0700614 This job should only be run on matching branches. This field is
615 treated as a regular expression and multiple branches may be
616 listed.
617
James E. Blair70c71582013-03-06 08:50:50 -0800618**files (optional)**
619 This job should only be run if at least one of the files involved in
620 the change (added, deleted, or modified) matches at least one of the
621 file patterns listed here. This field is treated as a regular
622 expression and multiple expressions may be listed.
623
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400624**voting (optional)**
625 Boolean value (``true`` or ``false``) that indicates whatever
626 a job is voting or not. Default: ``true``.
627
James E. Blaire5a847f2012-07-10 15:29:14 -0700628**parameter-function (optional)**
629 Specifies a function that should be applied to the parameters before
630 the job is launched. The function should be defined in a python file
631 included with the :ref:`includes` directive. The function
632 should have the following signature:
633
James E. Blaird0470972013-07-29 10:05:43 -0700634 .. function:: parameters(item, job, parameters)
James E. Blaire5a847f2012-07-10 15:29:14 -0700635
636 Manipulate the parameters passed to a job before a build is
637 launched. The ``parameters`` dictionary will already contain the
638 standard Zuul job parameters, and is expected to be modified
639 in-place.
640
James E. Blaird78576a2013-07-09 10:39:17 -0700641 :param item: the current queue item
642 :type item: zuul.model.QueueItem
James E. Blaird0470972013-07-29 10:05:43 -0700643 :param job: the job about to be run
644 :type job: zuul.model.Job
James E. Blaire5a847f2012-07-10 15:29:14 -0700645 :param parameters: parameters to be passed to the job
646 :type parameters: dict
647
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700648 If the parameter **ZUUL_NODE** is set by this function, then it will
649 be used to specify on what node (or class of node) the job should be
650 run.
651
James E. Blaircdd00072012-06-08 19:17:28 -0700652Here is an example of setting the failure message for jobs that check
653whether a change merges cleanly::
654
655 - name: ^.*-merge$
656 failure-message: This change was unable to be automatically merged
657 with the current state of the repository. Please rebase your
658 change and upload a new patchset.
659
660Projects
661""""""""
662
Clark Boylan00635dc2012-09-19 14:03:08 -0700663The projects section indicates what jobs should be run in each pipeline
James E. Blaircdd00072012-06-08 19:17:28 -0700664for events associated with each project. It contains a list of
665projects. Here is an example::
666
667 - name: example/project
668 check:
669 - project-merge:
670 - project-unittest
Clark Boylan00635dc2012-09-19 14:03:08 -0700671 - project-pep8
672 - project-pyflakes
James E. Blaircdd00072012-06-08 19:17:28 -0700673 gate:
674 - project-merge:
675 - project-unittest
Clark Boylan00635dc2012-09-19 14:03:08 -0700676 - project-pep8
677 - project-pyflakes
James E. Blaircdd00072012-06-08 19:17:28 -0700678 post:
679 - project-publish
680
681**name**
682 The name of the project (as known by Gerrit).
683
James E. Blair19deff22013-08-25 13:17:35 -0700684**merge-mode (optional)**
685 An optional value that indicates what strategy should be used to
686 merge changes to this project. Supported values are:
687
688 ** merge-resolve **
689 Equivalent to 'git merge -s resolve'. This corresponds closely to
690 what Gerrit performs (using JGit) for a project if the "Merge if
691 necessary" merge mode is selected and "Automatically resolve
692 conflicts" is checked. This is the default.
693
694 ** merge **
695 Equivalent to 'git merge'.
696
697 ** cherry-pick **
698 Equivalent to 'git cherry-pick'.
699
Clark Boylan00635dc2012-09-19 14:03:08 -0700700This is followed by a section for each of the pipelines defined above.
701Pipelines may be omitted if no jobs should run for this project in a
702given pipeline. Within the pipeline section, the jobs that should be
James E. Blaircdd00072012-06-08 19:17:28 -0700703executed are listed. If a job is entered as a dictionary key, then
704jobs contained within that key are only executed if the key job
705succeeds. In the above example, project-unittest, project-pep8, and
706project-pyflakes are only executed if project-merge succeeds. This
707can help avoid running unnecessary jobs.
708
James E. Blair18c64442014-03-18 10:14:45 -0700709The special job named ``noop`` is internal to Zuul and will always
710return ``SUCCESS`` immediately. This can be useful if you require
711that all changes be processed by a pipeline but a project has no jobs
712that can be run on it.
713
Paul Belangerffef9e42013-02-11 22:15:18 -0500714.. 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 -0700715
Antoine Musso80edd5a2013-02-13 15:37:53 +0100716Project Templates
717"""""""""""""""""
718
Michael Prokop526926a2013-10-24 16:16:57 +0200719Whenever you have lot of similar projects (such as plugins for a project) you
Antoine Musso80edd5a2013-02-13 15:37:53 +0100720will most probably want to use the same pipeline configurations. The
721project templates let you define pipelines and job name templates to trigger.
722One can then just apply the template on its project which make it easier to
Michael Prokop526926a2013-10-24 16:16:57 +0200723update several similar projects. As an example::
Antoine Musso80edd5a2013-02-13 15:37:53 +0100724
725 project-templates:
726 # Name of the template
727 - name: plugin-triggering
728 # Definition of pipelines just like for a `project`
729 check:
730 - '{jobprefix}-merge':
731 - '{jobprefix}-pep8'
732 - '{jobprefix}-pyflakes'
733 gate:
734 - '{jobprefix}-merge':
735 - '{jobprefix}-unittest'
736 - '{jobprefix}-pep8'
737 - '{jobprefix}-pyflakes'
738
739In your projects definition, you will then apply the template using the template
740key::
741
742 projects:
743 - name: plugin/foobar
744 template:
745 - name: plugin-triggering
746 jobprefix: plugin-foobar
747
James E. Blairaea6cf62013-12-16 15:38:12 -0800748You can pass several parameters to a template. A ``parameter`` value
749will be used for expansion of ``{parameter}`` in the template
750strings. The parameter ``name`` will be automatically provided and
751will contain the short name of the project, that is the portion of the
752project name after the last ``/`` character.
James E. Blaircdd00072012-06-08 19:17:28 -0700753
James E. Blair3e98c022013-12-16 15:25:38 -0800754Multiple templates can be combined in a project, and the jobs from all
755of those templates will be added to the project. Individual jobs may
756also be added::
757
758 projects:
759 - name: plugin/foobar
760 template:
761 - name: plugin-triggering
762 jobprefix: plugin-foobar
763 - name: plugin-extras
764 jobprefix: plugin-foobar
765 check:
766 - foobar-extra-special-job
767
768The order of the jobs listed in the project (which only affects the
769order of jobs listed on the report) will be the jobs from each
770template in the order listed, followed by any jobs individually listed
771for the project.
772
773Note that if multiple templates are used for a project and one
774template specifies a job that is also specified in another template,
775or specified in the project itself, those jobs will be duplicated in
776the resulting project configuration.
777
James E. Blaircdd00072012-06-08 19:17:28 -0700778logging.conf
779~~~~~~~~~~~~
780This file is optional. If provided, it should be a standard
781:mod:`logging.config` module configuration file. If not present, Zuul will
782output all log messages of DEBUG level or higher to the console.
783
784Starting Zuul
785-------------
786
787To start Zuul, run **zuul-server**::
788
Antoine Mussob3aa8282013-04-19 15:16:59 +0200789 usage: zuul-server [-h] [-c CONFIG] [-l LAYOUT] [-d] [-t] [--version]
James E. Blaircdd00072012-06-08 19:17:28 -0700790
791 Project gating system.
792
793 optional arguments:
794 -h, --help show this help message and exit
795 -c CONFIG specify the config file
Antoine Mussob3aa8282013-04-19 15:16:59 +0200796 -l LAYOUT specify the layout file
James E. Blaircdd00072012-06-08 19:17:28 -0700797 -d do not run as a daemon
Antoine Mussob3aa8282013-04-19 15:16:59 +0200798 -t validate layout file syntax
799 --version show zuul version
James E. Blaircdd00072012-06-08 19:17:28 -0700800
801You may want to use the ``-d`` argument while you are initially setting
802up Zuul so you can detect any configuration errors quickly. Under
803normal operation, omit ``-d`` and let Zuul run as a daemon.
804
805If you send signal 1 (SIGHUP) to the zuul-server process, Zuul will
806stop executing new jobs, wait until all executing jobs are finished,
807reload its configuration, and resume. Any values in any of the
808configuration files may be changed, except the location of Zuul's PID
809file (a change to that will be ignored until Zuul is restarted).
Clark Boylanf231fa22013-02-08 12:28:53 -0800810
811If you send a SIGUSR1 to the zuul-server process, Zuul will stop
812executing new jobs, wait until all executing jobs are finished,
813then exit. While waiting to exit Zuul will queue Gerrit events and
814save these events prior to exiting. When Zuul starts again it will
815read these saved events and act on them.
Jeremy Stanley93e05f42013-03-08 17:29:17 +0000816
Michael Prokop526926a2013-10-24 16:16:57 +0200817If you need to abort Zuul and intend to manually requeue changes for
Jeremy Stanley93e05f42013-03-08 17:29:17 +0000818jobs which were running in its pipelines, prior to terminating you can
819use the zuul-changes.py tool script to simplify the process. For
820example, this would give you a list of Gerrit commands to reverify or
821recheck changes for the gate and check pipelines respectively::
822
823 ./tools/zuul-changes.py --review-host=review.openstack.org \
824 http://zuul.openstack.org/ gate 'reverify no bug'
825 ./tools/zuul-changes.py --review-host=review.openstack.org \
826 http://zuul.openstack.org/ check 'recheck no bug'
Clark Boylanfba9b242013-08-20 10:11:17 -0700827
828If you send a SIGUSR2 to the zuul-server process, Zuul will dump a stack
829trace for each running thread into its debug log. This is useful for
830tracking down deadlock or otherwise slow threads.