blob: d2b394ba79e9c2c0b68de28ca4af94c8e314c241 [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. Blair87650fa2014-01-08 11:43:23 +0800157replication
158"""""""""""
159
160Zuul can push the refs it creates to any number of servers. To do so,
161list the git push URLs in this section, one per line as follows::
162
163 [replication]
164 url1=ssh://user@host1.example.com:port/path/to/repo
165 url2=ssh://user@host2.example.com:port/path/to/repo
166
James E. Blaircdd00072012-06-08 19:17:28 -0700167layout.yaml
168~~~~~~~~~~~
169
Clark Boylan00635dc2012-09-19 14:03:08 -0700170This is the main configuration file for Zuul, where all of the pipelines
James E. Blaircdd00072012-06-08 19:17:28 -0700171and projects are defined, what tests should be run, and what actions
Clark Boylan00635dc2012-09-19 14:03:08 -0700172Zuul should perform. There are three sections: pipelines, jobs, and
James E. Blaircdd00072012-06-08 19:17:28 -0700173projects.
174
James E. Blaire5a847f2012-07-10 15:29:14 -0700175.. _includes:
176
177Includes
178""""""""
179
180Custom functions to be used in Zuul's configuration may be provided
181using the ``includes`` directive. It accepts a list of files to
182include, and currently supports one type of inclusion, a python file::
183
184 includes:
185 - python-file: local_functions.py
186
187**python-file**
188 The path to a python file. The file will be loaded and objects that
189 it defines will be placed in a special environment which can be
190 referenced in the Zuul configuration. Currently only the
191 parameter-function attribute of a Job uses this feature.
192
Clark Boylan00635dc2012-09-19 14:03:08 -0700193Pipelines
194"""""""""
James E. Blaircdd00072012-06-08 19:17:28 -0700195
Clark Boylan00635dc2012-09-19 14:03:08 -0700196Zuul can have any number of independent pipelines. Whenever a matching
197Gerrit event is found for a pipeline, that event is added to the
198pipeline, and the jobs specified for that pipeline are run. When all
199jobs specified for the pipeline that were triggered by an event are
200completed, Zuul reports back to Gerrit the results.
James E. Blaircdd00072012-06-08 19:17:28 -0700201
Clark Boylan00635dc2012-09-19 14:03:08 -0700202There are no pre-defined pipelines in Zuul, rather you can define
203whatever pipelines you need in the layout file. This is a very flexible
204system that can accommodate many kinds of workflows.
James E. Blaircdd00072012-06-08 19:17:28 -0700205
Clark Boylan00635dc2012-09-19 14:03:08 -0700206Here is a quick example of a pipeline definition followed by an
James E. Blaircdd00072012-06-08 19:17:28 -0700207explanation of each of the parameters::
208
209 - name: check
Clark Boylan00635dc2012-09-19 14:03:08 -0700210 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700211 trigger:
James E. Blair6c358e72013-07-29 17:06:47 -0700212 gerrit:
213 - event: patchset-created
James E. Blaircdd00072012-06-08 19:17:28 -0700214 success:
215 verified: 1
216 failure:
217 verified: -1
218
219**name**
220 This is used later in the project definition to indicate what jobs
Clark Boylan00635dc2012-09-19 14:03:08 -0700221 should be run for events in the pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700222
James E. Blair8dbd56a2012-12-22 10:55:10 -0800223**description**
224 This is an optional field that may be used to provide a textual
225 description of the pipeline.
226
James E. Blair56370192013-01-14 15:47:28 -0800227**success-message**
228 An optional field that supplies the introductory text in message
229 reported back to Gerrit when all the voting builds are successful.
230 Defaults to "Build successful."
231
232**failure-message**
233 An optional field that supplies the introductory text in message
234 reported back to Gerrit when at least one voting build fails.
235 Defaults to "Build failed."
236
James E. Blaircdd00072012-06-08 19:17:28 -0700237**manager**
Clark Boylan00635dc2012-09-19 14:03:08 -0700238 There are currently two schemes for managing pipelines:
James E. Blaircdd00072012-06-08 19:17:28 -0700239
Clark Boylan00635dc2012-09-19 14:03:08 -0700240 *IndependentPipelineManager*
241 Every event in this pipeline should be treated as independent of
242 other events in the pipeline. This is appropriate when the order of
243 events in the pipeline doesn't matter because the results of the
244 actions this pipeline performs can not affect other events in the
245 pipeline. For example, when a change is first uploaded for review,
James E. Blaircdd00072012-06-08 19:17:28 -0700246 you may want to run tests on that change to provide early feedback
247 to reviewers. At the end of the tests, the change is not going to
248 be merged, so it is safe to run these tests in parallel without
Clark Boylan00635dc2012-09-19 14:03:08 -0700249 regard to any other changes in the pipeline. They are independent.
James E. Blaircdd00072012-06-08 19:17:28 -0700250
Clark Boylan00635dc2012-09-19 14:03:08 -0700251 Another type of pipeline that is independent is a post-merge
252 pipeline. In that case, the changes have already merged, so the
253 results can not affect any other events in the pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700254
Clark Boylan00635dc2012-09-19 14:03:08 -0700255 *DependentPipelineManager*
256 The dependent pipeline manager is designed for gating. It ensures
James E. Blaircdd00072012-06-08 19:17:28 -0700257 that every change is tested exactly as it is going to be merged
258 into the repository. An ideal gating system would test one change
259 at a time, applied to the tip of the repository, and only if that
260 change passed tests would it be merged. Then the next change in
261 line would be tested the same way. In order to achieve parallel
Clark Boylan00635dc2012-09-19 14:03:08 -0700262 testing of changes, the dependent pipeline manager performs
James E. Blaircdd00072012-06-08 19:17:28 -0700263 speculative execution on changes. It orders changes based on
Clark Boylan00635dc2012-09-19 14:03:08 -0700264 their entry into the pipeline. It begins testing all changes in
265 parallel, assuming that each change ahead in the pipeline will pass
James E. Blaircdd00072012-06-08 19:17:28 -0700266 its tests. If they all succeed, all the changes can be tested and
Clark Boylan00635dc2012-09-19 14:03:08 -0700267 merged in parallel. If a change near the front of the pipeline
268 fails its tests, each change behind it ignores whatever tests have
269 been completed and are tested again without the change in front.
270 This way gate tests may run in parallel but still be tested
271 correctly, exactly as they will appear in the repository when
272 merged.
James E. Blaircdd00072012-06-08 19:17:28 -0700273
Clark Boylan00635dc2012-09-19 14:03:08 -0700274 One important characteristic of the DependentPipelineManager is that
James E. Blaircdd00072012-06-08 19:17:28 -0700275 it analyzes the jobs that are triggered by different projects, and
276 if those projects have jobs in common, it treats those projects as
277 related, and they share a single virtual queue of changes. Thus,
278 if there is a job that performs integration testing on two
279 projects, those two projects will automatically share a virtual
280 change queue. If a third project does not invoke that job, it
Clark Boylan00635dc2012-09-19 14:03:08 -0700281 will be part of a separate virtual change queue, and changes to
282 it will not depend on changes to the first two jobs.
James E. Blaircdd00072012-06-08 19:17:28 -0700283
284 For more detail on the theory and operation of Zuul's
Clark Boylan00635dc2012-09-19 14:03:08 -0700285 DependentPipelineManager, see: :doc:`gating`.
James E. Blaircdd00072012-06-08 19:17:28 -0700286
287**trigger**
James E. Blair6c358e72013-07-29 17:06:47 -0700288 Exactly one trigger source must be supplied for each pipeline.
James E. Blaircdd00072012-06-08 19:17:28 -0700289 Triggers are not exclusive -- matching events may be placed in
James E. Blair6c358e72013-07-29 17:06:47 -0700290 multiple pipelines, and they will behave independently in each of
291 the pipelines they match. You may select from the following:
James E. Blaircdd00072012-06-08 19:17:28 -0700292
James E. Blair6c358e72013-07-29 17:06:47 -0700293 **gerrit**
294 This describes what Gerrit events should be placed in the
295 pipeline. Multiple gerrit triggers may be listed. Further
296 parameters describe the kind of events that match:
James E. Blaircdd00072012-06-08 19:17:28 -0700297
James E. Blair6c358e72013-07-29 17:06:47 -0700298 *event*
299 The event name from gerrit. Examples: ``patchset-created``,
300 ``comment-added``, ``ref-updated``. This field is treated as a
301 regular expression.
James E. Blaircdd00072012-06-08 19:17:28 -0700302
James E. Blair6c358e72013-07-29 17:06:47 -0700303 *branch*
304 The branch associated with the event. Example: ``master``. This
305 field is treated as a regular expression, and multiple branches may
306 be listed.
James E. Blaircdd00072012-06-08 19:17:28 -0700307
James E. Blair6c358e72013-07-29 17:06:47 -0700308 *ref*
309 On ref-updated events, the branch parameter is not used, instead the
310 ref is provided. Currently Gerrit has the somewhat idiosyncratic
311 behavior of specifying bare refs for branch names (e.g., ``master``),
312 but full ref names for other kinds of refs (e.g., ``refs/tags/foo``).
313 Zuul matches what you put here exactly against what Gerrit
314 provides. This field is treated as a regular expression, and
315 multiple refs may be listed.
James E. Blaircdd00072012-06-08 19:17:28 -0700316
James E. Blair6c358e72013-07-29 17:06:47 -0700317 *approval*
318 This is only used for ``comment-added`` events. It only matches if
319 the event has a matching approval associated with it. Example:
320 ``code-review: 2`` matches a ``+2`` vote on the code review category.
321 Multiple approvals may be listed.
Antoine Mussob4e809e2012-12-06 16:58:06 +0100322
James E. Blair6c358e72013-07-29 17:06:47 -0700323 *email_filter*
324 This is used for any event. It takes a regex applied on the performer
Michael Prokop526926a2013-10-24 16:16:57 +0200325 email, i.e. Gerrit account email address. If you want to specify
James E. Blair6c358e72013-07-29 17:06:47 -0700326 several email filters, you must use a YAML list. Make sure to use non
327 greedy matchers and to escapes dots!
328 Example: ``email_filter: ^.*?@example\.org$``.
329
Joshua Heskethb8a817e2013-12-27 11:21:38 +1100330 *username_filter*
331 This is used for any event. It takes a regex applied on the performer
332 username, i.e. Gerrit account name. If you want to specify several
333 username filters, you must use a YAML list. Make sure to use non greedy
334 matchers and to escapes dots!
335 Example: ``username_filter: ^jenkins$``.
336
James E. Blair6c358e72013-07-29 17:06:47 -0700337 *comment_filter*
338 This is only used for ``comment-added`` events. It accepts a list of
339 regexes that are searched for in the comment string. If any of these
340 regexes matches a portion of the comment string the trigger is
341 matched. ``comment_filter: retrigger`` will match when comments
342 containing 'retrigger' somewhere in the comment text are added to a
343 change.
Clark Boylanb9bcb402012-06-29 17:44:05 -0700344
James E. Blairc053d022014-01-22 14:57:33 -0800345 *require-approval*
346 This may be used for any event. It requires that a certain kind
347 of approval be present for the current patchset of the change (the
348 approval could be added by the event in question). It takes
349 several sub-parameters, all of which are optional and are combined
350 together so that there must be an approval matching all specified
351 requirements.
352
353 *username*
354 If present, an approval from this username is required.
355
356 *email-filter*
357 If present, an approval with this email address is required. It
358 is treated as a regular expression as above.
359
360 *older-than*
361 If present, the approval must be older than this amount of time
362 to match. Provide a time interval as a number with a suffix of
363 "w" (weeks), "d" (days), "h" (hours), "m" (minutes), "s"
364 (seconds). Example "48h" or "2d".
365
366 *newer-than*
367 If present, the approval must be newer than this amount of time
368 to match. Same format as "older-than".
369
370 Any other field is interpreted as a review category and value
371 pair. For example "verified: 1" would require that the approval
372 be for a +1 vote in the "Verified" column.
373
James E. Blair63bb0ef2013-07-29 17:14:51 -0700374 **timer**
375 This trigger will run based on a cron-style time specification.
376 It will enqueue an event into its pipeline for every project
377 defined in the configuration. Any job associated with the
378 pipeline will run in response to that event.
379
380 *time*
381 The time specification in cron syntax. Only the 5 part syntax is
382 supported, not the symbolic names. Example: ``0 0 * * *`` runs
383 at midnight.
384
385
James E. Blair2fa50962013-01-30 21:50:41 -0800386**dequeue-on-new-patchset**
387 Normally, if a new patchset is uploaded to a change that is in a
388 pipeline, the existing entry in the pipeline will be removed (with
389 jobs canceled and any dependent changes that can no longer merge as
390 well. To suppress this behavior (and allow jobs to continue
391 running), set this to ``false``. Default: ``true``.
392
James E. Blaircdd00072012-06-08 19:17:28 -0700393**success**
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000394 Describes where Zuul should report to if all the jobs complete
395 successfully.
James E. Blaircdd00072012-06-08 19:17:28 -0700396 This section is optional; if it is omitted, Zuul will run jobs and
397 do nothing on success; it will not even report a message to Gerrit.
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000398 If the section is present, the listed reporter plugins will be
399 asked to report on the jobs.
400 Each reporter's value dictionary is handled by the reporter. See
401 reporters for more details.
James E. Blaircdd00072012-06-08 19:17:28 -0700402
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400403**failure**
James E. Blaircdd00072012-06-08 19:17:28 -0700404 Uses the same syntax as **success**, but describes what Zuul should
405 do if at least one job fails.
James E. Blairdc253862012-06-13 17:12:42 -0700406
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400407**start**
James E. Blairdc253862012-06-13 17:12:42 -0700408 Uses the same syntax as **success**, but describes what Zuul should
Clark Boylan00635dc2012-09-19 14:03:08 -0700409 do when a change is added to the pipeline manager. This can be used,
James E. Blairdc253862012-06-13 17:12:42 -0700410 for example, to reset the value of the Verified review category.
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400411
James E. Blair64ed6f22013-07-10 14:07:23 -0700412**precedence**
413 Indicates how the build scheduler should prioritize jobs for
414 different pipelines. Each pipeline may have one precedence, jobs
415 for pipelines with a higher precedence will be run before ones with
416 lower. The value should be one of ``high``, ``normal``, or ``low``.
417 Default: ``normal``.
418
Clark Boylan00635dc2012-09-19 14:03:08 -0700419Some example pipeline configurations are included in the sample layout
420file. The first is called a *check* pipeline::
James E. Blaircdd00072012-06-08 19:17:28 -0700421
422 - name: check
Clark Boylan00635dc2012-09-19 14:03:08 -0700423 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700424 trigger:
425 - event: patchset-created
426 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000427 gerrit:
428 verified: 1
James E. Blaircdd00072012-06-08 19:17:28 -0700429 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000430 gerrit:
431 verified: -1
James E. Blaircdd00072012-06-08 19:17:28 -0700432
433This will trigger jobs each time a new patchset (or change) is
434uploaded to Gerrit, and report +/-1 values to Gerrit in the
435``verified`` review category. ::
436
437 - name: gate
Clark Boylan00635dc2012-09-19 14:03:08 -0700438 manager: DependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700439 trigger:
440 - event: comment-added
441 approval:
442 - approved: 1
443 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000444 gerrit:
445 verified: 2
446 submit: true
James E. Blaircdd00072012-06-08 19:17:28 -0700447 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000448 gerrit:
449 verified: -2
James E. Blaircdd00072012-06-08 19:17:28 -0700450
451This will trigger jobs whenever a reviewer leaves a vote of ``1`` in the
452``approved`` review category in Gerrit (a non-standard category).
453Changes will be tested in such a way as to guarantee that they will be
454merged exactly as tested, though that will happen in parallel by
455creating a virtual queue of dependent changes and performing
456speculative execution of jobs. ::
457
458 - name: post
Clark Boylan00635dc2012-09-19 14:03:08 -0700459 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700460 trigger:
461 - event: ref-updated
462 ref: ^(?!refs/).*$
463
464This will trigger jobs whenever a change is merged to a named branch
465(e.g., ``master``). No output will be reported to Gerrit. This is
466useful for side effects such as creating per-commit tarballs. ::
467
468 - name: silent
Clark Boylan00635dc2012-09-19 14:03:08 -0700469 manager: IndependentPipelineManager
James E. Blaircdd00072012-06-08 19:17:28 -0700470 trigger:
471 - event: patchset-created
472
473This also triggers jobs when changes are uploaded to Gerrit, but no
474results are reported to Gerrit. This is useful for jobs that are in
Antoine Mussoce333842012-10-16 14:42:35 +0200475development and not yet ready to be presented to developers. ::
476
477 pipelines:
478 - name: post-merge
479 manager: IndependentPipelineManager
480 trigger:
481 - event: change-merged
482 success:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000483 gerrit:
484 force-message: True
Antoine Mussoce333842012-10-16 14:42:35 +0200485 failure:
Joshua Hesketh1879cf72013-08-19 14:13:15 +1000486 gerrit:
487 force-message: True
Antoine Mussoce333842012-10-16 14:42:35 +0200488
489The ``change-merged`` events happen when a change has been merged in the git
490repository. The change is thus closed and Gerrit will not accept modifications
491to the review scoring such as ``code-review`` or ``verified``. By using the
492``force-message: True`` parameter, Zuul will pass ``--force-message`` to the
493``gerrit review`` command, thus making sure the message is actually
494sent back to Gerrit regardless of approval scores.
495That kind of pipeline is nice to run regression or performance tests.
496
497.. note::
498 The ``change-merged`` event does not include the commit sha1 which can be
499 hazardous, it would let you report back to Gerrit though. If you were to
Michael Prokop526926a2013-10-24 16:16:57 +0200500 build a tarball for a specific commit, you should consider instead using
Antoine Mussoce333842012-10-16 14:42:35 +0200501 the ``ref-updated`` event which does include the commit sha1 (but lack the
502 Gerrit change number).
James E. Blaircdd00072012-06-08 19:17:28 -0700503
504Jobs
505""""
506
507The jobs section is optional, and can be used to set attributes of
508jobs that are independent of their association with a project. For
509example, if a job should return a customized message on failure, that
510may be specified here. Otherwise, Zuul does not need to be told about
511each job as it builds a list from the project specification.
512
513**name**
514 The name of the job. This field is treated as a regular expression
515 and will be applied to each job that matches.
516
James E. Blaire5a847f2012-07-10 15:29:14 -0700517**failure-message (optional)**
518 The message that should be reported to Gerrit if the job fails.
James E. Blaircdd00072012-06-08 19:17:28 -0700519
James E. Blaire5a847f2012-07-10 15:29:14 -0700520**success-message (optional)**
521 The message that should be reported to Gerrit if the job fails.
James E. Blaircdd00072012-06-08 19:17:28 -0700522
James E. Blair6aea36d2012-12-17 13:03:24 -0800523**failure-pattern (optional)**
524 The URL that should be reported to Gerrit if the job fails.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700525 Defaults to the build URL or the url_pattern configured in
James E. Blair6aea36d2012-12-17 13:03:24 -0800526 zuul.conf. May be supplied as a string pattern with substitutions
527 as described in url_pattern in :ref:`zuulconf`.
528
529**success-pattern (optional)**
530 The URL that should be reported to Gerrit if the job succeeds.
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700531 Defaults to the build URL or the url_pattern configured in
James E. Blair6aea36d2012-12-17 13:03:24 -0800532 zuul.conf. May be supplied as a string pattern with substitutions
533 as described in url_pattern in :ref:`zuulconf`.
534
James E. Blair222d4982012-07-16 09:31:19 -0700535**hold-following-changes (optional)**
536 This is a boolean that indicates that changes that follow this
Clark Boylan00635dc2012-09-19 14:03:08 -0700537 change in a dependent change pipeline should wait until this job
James E. Blair222d4982012-07-16 09:31:19 -0700538 succeeds before launching. If this is applied to a very short job
539 that can predict whether longer jobs will fail early, this can be
540 used to reduce the number of jobs that Zuul will launch and
541 ultimately have to cancel. In that case, a small amount of
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400542 parallelization of jobs is traded for more efficient use of testing
James E. Blair222d4982012-07-16 09:31:19 -0700543 resources. On the other hand, to apply this to a long running job
544 would largely defeat the parallelization of dependent change testing
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400545 that is the main feature of Zuul. Default: ``false``.
James E. Blair222d4982012-07-16 09:31:19 -0700546
James E. Blaire5a847f2012-07-10 15:29:14 -0700547**branch (optional)**
James E. Blaircdd00072012-06-08 19:17:28 -0700548 This job should only be run on matching branches. This field is
549 treated as a regular expression and multiple branches may be
550 listed.
551
James E. Blair70c71582013-03-06 08:50:50 -0800552**files (optional)**
553 This job should only be run if at least one of the files involved in
554 the change (added, deleted, or modified) matches at least one of the
555 file patterns listed here. This field is treated as a regular
556 expression and multiple expressions may be listed.
557
Mathieu Gagnéd6d2a642013-06-11 20:59:58 -0400558**voting (optional)**
559 Boolean value (``true`` or ``false``) that indicates whatever
560 a job is voting or not. Default: ``true``.
561
James E. Blaire5a847f2012-07-10 15:29:14 -0700562**parameter-function (optional)**
563 Specifies a function that should be applied to the parameters before
564 the job is launched. The function should be defined in a python file
565 included with the :ref:`includes` directive. The function
566 should have the following signature:
567
James E. Blaird0470972013-07-29 10:05:43 -0700568 .. function:: parameters(item, job, parameters)
James E. Blaire5a847f2012-07-10 15:29:14 -0700569
570 Manipulate the parameters passed to a job before a build is
571 launched. The ``parameters`` dictionary will already contain the
572 standard Zuul job parameters, and is expected to be modified
573 in-place.
574
James E. Blaird78576a2013-07-09 10:39:17 -0700575 :param item: the current queue item
576 :type item: zuul.model.QueueItem
James E. Blaird0470972013-07-29 10:05:43 -0700577 :param job: the job about to be run
578 :type job: zuul.model.Job
James E. Blaire5a847f2012-07-10 15:29:14 -0700579 :param parameters: parameters to be passed to the job
580 :type parameters: dict
581
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700582 If the parameter **ZUUL_NODE** is set by this function, then it will
583 be used to specify on what node (or class of node) the job should be
584 run.
585
James E. Blaircdd00072012-06-08 19:17:28 -0700586Here is an example of setting the failure message for jobs that check
587whether a change merges cleanly::
588
589 - name: ^.*-merge$
590 failure-message: This change was unable to be automatically merged
591 with the current state of the repository. Please rebase your
592 change and upload a new patchset.
593
594Projects
595""""""""
596
Clark Boylan00635dc2012-09-19 14:03:08 -0700597The projects section indicates what jobs should be run in each pipeline
James E. Blaircdd00072012-06-08 19:17:28 -0700598for events associated with each project. It contains a list of
599projects. Here is an example::
600
601 - name: example/project
602 check:
603 - project-merge:
604 - project-unittest
Clark Boylan00635dc2012-09-19 14:03:08 -0700605 - project-pep8
606 - project-pyflakes
James E. Blaircdd00072012-06-08 19:17:28 -0700607 gate:
608 - project-merge:
609 - project-unittest
Clark Boylan00635dc2012-09-19 14:03:08 -0700610 - project-pep8
611 - project-pyflakes
James E. Blaircdd00072012-06-08 19:17:28 -0700612 post:
613 - project-publish
614
615**name**
616 The name of the project (as known by Gerrit).
617
James E. Blair19deff22013-08-25 13:17:35 -0700618**merge-mode (optional)**
619 An optional value that indicates what strategy should be used to
620 merge changes to this project. Supported values are:
621
622 ** merge-resolve **
623 Equivalent to 'git merge -s resolve'. This corresponds closely to
624 what Gerrit performs (using JGit) for a project if the "Merge if
625 necessary" merge mode is selected and "Automatically resolve
626 conflicts" is checked. This is the default.
627
628 ** merge **
629 Equivalent to 'git merge'.
630
631 ** cherry-pick **
632 Equivalent to 'git cherry-pick'.
633
Clark Boylan00635dc2012-09-19 14:03:08 -0700634This is followed by a section for each of the pipelines defined above.
635Pipelines may be omitted if no jobs should run for this project in a
636given pipeline. Within the pipeline section, the jobs that should be
James E. Blaircdd00072012-06-08 19:17:28 -0700637executed are listed. If a job is entered as a dictionary key, then
638jobs contained within that key are only executed if the key job
639succeeds. In the above example, project-unittest, project-pep8, and
640project-pyflakes are only executed if project-merge succeeds. This
641can help avoid running unnecessary jobs.
642
Paul Belangerffef9e42013-02-11 22:15:18 -0500643.. 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 -0700644
Antoine Musso80edd5a2013-02-13 15:37:53 +0100645Project Templates
646"""""""""""""""""
647
Michael Prokop526926a2013-10-24 16:16:57 +0200648Whenever you have lot of similar projects (such as plugins for a project) you
Antoine Musso80edd5a2013-02-13 15:37:53 +0100649will most probably want to use the same pipeline configurations. The
650project templates let you define pipelines and job name templates to trigger.
651One can then just apply the template on its project which make it easier to
Michael Prokop526926a2013-10-24 16:16:57 +0200652update several similar projects. As an example::
Antoine Musso80edd5a2013-02-13 15:37:53 +0100653
654 project-templates:
655 # Name of the template
656 - name: plugin-triggering
657 # Definition of pipelines just like for a `project`
658 check:
659 - '{jobprefix}-merge':
660 - '{jobprefix}-pep8'
661 - '{jobprefix}-pyflakes'
662 gate:
663 - '{jobprefix}-merge':
664 - '{jobprefix}-unittest'
665 - '{jobprefix}-pep8'
666 - '{jobprefix}-pyflakes'
667
668In your projects definition, you will then apply the template using the template
669key::
670
671 projects:
672 - name: plugin/foobar
673 template:
674 - name: plugin-triggering
675 jobprefix: plugin-foobar
676
James E. Blairaea6cf62013-12-16 15:38:12 -0800677You can pass several parameters to a template. A ``parameter`` value
678will be used for expansion of ``{parameter}`` in the template
679strings. The parameter ``name`` will be automatically provided and
680will contain the short name of the project, that is the portion of the
681project name after the last ``/`` character.
James E. Blaircdd00072012-06-08 19:17:28 -0700682
James E. Blair3e98c022013-12-16 15:25:38 -0800683Multiple templates can be combined in a project, and the jobs from all
684of those templates will be added to the project. Individual jobs may
685also be added::
686
687 projects:
688 - name: plugin/foobar
689 template:
690 - name: plugin-triggering
691 jobprefix: plugin-foobar
692 - name: plugin-extras
693 jobprefix: plugin-foobar
694 check:
695 - foobar-extra-special-job
696
697The order of the jobs listed in the project (which only affects the
698order of jobs listed on the report) will be the jobs from each
699template in the order listed, followed by any jobs individually listed
700for the project.
701
702Note that if multiple templates are used for a project and one
703template specifies a job that is also specified in another template,
704or specified in the project itself, those jobs will be duplicated in
705the resulting project configuration.
706
James E. Blaircdd00072012-06-08 19:17:28 -0700707logging.conf
708~~~~~~~~~~~~
709This file is optional. If provided, it should be a standard
710:mod:`logging.config` module configuration file. If not present, Zuul will
711output all log messages of DEBUG level or higher to the console.
712
713Starting Zuul
714-------------
715
716To start Zuul, run **zuul-server**::
717
Antoine Mussob3aa8282013-04-19 15:16:59 +0200718 usage: zuul-server [-h] [-c CONFIG] [-l LAYOUT] [-d] [-t] [--version]
James E. Blaircdd00072012-06-08 19:17:28 -0700719
720 Project gating system.
721
722 optional arguments:
723 -h, --help show this help message and exit
724 -c CONFIG specify the config file
Antoine Mussob3aa8282013-04-19 15:16:59 +0200725 -l LAYOUT specify the layout file
James E. Blaircdd00072012-06-08 19:17:28 -0700726 -d do not run as a daemon
Antoine Mussob3aa8282013-04-19 15:16:59 +0200727 -t validate layout file syntax
728 --version show zuul version
James E. Blaircdd00072012-06-08 19:17:28 -0700729
730You may want to use the ``-d`` argument while you are initially setting
731up Zuul so you can detect any configuration errors quickly. Under
732normal operation, omit ``-d`` and let Zuul run as a daemon.
733
734If you send signal 1 (SIGHUP) to the zuul-server process, Zuul will
735stop executing new jobs, wait until all executing jobs are finished,
736reload its configuration, and resume. Any values in any of the
737configuration files may be changed, except the location of Zuul's PID
738file (a change to that will be ignored until Zuul is restarted).
Clark Boylanf231fa22013-02-08 12:28:53 -0800739
740If you send a SIGUSR1 to the zuul-server process, Zuul will stop
741executing new jobs, wait until all executing jobs are finished,
742then exit. While waiting to exit Zuul will queue Gerrit events and
743save these events prior to exiting. When Zuul starts again it will
744read these saved events and act on them.
Jeremy Stanley93e05f42013-03-08 17:29:17 +0000745
Michael Prokop526926a2013-10-24 16:16:57 +0200746If you need to abort Zuul and intend to manually requeue changes for
Jeremy Stanley93e05f42013-03-08 17:29:17 +0000747jobs which were running in its pipelines, prior to terminating you can
748use the zuul-changes.py tool script to simplify the process. For
749example, this would give you a list of Gerrit commands to reverify or
750recheck changes for the gate and check pipelines respectively::
751
752 ./tools/zuul-changes.py --review-host=review.openstack.org \
753 http://zuul.openstack.org/ gate 'reverify no bug'
754 ./tools/zuul-changes.py --review-host=review.openstack.org \
755 http://zuul.openstack.org/ check 'recheck no bug'
Clark Boylanfba9b242013-08-20 10:11:17 -0700756
757If you send a SIGUSR2 to the zuul-server process, Zuul will dump a stack
758trace for each running thread into its debug log. This is useful for
759tracking down deadlock or otherwise slow threads.