blob: 278c4f4536fa6d56e112e4f545909048789af3a3 [file] [log] [blame]
James E. Blaireff5a9d2017-06-20 00:00:37 -07001:title: Job Content
2
3Job Content
4===========
5
David Shrewsburyc50cb572017-08-04 11:55:01 -04006Zuul jobs are implemented as Ansible playbooks. Zuul prepares the
James E. Blaireff5a9d2017-06-20 00:00:37 -07007repositories used for a job, installs any required Ansible roles, and
8then executes the job's playbooks. Any setup or artifact collection
9required is the responsibility of the job itself. While this flexible
10arrangement allows for almost any kind of job to be run by Zuul,
11batteries are included. Zuul has a standard library of jobs upon
12which to build.
13
14Working Directory
15-----------------
16
17Before starting each job, the Zuul executor creates a directory to
18hold all of the content related to the job. This includes some
19directories which are used by Zuul to configure and run Ansible and
20may not be accessible, as well as a directory tree, under ``work/``,
21that is readable and writable by the job. The hierarchy is:
22
23**work/**
24 The working directory of the job.
25
26**work/src/**
27 Contains the prepared git repositories for the job.
28
29**work/logs/**
30 Where the Ansible log for the job is written; your job
31 may place other logs here as well.
32
33Git Repositories
34----------------
35
36The git repositories in ``work/src`` contain the repositories for all
37of the projects specified in the ``required-projects`` section of the
38job, plus the project associated with the queue item if it isn't
39already in that list. In the case of a proposed change, that change
40and all of the changes ahead of it in the pipeline queue will already
41be merged into their respective repositories and target branches. The
42change's project will have the change's branch checked out, as will
43all of the other projects, if that branch exists (otherwise, a
44fallback or default branch will be used). If your job needs to
45operate on multiple branches, simply checkout the appropriate branches
46of these git repos to ensure that the job results reflect the proposed
47future state that Zuul is testing, and all dependencies are present.
48Do not use any git remotes; the local repositories are guaranteed to
49be up to date.
50
James E. Blair4d5dd252017-06-23 21:40:56 +010051The repositories will be placed on the filesystem in directories
52corresponding with the canonical hostname of their source connection.
53For example::
54
55 work/src/git.example.com/project1
56 work/src/github.com/project2
57
58Is the layout that would be present for a job which included project1
59from the connection associated to git.example.com and project2 from
60GitHub. This helps avoid collisions between projects with the same
61name, and some language environments, such as Go, expect repositories
62in this format.
63
James E. Blaireff5a9d2017-06-20 00:00:37 -070064Note that these git repositories are located on the executor; in order
65to be useful to most kinds of jobs, they will need to be present on
66the test nodes. The ``base`` job in the standard library contains a
67pre-playbook which copies the repositories to all of the job's nodes.
68It is recommended to always inherit from this base job to ensure that
69behavior.
70
71.. TODO: link to base job documentation and/or document src (and logs?) directory
72
James E. Blair28c8e3b2017-07-17 16:27:50 -070073Variables
74---------
75
Jamie Lennox7655b552017-03-17 12:33:38 +110076There are several sources of variables which are available to Ansible:
77variables defined in jobs, secrets, and site-wide variables. The
78order of precedence is:
79
80* Site-wide variables
81
82* Secrets
83
84* Job variables
85
James E. Blair698703c2017-09-15 20:58:30 -060086* Parent job results
87
Jamie Lennox7655b552017-03-17 12:33:38 +110088Meaning that a site-wide variable with the same name as any other will
89override its value, and similarly, secrets override job variables of
James E. Blair698703c2017-09-15 20:58:30 -060090the same name which override data returned from parent jobs. Each of
91the sources is described below.
Jamie Lennox7655b552017-03-17 12:33:38 +110092
93
94Job Variables
95~~~~~~~~~~~~~
96
James E. Blaird9f0efb2017-08-02 16:07:44 -070097Any variables specified in the job definition (using the
98:attr:`job.vars` attribute) are available as Ansible host variables.
99They are added to the ``vars`` section of the inventory file under the
100``all`` hosts group, so they are available to all hosts. Simply refer
101to them by the name specified in the job's ``vars`` section.
James E. Blair28c8e3b2017-07-17 16:27:50 -0700102
103Secrets
104~~~~~~~
105
James E. Blaird9f0efb2017-08-02 16:07:44 -0700106:ref:`Secrets <secret>` also appear as variables available to Ansible.
107Unlike job variables, these are not added to the inventory file (so
108that the inventory file may be kept for debugging purposes without
109revealing secrets). But they are still available to Ansible as normal
James E. Blair28c8e3b2017-07-17 16:27:50 -0700110variables. Because secrets are groups of variables, they will appear
111as a dictionary structure in templates, with the dictionary itself
112being the name of the secret, and its members the individual items in
James E. Blaird9f0efb2017-08-02 16:07:44 -0700113the secret. For example, a secret defined as:
114
115.. code-block:: yaml
James E. Blair28c8e3b2017-07-17 16:27:50 -0700116
117 - secret:
118 name: credentials
119 data:
120 username: foo
121 password: bar
122
123Might be used in a template as::
124
125 {{ credentials.username }} {{ credentials.password }}
126
James E. Blair892cca62017-08-09 11:36:58 -0700127Secrets are only available to playbooks associated with the job
128definition which uses the secret; they are not available to playbooks
129associated with child jobs or job variants.
James E. Blair28c8e3b2017-07-17 16:27:50 -0700130
James E. Blaireff5a9d2017-06-20 00:00:37 -0700131Zuul Variables
James E. Blair28c8e3b2017-07-17 16:27:50 -0700132~~~~~~~~~~~~~~
James E. Blaireff5a9d2017-06-20 00:00:37 -0700133
134Zuul supplies not only the variables specified by the job definition
James E. Blaird9f0efb2017-08-02 16:07:44 -0700135to Ansible, but also some variables from Zuul itself.
James E. Blair21037782017-07-19 11:56:55 -0700136
James E. Blairbabefce2017-07-20 17:14:54 -0700137When a pipeline is triggered by an action, it enqueues items which may
James E. Blair21037782017-07-19 11:56:55 -0700138vary based on the pipeline's configuration. For example, when a new
139change is created, that change may be enqueued into the pipeline,
140while a tag may be enqueued into the pipeline when it is pushed.
141
142Information about these items is available to jobs. All of the items
143enqueued in a pipeline are git references, and therefore share some
144attributes in common. But other attributes may vary based on the type
145of item.
146
James E. Blaird9f0efb2017-08-02 16:07:44 -0700147.. var:: zuul
James E. Blair21037782017-07-19 11:56:55 -0700148
James E. Blaird9f0efb2017-08-02 16:07:44 -0700149 All items provide the following information as Ansible variables
150 under the ``zuul`` key:
James E. Blair21037782017-07-19 11:56:55 -0700151
James E. Blaird9f0efb2017-08-02 16:07:44 -0700152 .. var:: build
James E. Blair21037782017-07-19 11:56:55 -0700153
James E. Blaird9f0efb2017-08-02 16:07:44 -0700154 The UUID of the build. A build is a single execution of a job.
155 When an item is enqueued into a pipeline, this usually results
156 in one build of each job configured for that item's project.
157 However, items may be re-enqueued in which case another build
158 may run. In dependent pipelines, the same job may run multiple
159 times for the same item as circumstances change ahead in the
160 queue. Each time a job is run, for whatever reason, it is
161 acompanied with a new unique id.
James E. Blair21037782017-07-19 11:56:55 -0700162
James E. Blaird9f0efb2017-08-02 16:07:44 -0700163 .. var:: buildset
James E. Blair21037782017-07-19 11:56:55 -0700164
James E. Blaird9f0efb2017-08-02 16:07:44 -0700165 The build set UUID. When Zuul runs jobs for an item, the
166 collection of those jobs is known as a buildset. If the
167 configuration of items ahead in a dependent pipeline changes,
168 Zuul creates a new buildset and restarts all of the jobs.
James E. Blair21037782017-07-19 11:56:55 -0700169
James E. Blaird9f0efb2017-08-02 16:07:44 -0700170 .. var:: ref
James E. Blair2ef29e92017-07-21 15:25:05 -0700171
James E. Blaird9f0efb2017-08-02 16:07:44 -0700172 The git ref of the item. This will be the full path (e.g.,
173 `refs/heads/master` or `refs/changes/...`).
James E. Blair21037782017-07-19 11:56:55 -0700174
James E. Blairbae8fec2017-11-21 10:19:06 -0800175 .. var:: override_checkout
176
177 If the job was configured to override the branch or tag checked
James E. Blair4ad12ea2017-11-30 14:41:06 -0800178 out, this will contain the specified value. Otherwise, this
179 variable will be undefined.
James E. Blairbae8fec2017-11-21 10:19:06 -0800180
James E. Blaird9f0efb2017-08-02 16:07:44 -0700181 .. var:: pipeline
James E. Blair21037782017-07-19 11:56:55 -0700182
James E. Blaird9f0efb2017-08-02 16:07:44 -0700183 The name of the pipeline in which the job is being run.
Monty Taylor299f94b2017-07-28 17:16:36 -0500184
James E. Blaird9f0efb2017-08-02 16:07:44 -0700185 .. var:: job
James E. Blair21037782017-07-19 11:56:55 -0700186
James E. Blaird9f0efb2017-08-02 16:07:44 -0700187 The name of the job being run.
James E. Blair21037782017-07-19 11:56:55 -0700188
James E. Blaird9f0efb2017-08-02 16:07:44 -0700189 .. var:: voting
James E. Blair21037782017-07-19 11:56:55 -0700190
James E. Blaird9f0efb2017-08-02 16:07:44 -0700191 A boolean indicating whether the job is voting.
James E. Blair21037782017-07-19 11:56:55 -0700192
James E. Blaird9f0efb2017-08-02 16:07:44 -0700193 .. var:: project
James E. Blair21037782017-07-19 11:56:55 -0700194
James E. Blaird9f0efb2017-08-02 16:07:44 -0700195 The item's project. This is a data structure with the following
196 fields:
James E. Blair21037782017-07-19 11:56:55 -0700197
James E. Blaird9f0efb2017-08-02 16:07:44 -0700198 .. var:: name
Monty Taylor299f94b2017-07-28 17:16:36 -0500199
James E. Blaird9f0efb2017-08-02 16:07:44 -0700200 The name of the project, excluding hostname. E.g., `org/project`.
Monty Taylor299f94b2017-07-28 17:16:36 -0500201
James E. Blaird9f0efb2017-08-02 16:07:44 -0700202 .. var:: short_name
Monty Taylor299f94b2017-07-28 17:16:36 -0500203
James E. Blaird9f0efb2017-08-02 16:07:44 -0700204 The name of the project, excluding directories or
205 organizations. E.g., `project`.
Monty Taylor299f94b2017-07-28 17:16:36 -0500206
James E. Blaird9f0efb2017-08-02 16:07:44 -0700207 .. var:: canonical_hostname
Monty Taylor299f94b2017-07-28 17:16:36 -0500208
James E. Blaird9f0efb2017-08-02 16:07:44 -0700209 The canonical hostname where the project lives. E.g.,
210 `git.example.com`.
Monty Taylor299f94b2017-07-28 17:16:36 -0500211
James E. Blaird9f0efb2017-08-02 16:07:44 -0700212 .. var:: canonical_name
213
214 The full canonical name of the project including hostname.
215 E.g., `git.example.com/org/project`.
216
Monty Taylor9e67bb72017-08-08 15:32:06 -0500217 .. var:: src_dir
218
James E. Blairba46c062017-08-28 16:23:24 -0700219 The path to the source code relative to the work dir. E.g.,
220 `src/git.example.com/org/project`.
Monty Taylor9e67bb72017-08-08 15:32:06 -0500221
James E. Blairba46c062017-08-28 16:23:24 -0700222 .. var:: projects
Ian Wienand42234422017-10-23 16:03:53 +1100223 :type: dict
James E. Blairba46c062017-08-28 16:23:24 -0700224
Clark Boylan3934e3f2017-12-06 11:03:26 -0800225 A dictionary of all projects prepared by Zuul for the item. It
James E. Blairba46c062017-08-28 16:23:24 -0700226 includes, at least, the item's own project. It also includes
227 the projects of any items this item depends on, as well as the
228 projects that appear in :attr:`job.required-projects`.
229
Ian Wienand42234422017-10-23 16:03:53 +1100230 This is a dictionary of dictionaries. Each value has a key of
231 the `canonical_name`, then each entry consists of:
James E. Blairba46c062017-08-28 16:23:24 -0700232
233 .. var:: name
234
235 The name of the project, excluding hostname. E.g., `org/project`.
236
237 .. var:: short_name
238
239 The name of the project, excluding directories or
240 organizations. E.g., `project`.
241
242 .. var:: canonical_hostname
243
244 The canonical hostname where the project lives. E.g.,
245 `git.example.com`.
246
247 .. var:: canonical_name
248
249 The full canonical name of the project including hostname.
250 E.g., `git.example.com/org/project`.
251
252 .. var:: src_dir
253
254 The path to the source code, relative to the work dir. E.g.,
255 `src/git.example.com/org/project`.
Monty Taylor9e67bb72017-08-08 15:32:06 -0500256
James E. Blairb3d3f2b2017-09-27 12:04:55 -0700257 .. var:: required
258
259 A boolean indicating whether this project appears in the
260 :attr:`job.required-projects` list for this job.
261
James E. Blairbae8fec2017-11-21 10:19:06 -0800262 .. var:: checkout
263
264 The branch or tag that Zuul checked out for this project.
265 This may be influenced by the branch or tag associated with
266 the item as well as the job configuration.
267
Ian Wienand42234422017-10-23 16:03:53 +1100268 For example, to access the source directory of a single known
269 project, you might use::
270
271 {{ zuul.projects['git.example.com/org/project'].src_dir }}
272
273 To iterate over the project list, you might write a task
274 something like::
275
276 - name: Sample project iteration
277 debug:
278 msg: "Project {{ item.name }} is at {{ item.src_dir }}
279 with_items: {{ zuul.projects.values() | list }}
280
281
Ian Wienandd61d98e2017-10-18 08:21:19 +1100282 .. var:: _projects
283 :type: dict
284
285 The same as ``projects`` but a dictionary indexed by the
286 ``name`` value of each entry. ``projects`` will be converted to
287 this.
288
James E. Blaird9f0efb2017-08-02 16:07:44 -0700289 .. var:: tenant
290
291 The name of the current Zuul tenant.
292
James E. Blair93e57f72017-09-01 08:51:49 -0700293 .. var:: timeout
294
295 The job timeout, in seconds.
296
James E. Blaird9f0efb2017-08-02 16:07:44 -0700297 .. var:: jobtags
298
299 A list of tags associated with the job. Not to be confused with
300 git tags, these are simply free-form text fields that can be
301 used by the job for reporting or classification purposes.
302
303 .. var:: items
304 :type: list
305
306 A list of dictionaries, each representing an item being tested
307 with this change with the format:
308
309 .. var:: project
310
311 The item's project. This is a data structure with the
312 following fields:
313
314 .. var:: name
315
316 The name of the project, excluding hostname. E.g.,
317 `org/project`.
318
319 .. var:: short_name
320
321 The name of the project, excluding directories or
322 organizations. E.g., `project`.
323
324 .. var:: canonical_hostname
325
326 The canonical hostname where the project lives. E.g.,
327 `git.example.com`.
328
329 .. var:: canonical_name
330
331 The full canonical name of the project including hostname.
332 E.g., `git.example.com/org/project`.
333
Monty Taylor9e67bb72017-08-08 15:32:06 -0500334 .. var:: src_dir
335
336 The path to the source code on the remote host, relative
337 to the home dir of the remote user.
338 E.g., `src/git.example.com/org/project`.
339
James E. Blaird9f0efb2017-08-02 16:07:44 -0700340 .. var:: branch
341
342 The target branch of the change (without the `refs/heads/` prefix).
343
344 .. var:: change
345
346 The identifier for the change.
347
Monty Taylor41634442017-09-06 18:35:17 -0500348 .. var:: change_url
349
350 The URL to the source location of the given change.
351 E.g., `https://review.example.org/#/c/123456/` or
352 `https://github.com/example/example/pull/1234`.
353
James E. Blaird9f0efb2017-08-02 16:07:44 -0700354 .. var:: patchset
355
356 The patchset identifier for the change. If a change is
357 revised, this will have a different value.
James E. Blair21037782017-07-19 11:56:55 -0700358
Jesse Keatinga49ddaf2017-09-11 18:17:47 -0600359.. var:: zuul_success
360
361 Post run playbook(s) will be passed this variable to indicate if the run
362 phase of the job was successful or not. This variable is meant to be used
363 with the `boolean` filter.
364
365
James E. Blair21037782017-07-19 11:56:55 -0700366Change Items
367++++++++++++
368
369A change to the repository. Most often, this will be a git reference
370which has not yet been merged into the repository (e.g., a gerrit
371change or a GitHub pull request). The following additional variables
372are available:
373
James E. Blaird9f0efb2017-08-02 16:07:44 -0700374.. var:: zuul
375 :hidden:
James E. Blair21037782017-07-19 11:56:55 -0700376
James E. Blaird9f0efb2017-08-02 16:07:44 -0700377 .. var:: branch
James E. Blair21037782017-07-19 11:56:55 -0700378
James E. Blaird9f0efb2017-08-02 16:07:44 -0700379 The target branch of the change (without the `refs/heads/` prefix).
380
381 .. var:: change
382
383 The identifier for the change.
384
385 .. var:: patchset
386
387 The patchset identifier for the change. If a change is revised,
388 this will have a different value.
James E. Blair21037782017-07-19 11:56:55 -0700389
Monty Taylor41634442017-09-06 18:35:17 -0500390 .. var:: change_url
391
392 The URL to the source location of the given change.
393 E.g., `https://review.example.org/#/c/123456/` or
394 `https://github.com/example/example/pull/1234`.
395
James E. Blair21037782017-07-19 11:56:55 -0700396Branch Items
397++++++++++++
398
399This represents a branch tip. This item may have been enqueued
400because the branch was updated (via a change having merged, or a
401direct push). Or it may have been enqueued by a timer for the purpose
402of verifying the current condition of the branch. The following
403additional variables are available:
404
James E. Blaird9f0efb2017-08-02 16:07:44 -0700405.. var:: zuul
406 :hidden:
James E. Blair21037782017-07-19 11:56:55 -0700407
James E. Blaird9f0efb2017-08-02 16:07:44 -0700408 .. var:: branch
James E. Blair21037782017-07-19 11:56:55 -0700409
James E. Blaird9f0efb2017-08-02 16:07:44 -0700410 The name of the item's branch (without the `refs/heads/`
411 prefix).
412
413 .. var:: oldrev
414
415 If the item was enqueued as the result of a change merging or
416 being pushed to the branch, the git sha of the old revision will
417 be included here. Otherwise, this variable will be undefined.
418
419 .. var:: newrev
420
421 If the item was enqueued as the result of a change merging or
422 being pushed to the branch, the git sha of the new revision will
423 be included here. Otherwise, this variable will be undefined.
James E. Blair21037782017-07-19 11:56:55 -0700424
425Tag Items
426+++++++++
427
428This represents a git tag. The item may have been enqueued because a
429tag was created or deleted. The following additional variables are
430available:
431
James E. Blaird9f0efb2017-08-02 16:07:44 -0700432.. var:: zuul
433 :hidden:
James E. Blair21037782017-07-19 11:56:55 -0700434
James E. Blaird9f0efb2017-08-02 16:07:44 -0700435 .. var:: tag
James E. Blair21037782017-07-19 11:56:55 -0700436
James E. Blaird9f0efb2017-08-02 16:07:44 -0700437 The name of the item's tag (without the `refs/tags/` prefix).
438
439 .. var:: oldrev
440
441 If the item was enqueued as the result of a tag being deleted,
442 the previous git sha of the tag will be included here. If the
443 tag was created, this variable will be undefined.
444
445 .. var:: newrev
446
447 If the item was enqueued as the result of a tag being created,
448 the new git sha of the tag will be included here. If the tag
449 was deleted, this variable will be undefined.
James E. Blair21037782017-07-19 11:56:55 -0700450
451Ref Items
452+++++++++
453
454This represents a git reference that is neither a change, branch, or
455tag. Note that all items include a `ref` attribute which may be used
456to identify the ref. The following additional variables are
457available:
458
James E. Blaird9f0efb2017-08-02 16:07:44 -0700459.. var:: zuul
460 :hidden:
James E. Blair21037782017-07-19 11:56:55 -0700461
James E. Blaird9f0efb2017-08-02 16:07:44 -0700462 .. var:: oldrev
463
464 If the item was enqueued as the result of a ref being deleted,
465 the previous git sha of the ref will be included here. If the
466 ref was created, this variable will be undefined.
467
468 .. var:: newrev
469
470 If the item was enqueued as the result of a ref being created,
471 the new git sha of the ref will be included here. If the ref
472 was deleted, this variable will be undefined.
James E. Blair21037782017-07-19 11:56:55 -0700473
474Working Directory
475+++++++++++++++++
476
477Additionally, some information about the working directory and the
478executor running the job is available:
James E. Blaireff5a9d2017-06-20 00:00:37 -0700479
James E. Blaird9f0efb2017-08-02 16:07:44 -0700480.. var:: zuul
481 :hidden:
James E. Blaireff5a9d2017-06-20 00:00:37 -0700482
James E. Blaird9f0efb2017-08-02 16:07:44 -0700483 .. var:: executor
James E. Blaireff5a9d2017-06-20 00:00:37 -0700484
James E. Blaird9f0efb2017-08-02 16:07:44 -0700485 A number of values related to the executor running the job are
486 available:
James E. Blaireff5a9d2017-06-20 00:00:37 -0700487
James E. Blaird9f0efb2017-08-02 16:07:44 -0700488 .. var:: hostname
489
490 The hostname of the executor.
491
492 .. var:: src_root
493
494 The path to the source directory.
495
496 .. var:: log_root
497
498 The path to the logs directory.
499
500 .. var:: work_root
501
502 The path to the working directory.
Jamie Lennox7655b552017-03-17 12:33:38 +1100503
504.. _user_sitewide_variables:
505
506Site-wide Variables
507~~~~~~~~~~~~~~~~~~~
508
509The Zuul administrator may define variables which will be available to
510all jobs running in the system. These are statically defined and may
511not be altered by jobs. See the :ref:`Administrator's Guide
512<admin_sitewide_variables>` for information on how a site
513administrator may define these variables.
514
James E. Blair698703c2017-09-15 20:58:30 -0600515Parent Job Results
516~~~~~~~~~~~~~~~~~~
517
518A job may return data to Zuul for later use by jobs which depend on
519it. For details, see :ref:`return_values`.
Jamie Lennox7655b552017-03-17 12:33:38 +1100520
James E. Blaireff5a9d2017-06-20 00:00:37 -0700521SSH Keys
522--------
523
524Zuul starts each job with an SSH agent running and the key used to
525access the job's nodes added to that agent. Generally you won't need
526to be aware of this since Ansible will use this when performing any
527tasks on remote nodes. However, under some circumstances you may want
528to interact with the agent. For example, you may wish to add a key
529provided as a secret to the job in order to access a specific host, or
530you may want to, in a pre-playbook, replace the key used to log into
531the assigned nodes in order to further protect it from being abused by
532untrusted job content.
533
534.. TODO: describe standard lib and link to published docs for it.
535
James E. Blair88e79c02017-07-07 13:36:54 -0700536.. _return_values:
537
James E. Blair196f61a2017-06-30 15:42:29 -0700538Return Values
539-------------
540
James E. Blair698703c2017-09-15 20:58:30 -0600541A job may return some values to Zuul to affect its behavior and for
542use by other jobs.. To return a value, use the ``zuul_return``
543Ansible module in a job playbook. For example:
James E. Blaird9f0efb2017-08-02 16:07:44 -0700544
545.. code-block:: yaml
James E. Blair196f61a2017-06-30 15:42:29 -0700546
547 tasks:
548 - zuul_return:
549 data:
550 foo: bar
551
James E. Blair698703c2017-09-15 20:58:30 -0600552Will return the dictionary ``{'foo': 'bar'}`` to Zuul.
James E. Blair196f61a2017-06-30 15:42:29 -0700553
554.. TODO: xref to section describing formatting
555
James E. Blair698703c2017-09-15 20:58:30 -0600556To set the log URL for a build, use *zuul_return* to set the
James E. Blaird9f0efb2017-08-02 16:07:44 -0700557**zuul.log_url** value. For example:
558
559.. code-block:: yaml
James E. Blair196f61a2017-06-30 15:42:29 -0700560
561 tasks:
562 - zuul_return:
563 data:
564 zuul:
565 log_url: http://logs.example.com/path/to/build/logs
James E. Blair698703c2017-09-15 20:58:30 -0600566
567Any values other than those in the ``zuul`` hierarchy will be supplied
568as Ansible variables to child jobs. These variables have less
569precedence than any other type of variable in Zuul, so be sure their
570names are not shared by any job variables. If more than one parent
571job returns the same variable, the value from the later job in the job
572graph will take precedence.