blob: 068da0b8195296e02fdcbe92e8f8edcbad09512c [file] [log] [blame]
:title: Job Content
Job Content
===========
Zuul jobs are implemneted as Ansible playbooks. Zuul prepares the
repositories used for a job, installs any required Ansible roles, and
then executes the job's playbooks. Any setup or artifact collection
required is the responsibility of the job itself. While this flexible
arrangement allows for almost any kind of job to be run by Zuul,
batteries are included. Zuul has a standard library of jobs upon
which to build.
Working Directory
-----------------
Before starting each job, the Zuul executor creates a directory to
hold all of the content related to the job. This includes some
directories which are used by Zuul to configure and run Ansible and
may not be accessible, as well as a directory tree, under ``work/``,
that is readable and writable by the job. The hierarchy is:
**work/**
The working directory of the job.
**work/src/**
Contains the prepared git repositories for the job.
**work/logs/**
Where the Ansible log for the job is written; your job
may place other logs here as well.
Git Repositories
----------------
The git repositories in ``work/src`` contain the repositories for all
of the projects specified in the ``required-projects`` section of the
job, plus the project associated with the queue item if it isn't
already in that list. In the case of a proposed change, that change
and all of the changes ahead of it in the pipeline queue will already
be merged into their respective repositories and target branches. The
change's project will have the change's branch checked out, as will
all of the other projects, if that branch exists (otherwise, a
fallback or default branch will be used). If your job needs to
operate on multiple branches, simply checkout the appropriate branches
of these git repos to ensure that the job results reflect the proposed
future state that Zuul is testing, and all dependencies are present.
Do not use any git remotes; the local repositories are guaranteed to
be up to date.
The repositories will be placed on the filesystem in directories
corresponding with the canonical hostname of their source connection.
For example::
work/src/git.example.com/project1
work/src/github.com/project2
Is the layout that would be present for a job which included project1
from the connection associated to git.example.com and project2 from
GitHub. This helps avoid collisions between projects with the same
name, and some language environments, such as Go, expect repositories
in this format.
Note that these git repositories are located on the executor; in order
to be useful to most kinds of jobs, they will need to be present on
the test nodes. The ``base`` job in the standard library contains a
pre-playbook which copies the repositories to all of the job's nodes.
It is recommended to always inherit from this base job to ensure that
behavior.
.. TODO: link to base job documentation and/or document src (and logs?) directory
Variables
---------
There are several sources of variables which are available to Ansible:
variables defined in jobs, secrets, and site-wide variables. The
order of precedence is:
* Site-wide variables
* Secrets
* Job variables
Meaning that a site-wide variable with the same name as any other will
override its value, and similarly, secrets override job variables of
the same name. Each of the three sources is described below.
Job Variables
~~~~~~~~~~~~~
Any variables specified in the job definition are available as Ansible
host variables. They are added to the `vars` section of the inventory
file under the `all` hosts group, so they are available to all hosts.
Simply refer to them by the name specified in the job's `vars`
section.
Secrets
~~~~~~~
Secrets also appear as variables available to Ansible. Unlike job
variables, these are not added to the inventory file (so that the
inventory file may be kept for debugging purposes without revealing
secrets). But they are still available to Ansible as normal
variables. Because secrets are groups of variables, they will appear
as a dictionary structure in templates, with the dictionary itself
being the name of the secret, and its members the individual items in
the secret. For example, a secret defined as::
- secret:
name: credentials
data:
username: foo
password: bar
Might be used in a template as::
{{ credentials.username }} {{ credentials.password }}
.. TODO: xref job vars
Zuul Variables
~~~~~~~~~~~~~~
Zuul supplies not only the variables specified by the job definition
to Ansible, but also some variables from the Zuul itself.
When a pipeline is triggered by an action, it enqueues items which may
vary based on the pipeline's configuration. For example, when a new
change is created, that change may be enqueued into the pipeline,
while a tag may be enqueued into the pipeline when it is pushed.
Information about these items is available to jobs. All of the items
enqueued in a pipeline are git references, and therefore share some
attributes in common. But other attributes may vary based on the type
of item.
All items provide the following information as Ansible variables:
**zuul.build**
The UUID of the build. A build is a single execution of a job.
When an item is enqueued into a pipeline, this usually results in
one build of each job configured for that item's project. However,
items may be re-enqueued in which case another build may run. In
dependent pipelines, the same job may run multiple times for the
same item as circumstances change ahead in the queue. Each time a
job is run, for whatever reason, it is acompanied with a new
unique id.
**zuul.buildset**
The build set UUID. When Zuul runs jobs for an item, the collection
of those jobs is known as a buildset. If the configuration of items
ahead in a dependent pipeline changes, Zuul creates a new buildset
and restarts all of the jobs.
**zuul.ref**
The git ref of the item. This will be the full path (e.g.,
'refs/heads/master' or 'refs/changes/...').
**zuul.pipeline**
The name of the pipeline in which the job is being run.
**zuul.job**
The name of the job being run.
**zuul.voting**
A boolean indicating whether the job is voting.
**zuul.project**
The item's project. This is a data structure with the following
fields:
**zuul.project.name**
The name of the project, excluding hostname. E.g., `org/project`.
**zuul.project.short_name**
The name of the project, excluding directories or organizations.
E.g., `project`.
**zuul.project.canonical_hostname**
The canonical hostname where the project lives. E.g.,
`git.example.com`.
**zuul.project.canonical_name**
The full canonical name of the project including hostname. E.g.,
`git.example.com/org/project`.
**zuul.tenant**
The name of the current Zuul tenant.
**zuul.jobtags**
A list of tags associated with the job. Not to be confused with git
tags, these are simply free-form text fields that can be used by the
job for reporting or classification purposes.
**zuul.items**
A list of dictionaries, each representing an item being tested with
this change with the format:
**project.name**
The name of the project, excluding hostname. E.g., `org/project`.
**project.short_name**
The name of the project, excluding directories or organizations.
E.g., `project`.
**project.canonical_hostname**
The canonical hostname where the project lives. E.g.,
`git.example.com`.
**project.canonical_name**
The full canonical name of the project including hostname. E.g.,
`git.example.com/org/project`.
**branch**
The target branch of the change (without the `refs/heads/` prefix).
**change**
The identifier for the change.
**patchset**
The patchset identifier for the change. If a change is revised,
this will have a different value.
Change Items
++++++++++++
A change to the repository. Most often, this will be a git reference
which has not yet been merged into the repository (e.g., a gerrit
change or a GitHub pull request). The following additional variables
are available:
**zuul.branch**
The target branch of the change (without the `refs/heads/` prefix).
**zuul.change**
The identifier for the change.
**zuul.patchset**
The patchset identifier for the change. If a change is revised,
this will have a different value.
Branch Items
++++++++++++
This represents a branch tip. This item may have been enqueued
because the branch was updated (via a change having merged, or a
direct push). Or it may have been enqueued by a timer for the purpose
of verifying the current condition of the branch. The following
additional variables are available:
**zuul.branch**
The name of the item's branch (without the `refs/heads/` prefix).
**zuul.oldrev**
If the item was enqueued as the result of a change merging or being
pushed to the branch, the git sha of the old revision will be
included here. Otherwise, this variable will be undefined.
**zuul.newrev**
If the item was enqueued as the result of a change merging or being
pushed to the branch, the git sha of the new revision will be
included here. Otherwise, this variable will be undefined.
Tag Items
+++++++++
This represents a git tag. The item may have been enqueued because a
tag was created or deleted. The following additional variables are
available:
**zuul.tag**
The name of the item's tag (without the `refs/tags/` prefix).
**zuul.oldrev**
If the item was enqueued as the result of a tag being deleted, the
previous git sha of the tag will be included here. If the tag was
created, this variable will be undefined.
**zuul.newrev**
If the item was enqueued as the result of a tag being created, the
new git sha of the tag will be included here. If the tag was
deleted, this variable will be undefined.
Ref Items
+++++++++
This represents a git reference that is neither a change, branch, or
tag. Note that all items include a `ref` attribute which may be used
to identify the ref. The following additional variables are
available:
**zuul.oldrev**
If the item was enqueued as the result of a ref being deleted, the
previous git sha of the ref will be included here. If the ref was
created, this variable will be undefined.
**zuul.newrev**
If the item was enqueued as the result of a ref being created, the
new git sha of the ref will be included here. If the ref was
deleted, this variable will be undefined.
Working Directory
+++++++++++++++++
Additionally, some information about the working directory and the
executor running the job is available:
**zuul.executor.hostname**
The hostname of the executor.
**zuul.executor.src_root**
The path to the source directory.
**zuul.executor.log_root**
The path to the logs directory.
**zuul.executor.work_root**
The path to the working directory.
.. _user_sitewide_variables:
Site-wide Variables
~~~~~~~~~~~~~~~~~~~
The Zuul administrator may define variables which will be available to
all jobs running in the system. These are statically defined and may
not be altered by jobs. See the :ref:`Administrator's Guide
<admin_sitewide_variables>` for information on how a site
administrator may define these variables.
SSH Keys
--------
Zuul starts each job with an SSH agent running and the key used to
access the job's nodes added to that agent. Generally you won't need
to be aware of this since Ansible will use this when performing any
tasks on remote nodes. However, under some circumstances you may want
to interact with the agent. For example, you may wish to add a key
provided as a secret to the job in order to access a specific host, or
you may want to, in a pre-playbook, replace the key used to log into
the assigned nodes in order to further protect it from being abused by
untrusted job content.
.. TODO: describe standard lib and link to published docs for it.
.. _return_values:
Return Values
-------------
The job may return some values to Zuul to affect its behavior. To
return a value, use the *zuul_return* Ansible module in a job
playbook. For example::
tasks:
- zuul_return:
data:
foo: bar
Will return the dictionary "{'foo': 'bar'}" to Zuul.
.. TODO: xref to section describing formatting
Several uses of these values are planned, but the only currently
implemented use is to set the log URL for a build. To do so, set the
**zuul.log_url** value. For example::
tasks:
- zuul_return:
data:
zuul:
log_url: http://logs.example.com/path/to/build/logs