Browse Source

Replace master with feature/zuulv3

Change-Id: I5d9e9a573e9bffd6e06c73b2412f12c92169d8a3
changes/36/535436/3
James E. Blair 5 years ago
parent
commit
3f3b744263
  1. 5
      .gitignore
  2. 2
      .testr.conf
  3. 62
      .zuul.yaml
  4. 5
      NEWS.rst
  5. 143
      README.rst
  6. 14
      TESTING.rst
  7. 13
      bindep.txt
  8. 115
      doc/source/admin/client.rst
  9. 739
      doc/source/admin/components.rst
  10. 71
      doc/source/admin/connections.rst
  11. 299
      doc/source/admin/drivers/gerrit.rst
  12. 59
      doc/source/admin/drivers/git.rst
  13. 458
      doc/source/admin/drivers/github.rst
  14. 87
      doc/source/admin/drivers/smtp.rst
  15. 85
      doc/source/admin/drivers/sql.rst
  16. 30
      doc/source/admin/drivers/timer.rst
  17. 44
      doc/source/admin/drivers/zuul.rst
  18. 20
      doc/source/admin/index.rst
  19. 69
      doc/source/admin/installation.rst
  20. 278
      doc/source/admin/monitoring.rst
  21. 123
      doc/source/admin/quick-start.rst
  22. 191
      doc/source/admin/tenants.rst
  23. 51
      doc/source/client.rst
  24. 110
      doc/source/cloner.rst
  25. 19
      doc/source/conf.py
  26. 101
      doc/source/connections.rst
  27. 66
      doc/source/developer/ansible.rst
  28. 77
      doc/source/developer/datamodel.rst
  29. 225
      doc/source/developer/docs.rst
  30. 20
      doc/source/developer/drivers.rst
  31. 18
      doc/source/developer/index.rst
  32. 31
      doc/source/developer/testing.rst
  33. 19
      doc/source/developer/triggers.rst
  34. 471
      doc/source/gating.rst
  35. 85
      doc/source/glossary.rst
  36. 42
      doc/source/index.rst
  37. 385
      doc/source/launchers.rst
  38. 74
      doc/source/merger.rst
  39. 162
      doc/source/quick-start.rst
  40. 101
      doc/source/reporters.rst
  41. 104
      doc/source/statsd.rst
  42. 157
      doc/source/triggers.rst
  43. 86
      doc/source/user/concepts.rst
  44. 1391
      doc/source/user/config.rst
  45. 62
      doc/source/user/encryption.rst
  46. 398
      doc/source/user/gating.rst
  47. 18
      doc/source/user/index.rst
  48. 576
      doc/source/user/jobs.rst
  49. 1072
      doc/source/zuul.rst
  50. 16
      etc/layout.yaml-sample
  51. 2
      etc/status/public_html/index.html
  52. 48
      etc/status/public_html/jquery.zuul.js
  53. 10
      etc/status/public_html/zuul.app.js
  54. 37
      etc/zuul.conf-sample
  55. 26
      playbooks/zuul-migrate/post.yaml
  56. 10
      playbooks/zuul-migrate/run.yaml
  57. 21
      playbooks/zuul-stream/fixtures/test-stream-failure.yaml
  58. 51
      playbooks/zuul-stream/fixtures/test-stream.yaml
  59. 65
      playbooks/zuul-stream/functional.yaml
  60. 14
      playbooks/zuul-stream/post-ara.yaml
  61. 25
      playbooks/zuul-stream/post.yaml
  62. 28
      playbooks/zuul-stream/pre.yaml
  63. 11
      playbooks/zuul-stream/templates/ansible.cfg.j2
  64. 18
      requirements.txt
  65. 16
      setup.cfg
  66. 10
      test-requirements.txt
  67. 2624
      tests/base.py
  68. 38
      tests/encrypt_secret.py
  69. 214
      tests/fakegithub.py
  70. 3
      tests/fixtures/config/ansible/git/bare-role/tasks/main.yaml
  71. 10
      tests/fixtures/config/ansible/git/common-config/playbooks/check-secret-names.yaml
  72. 41
      tests/fixtures/config/ansible/git/common-config/playbooks/check-vars.yaml
  73. 16
      tests/fixtures/config/ansible/git/common-config/playbooks/hello-post.yaml
  74. 5
      tests/fixtures/config/ansible/git/common-config/playbooks/post-broken.yaml
  75. 5
      tests/fixtures/config/ansible/git/common-config/playbooks/post.yaml
  76. 5
      tests/fixtures/config/ansible/git/common-config/playbooks/pre.yaml
  77. 13
      tests/fixtures/config/ansible/git/common-config/playbooks/python27.yaml
  78. 4
      tests/fixtures/config/ansible/git/common-config/playbooks/timeout.yaml
  79. 138
      tests/fixtures/config/ansible/git/common-config/zuul.yaml
  80. 0
      tests/fixtures/config/ansible/git/org_plugin-project/.zuul.yaml
  81. 1
      tests/fixtures/config/ansible/git/org_plugin-project/README
  82. 3
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/block_local_override.yaml
  83. 5
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/cartesian.yaml
  84. 5
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/consul_kv.yaml
  85. 5
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/credstash.yaml
  86. 5
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_bad.yaml
  87. 5
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_good.yaml
  88. 6
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_bad.yaml
  89. 6
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_good.yaml
  90. 5
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/passwd.yaml
  91. 41
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/library/file.py
  92. 4
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/tasks/main.yaml
  93. 1
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/test.csv
  94. 6
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_path.yaml
  95. 5
      tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_scheme.yaml
  96. 21
      tests/fixtures/config/ansible/git/org_project/.zuul.yaml
  97. 1
      tests/fixtures/config/ansible/git/org_project/README
  98. 5
      tests/fixtures/config/ansible/git/org_project/playbooks/faillocal.yaml
  99. 5
      tests/fixtures/config/ansible/git/org_project/playbooks/hello-world.yaml
  100. 10
      tests/fixtures/config/ansible/main.yaml
  101. Some files were not shown because too many files have changed in this diff Show More

5
.gitignore vendored

@ -3,14 +3,17 @@
*.egg-info
*.pyc
.idea
.mypy_cache
.test
.testrepository
.tox
.venv
.coverage
AUTHORS
build/*
ChangeLog
config
doc/build/*
zuul/versioninfo
dist/
cover/
htmlcov/

2
.testr.conf

@ -1,4 +1,4 @@
[DEFAULT]
test_command=OS_LOG_LEVEL=${OS_LOG_LEVEL:-INFO} OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} OS_LOG_CAPTURE=${OS_LOG_CAPTURE:-1} OS_LOG_DEFAULTS=${OS_LOG_DEFAULTS:-""} ${PYTHON:-python} -m subunit.run discover -t ./ tests $LISTOPT $IDOPTION
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} OS_LOG_CAPTURE=${OS_LOG_CAPTURE:-1} OS_LOG_DEFAULTS=${OS_LOG_DEFAULTS:-""} ${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./tests/unit} $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list

62
.zuul.yaml

@ -1,14 +1,64 @@
- nodeset:
name: zuul-functional-temp-master
nodes:
- name: controller
label: ubuntu-xenial
- name: node1
label: ubuntu-xenial
- name: node2
label: ubuntu-xenial
groups:
- name: node
nodes:
- node1
- node2
- job:
name: zuul-stream-functional
parent: multinode
nodeset: zuul-functional-temp-master
pre-run: playbooks/zuul-stream/pre.yaml
run: playbooks/zuul-stream/functional.yaml
post-run:
- playbooks/zuul-stream/post.yaml
- playbooks/zuul-stream/post-ara.yaml
required-projects:
- openstack/ara
files:
- zuul/ansible/callback/.*
- playbooks/zuul-stream/.*
- project:
name: openstack-infra/zuul
check:
jobs:
- tox-docs
- tox-cover:
voting: false
- build-openstack-sphinx-docs:
irrelevant-files:
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
vars:
sphinx_python: python3
- tox-pep8
- tox-py27
- tox-py35:
irrelevant-files:
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
- zuul-stream-functional
gate:
jobs:
- tox-docs
- build-openstack-sphinx-docs:
irrelevant-files:
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
vars:
sphinx_python: python3
- tox-pep8
- tox-py27
- tox-py35:
irrelevant-files:
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
- zuul-stream-functional
post:
jobs:
- publish-openstack-sphinx-docs-infra-python3
- publish-openstack-python-branch-tarball

5
NEWS.rst

@ -12,11 +12,6 @@ Since 2.0.0:
the Zuul server in smaller deployments. Several configuration
options have moved from the ``zuul`` section to ``merger``.
* Gerrit label names must now be listed in your layout.yaml exactly as
they appear in Gerrit. This means case and special characters must
match. This change was made to accomodate Gerrit 2.13 which needs the
strings to match for changes to be successfully submitted.
Since 1.3.0:
* The Jenkins launcher is replaced with Gearman launcher. An internal

143
README.rst

@ -3,6 +3,21 @@ Zuul
Zuul is a project gating system developed for the OpenStack Project.
We are currently engaged in a significant development effort in
preparation for the third major version of Zuul. We call this effort
`Zuul v3`_ and it is described in more detail below.
The latest documentation for Zuul v3 is published at:
https://docs.openstack.org/infra/zuul/feature/zuulv3/
If you are looking for the Edge routing service named Zuul that is
related to Netflix, it can be found here:
https://github.com/Netflix/zuul
If you are looking for the Javascript testing tool named Zuul, it
can be found here:
https://github.com/defunctzombie/zuul
Contributing
------------
@ -25,3 +40,131 @@ that links to your launchpad account). Example::
# Do your commits
$ git review
# Enter your username if prompted
Zuul v3
-------
The Zuul v3 effort involves significant changes to Zuul, and its
companion program, Nodepool. The intent is for Zuul to become more
generally useful outside of the OpenStack community. This is the best
way to get started with this effort:
1) Read the Zuul v3 spec: http://specs.openstack.org/openstack-infra/infra-specs/specs/zuulv3.html
We use specification documents like this to describe large efforts
where we want to make sure that all the participants are in
agreement about what will happen and generally how before starting
development. These specs should contain enough information for
people to evaluate the proposal generally, and sometimes include
specific details that need to be agreed upon in advance. They are
living documents which can change as work gets underway. However,
every change or detail does not need to be reflected in the spec --
most work is simply done with patches (and revised if necessary in
code review).
2) Read the Nodepool build-workers spec: http://specs.openstack.org/openstack-infra/infra-specs/specs/nodepool-zookeeper-workers.html
3) Review any proposed updates to these specs: https://review.openstack.org/#/q/status:open+project:openstack-infra/infra-specs+topic:zuulv3
Some of the information in the specs may be effectively superceded
by changes here, which are still undergoing review.
4) Read developer documentation on the internal data model and testing: http://docs.openstack.org/infra/zuul/feature/zuulv3/developer.html
The general philosophy for Zuul tests is to perform functional
testing of either the individual component or the entire end-to-end
system with external systems (such as Gerrit) replaced with fakes.
Before adding additional unit tests with a narrower focus, consider
whether they add value to this system or are merely duplicative of
functional tests.
5) Review open changes: https://review.openstack.org/#/q/status:open+branch:feature/zuulv3
We find that the most valuable code reviews are ones that spot
problems with the proposed change, or raise questions about how
that might affect other systems or subsequent work. It is also a
great way to stay involved as a team in work performed by others
(for instance, by observing and asking questions about development
while it is in progress). We try not to sweat the small things and
don't worry too much about style suggestions or other nitpicky
things (unless they are relevant -- for instance, a -1 vote on a
change that introduces a yaml change out of character with existing
conventions is useful because it makes the system more
user-friendly; a -1 vote on a change which uses a sub-optimal line
breaking strategy is probably not the best use of anyone's time).
6) Join #zuul on Freenode. Let others (especially jeblair who is
trying to coordinate and prioritize work) know what you would like
to work on.
7) Check storyboard for status of current work items: https://storyboard.openstack.org/#!/board/41
Work items tagged with ``low-hanging-fruit`` are tasks that have
been identified as not requiring an expansive knowledge of the
system. They may still require either some knowledge or
investigation into a specific area, but should be suitable for a
developer who is becoming acquainted with the system. Those items
can be found at:
https://storyboard.openstack.org/#!/story/list?tags=low-hanging-fruit&tags=zuulv3
Once you are up to speed on those items, it will be helpful to know
the following:
* Zuul v3 includes some substantial changes to Zuul, and in order to
implement them quickly and simultaneously, we temporarily disabled
most of the test suite. That test suite still has relevance, but
tests are likely to need updating individually, with reasons ranging
from something simple such as a test-framework method changing its
name, to more substantial issues, such as a feature being removed as
part of the v3 work. Each test will need to be evaluated
individually. Feel free to, at any time, claim a test name in this
story and work on re-enabling it:
https://storyboard.openstack.org/#!/story/2000773
* Because of the importance of external systems, as well as the number
of internal Zuul components, actually running Zuul in a development
mode quickly becomes unweildy (imagine uploading changes to Gerrit
repeatedly while altering Zuul source code). Instead, the best way
to develop with Zuul is in fact to write a functional test.
Construct a test to fully simulate the series of events you want to
see, then run it in the foreground. For example::
.tox/py27/bin/python -m testtools.run tests.unit.test_scheduler.TestScheduler.test_jobs_executed
See TESTING.rst for more information.
* There are many occasions, when working on sweeping changes to Zuul
v3, we left notes for future work items in the code marked with
"TODOv3". These represent potentially serious missing functionality
or other issues which must be resolved before an initial v3 release
(unlike a more conventional TODO note, these really can not be left
indefinitely). These present an opportunity to identify work items
not otherwise tracked. The names associated with TODO or TODOv3
items do not mean that only that person can address them -- they
simply reflect who to ask to explain the item in more detail if it
is too cryptic. In your own work, feel free to leave TODOv3 notes
if a change would otherwise become too large or unweildy.
Python Version Support
----------------------
Zuul v3 requires Python 3. It does not support Python 2.
As Ansible is used for the execution of jobs, it's important to note that
while Ansible does support Python 3, not all of Ansible's modules do. Zuul
currently sets ``ansible_python_interpreter`` to python2 so that remote
content will be executed with Python2.
Roadmap
-------
* Begin using Zuul v3 to run jobs for Zuul itself
* Implement a shim to translate Zuul v2 demand into Nodepool Zookeeper
launcher requests
* Begin using Zookeeper based Nodepool launchers with Zuul v2.5 in
OpenStack Infra
* Move OpenStack Infra to use Zuul v3
* Implement Github support
* Begin using Zuul v3 to run tests on Ansible repos
* Implement support in Nodepool for non-OpenStack clouds
* Add native container support to Zuul / Nodepool

14
TESTING.rst

@ -17,6 +17,16 @@ More information on pip here: http://www.pip-installer.org/en/latest/
pip install tox
As of zuul v3, a running zookeeper is required to execute tests.
*Install zookeeper*::
[apt-get | yum] install zookeeperd
*Start zookeeper*::
service zookeeper start
Run The Tests
-------------
@ -54,12 +64,12 @@ To run individual tests with tox::
For example, to *run the basic Zuul test*::
tox -e py27 -- tests.test_scheduler.TestScheduler.test_jobs_launched
tox -e py27 -- tests.unit.test_scheduler.TestScheduler.test_jobs_executed
To *run one test in the foreground* (after previously having run tox
to set up the virtualenv)::
.tox/py27/bin/python -m testtools.run tests.test_scheduler.TestScheduler.test_jobs_launched
.tox/py27/bin/python -m testtools.run tests.unit.test_scheduler.TestScheduler.test_jobs_executed
List Failing Tests
------------------

13
bindep.txt

@ -4,3 +4,16 @@
mysql-client [test]
mysql-server [test]
libjpeg-dev [test]
openssl [test]
zookeeperd [platform:dpkg]
build-essential [platform:dpkg]
gcc [platform:rpm]
graphviz [doc]
libssl-dev [platform:dpkg]
openssl-devel [platform:rpm]
libffi-dev [platform:dpkg]
libffi-devel [platform:rpm]
python-dev [platform:dpkg]
python-devel [platform:rpm]
bubblewrap [platform:rpm]
redhat-rpm-config [platform:rpm]

115
doc/source/admin/client.rst

@ -0,0 +1,115 @@
:title: Zuul Client
Zuul Client
===========
Zuul includes a simple command line client that may be used by
administrators to affect Zuul's behavior while running. It must be
run on a host that has access to the Gearman server (e.g., locally on
the Zuul host).
Configuration
-------------
The client uses the same zuul.conf file as the server, and will look
for it in the same locations if not specified on the command line.
Usage
-----
The general options that apply to all subcommands are:
.. program-output:: zuul --help
The following subcommands are supported:
Autohold
^^^^^^^^
.. program-output:: zuul autohold --help
Example::
zuul autohold --tenant openstack --project example_project --job example_job --reason "reason text" --count 1
Enqueue
^^^^^^^
.. program-output:: zuul enqueue --help
Example::
zuul enqueue --tenant openstack --trigger gerrit --pipeline check --project example_project --change 12345,1
Note that the format of change id is <number>,<patchset>.
Enqueue-ref
^^^^^^^^^^^
.. program-output:: zuul enqueue-ref --help
This command is provided to manually simulate a trigger from an
external source. It can be useful for testing or replaying a trigger
that is difficult or impossible to recreate at the source. The
arguments to ``enqueue-ref`` will vary depending on the source and
type of trigger. Some familiarity with the arguments emitted by
``gerrit`` `update hooks
<https://gerrit-review.googlesource.com/admin/projects/plugins/hooks>`__
such as ``patchset-created`` and ``ref-updated`` is recommended. Some
examples of common operations are provided below.
Manual enqueue examples
***********************
It is common to have a ``release`` pipeline that listens for new tags
coming from ``gerrit`` and performs a range of code packaging jobs.
If there is an unexpected issue in the release jobs, the same tag can
not be recreated in ``gerrit`` and the user must either tag a new
release or request a manual re-triggering of the jobs. To re-trigger
the jobs, pass the failed tag as the ``ref`` argument and set
``newrev`` to the change associated with the tag in the project
repository (i.e. what you see from ``git show X.Y.Z``)::
zuul enqueue-ref --tenant openstack --trigger gerrit --pipeline release --project openstack/example_project --ref refs/tags/X.Y.Z --newrev abc123...
The command can also be used asynchronosly trigger a job in a
``periodic`` pipeline that would usually be run at a specific time by
the ``timer`` driver. For example, the following command would
trigger the ``periodic`` jobs against the current ``master`` branch
top-of-tree for a project::
zuul enqueue-ref --tenant openstack --trigger timer --pipeline periodic --project openstack/example_project --ref refs/heads/master
Another common pipeline is a ``post`` queue listening for ``gerrit``
merge results. Triggering here is slightly more complicated as you
wish to recreate the full ``ref-updated`` event from ``gerrit``. For
a new commit on ``master``, the gerrit ``ref-updated`` trigger
expresses "reset ``refs/heads/master`` for the project from ``oldrev``
to ``newrev``" (``newrev`` being the committed change). Thus to
replay the event, you could ``git log`` in the project and take the
current ``HEAD`` and the prior change, then enqueue the event::
NEW_REF=$(git rev-parse HEAD)
OLD_REF=$(git rev-parse HEAD~1)
zuul enqueue-ref --tenant openstack --trigger gerrit --pipeline post --project openstack/example_project --ref refs/heads/master --newrev $NEW_REF --oldrev $OLD_REF
Note that zero values for ``oldrev`` and ``newrev`` can indicate
branch creation and deletion; the source code is the best reference
for these more advanced operations.
Promote
^^^^^^^
.. program-output:: zuul promote --help
Example::
zuul promote --tenant openstack --pipeline check --changes 12345,1 13336,3
Note that the format of changes id is <number>,<patchset>.
Show
^^^^
.. program-output:: zuul show --help
Example::
zuul show running-jobs

739
doc/source/admin/components.rst

@ -0,0 +1,739 @@
:title: Components
.. _components:
Components
==========
Zuul is a distributed system consisting of several components, each of
which is described below.
.. graphviz::
:align: center
graph {
node [shape=box]
Gearman [shape=ellipse]
Gerrit [fontcolor=grey]
Zookeeper [shape=ellipse]
Nodepool
GitHub [fontcolor=grey]
Merger -- Gearman
Executor -- Gearman
Web -- Gearman
Gearman -- Scheduler;
Scheduler -- Gerrit;
Scheduler -- Zookeeper;
Zookeeper -- Nodepool;
Scheduler -- GitHub;
}
Each of the Zuul processes may run on the same host, or different
hosts. Within Zuul, the components communicate with the scheduler via
the Gearman protocol, so each Zuul component needs to be able to
connect to the host running the Gearman server (the scheduler has a
built-in Gearman server which is recommended) on the Gearman port --
TCP port 4730 by default.
The Zuul scheduler communicates with Nodepool via the ZooKeeper
protocol. Nodepool requires an external ZooKeeper cluster, and the
Zuul scheduler needs to be able to connect to the hosts in that
cluster on TCP port 2181.
Both the Nodepool launchers and Zuul executors need to be able to
communicate with the hosts which nodepool provides. If these are on
private networks, the Executors will need to be able to route traffic
to them.
If statsd is enabled, every service needs to be able to emit data to
statsd. Statsd can be configured to run on each host and forward
data, or services may emit to a centralized statsd collector. Statsd
listens on UDP port 8125 by default.
All Zuul processes read the ``/etc/zuul/zuul.conf`` file (an alternate
location may be supplied on the command line) which uses an INI file
syntax. Each component may have its own configuration file, though
you may find it simpler to use the same file for all components.
An example ``zuul.conf``:
.. code-block:: ini
[gearman]
server=localhost
[gearman_server]
start=true
log_config=/etc/zuul/gearman-logging.yaml
[zookeeper]
hosts=zk1.example.com,zk2.example.com,zk3.example.com
[webapp]
status_url=https://zuul.example.com/status
[scheduler]
log_config=/etc/zuul/scheduler-logging.yaml
A minimal Zuul system may consist of a :ref:`scheduler` and
:ref:`executor` both running on the same host. Larger installations
should consider running multiple executors, each on a dedicated host,
and running mergers on dedicated hosts as well.
Common
------
The following applies to all Zuul components.
Configuration
~~~~~~~~~~~~~
The following sections of ``zuul.conf`` are used by all Zuul components:
.. attr:: gearman
Client connection information for Gearman.
.. attr:: server
:required:
Hostname or IP address of the Gearman server.
.. attr:: port
:default: 4730
Port on which the Gearman server is listening.
.. attr:: ssl_ca
An openssl file containing a set of concatenated “certification
authority” certificates in PEM formet.
.. attr:: ssl_cert
An openssl file containing the client public certificate in PEM format.
.. attr:: ssl_key
An openssl file containing the client private key in PEM format.
.. attr:: statsd
Information about the optional statsd server. If the ``statsd``
python module is installed and this section is configured,
statistics will be reported to statsd. See :ref:`statsd` for more
information.
.. attr:: server
Hostname or IP address of the statsd server.
.. attr:: port
:default: 8125
The UDP port on which the statsd server is listening.
.. attr:: prefix
If present, this will be prefixed to all of the keys before
transmitting to the statsd server.
.. NOTE: this is a white lie at this point, since only the scheduler
uses this, however, we expect other components to use it later, so
it's reasonable for admins to plan for this now.
.. attr:: zookeeper
Client connection information for ZooKeeper
.. attr:: hosts
:required:
A list of zookeeper hosts for Zuul to use when communicating
with Nodepool.
.. attr:: session_timeout
:default: 10.0
The ZooKeeper session timeout, in seconds.
.. _scheduler:
Scheduler
---------
The scheduler is the primary component of Zuul. The scheduler is not
a scalable component; one, and only one, scheduler must be running at
all times for Zuul to be operational. It receives events from any
connections to remote systems which have been configured, enqueues
items into pipelines, distributes jobs to executors, and reports
results.
The scheduler includes a Gearman server which is used to communicate
with other components of Zuul. It is possible to use an external
Gearman server, but the built-in server is well-tested and
recommended. If the built-in server is used, other Zuul hosts will
need to be able to connect to the scheduler on the Gearman port, TCP
port 4730. It is also strongly recommended to use SSL certs with
Gearman, as secrets are transferred from the scheduler to executors
over this link.
The scheduler must be able to connect to the ZooKeeper cluster used by
Nodepool in order to request nodes. It does not need to connect
directly to the nodes themselves, however -- that function is handled
by the Executors.
It must also be able to connect to any services for which connections
are configured (Gerrit, GitHub, etc).
Configuration
~~~~~~~~~~~~~
The following sections of ``zuul.conf`` are used by the scheduler:
.. attr:: gearman_server
The builtin gearman server. Zuul can fork a gearman process from
itself rather than connecting to an external one.
.. attr:: start
:default: false
Whether to start the internal Gearman server.
.. attr:: listen_address
:default: all addresses
IP address or domain name on which to listen.
.. attr:: port
:default: 4730
TCP port on which to listen.
.. attr:: log_config
Path to log config file for internal Gearman server.
.. attr:: ssl_ca
An openssl file containing a set of concatenated “certification
authority” certificates in PEM formet.
.. attr:: ssl_cert
An openssl file containing the server public certificate in PEM
format.
.. attr:: ssl_key
An openssl file containing the server private key in PEM format.
.. attr:: webapp
.. attr:: listen_address
:default: all addresses
IP address or domain name on which to listen.
.. attr:: port
:default: 8001
Port on which the webapp is listening.
.. attr:: status_expiry
:default: 1
Zuul will cache the status.json file for this many seconds.
.. attr:: status_url
URL that will be posted in Zuul comments made to changes when
starting jobs for a change.
.. TODO: is this effectively required?
.. attr:: scheduler
.. attr:: command_socket
:default: /var/lib/zuul/scheduler.socket
Path to command socket file for the scheduler process.
.. attr:: tenant_config
:required:
Path to :ref:`tenant-config` file.
.. attr:: log_config
Path to log config file.
.. attr:: pidfile
:default: /var/run/zuul-schedurecr/zuul-scheduler.pid
Path to PID lock file.
.. attr:: state_dir
:default: /var/lib/zuul
Path to directory in which Zuul should save its state.
Operation
~~~~~~~~~
To start the scheduler, run ``zuul-scheduler``. To stop it, kill the
PID which was saved in the pidfile specified in the configuration.
Most of Zuul's configuration is automatically updated as changes to
the repositories which contain it are merged. However, Zuul must be
explicitly notified of changes to the tenant config file, since it is
not read from a git repository. To do so, send the scheduler PID
(saved in the pidfile specified in the configuration) a `SIGHUP`
signal.
Merger
------
Mergers are an optional Zuul service; they are not required for Zuul
to operate, but some high volume sites may benefit from running them.
Zuul performs quite a lot of git operations in the course of its work.
Each change that is to be tested must be speculatively merged with the
current state of its target branch to ensure that it can merge, and to
ensure that the tests that Zuul perform accurately represent the
outcome of merging the change. Because Zuul's configuration is stored
in the git repos it interacts with, and is dynamically evaluated, Zuul
often needs to perform a speculative merge in order to determine
whether it needs to perform any further actions.
All of these git operations add up, and while Zuul executors can also
perform them, large numbers may impact their ability to run jobs.
Therefore, administrators may wish to run standalone mergers in order
to reduce the load on executors.
Mergers need to be able to connect to the Gearman server (usually the
scheduler host) as well as any services for which connections are
configured (Gerrit, GitHub, etc).
Configuration
~~~~~~~~~~~~~
The following section of ``zuul.conf`` is used by the merger:
.. attr:: merger
.. attr:: command_socket
:default: /var/lib/zuul/merger.socket
Path to command socket file for the merger process.
.. attr:: git_dir
Directory in which Zuul should clone git repositories.
.. attr:: git_http_low_speed_limit
:default: 1000
If the HTTP transfer speed is less then git_http_low_speed_limit for
longer then git_http_low_speed_time, the transfer is aborted.
Value in bytes, setting to 0 will disable.
.. attr:: git_http_low_speed_time
:default: 30
If the HTTP transfer speed is less then git_http_low_speed_limit for
longer then git_http_low_speed_time, the transfer is aborted.
Value in seconds, setting to 0 will disable.
.. attr:: git_user_email
Value to pass to `git config user.email
<https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup>`_.
.. attr:: git_user_name
Value to pass to `git config user.name
<https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup>`_.
.. attr:: log_config
Path to log config file for the merger process.
.. attr:: pidfile
:default: /var/run/zuul-merger/zuul-merger.pid
Path to PID lock file for the merger process.
Operation
~~~~~~~~~
To start the merger, run ``zuul-merger``. To stop it, kill the
PID which was saved in the pidfile specified in the configuration.
.. _executor:
Executor
--------
Executors are responsible for running jobs. At the start of each job,
an executor prepares an environment in which to run Ansible which
contains all of the git repositories specified by the job with all
dependent changes merged into their appropriate branches. The branch
corresponding to the proposed change will be checked out (in all
projects, if it exists). Any roles specified by the job will also be
present (also with dependent changes merged, if appropriate) and added
to the Ansible role path. The executor also prepares an Ansible
inventory file with all of the nodes requested by the job.
The executor also contains a merger. This is used by the executor to
prepare the git repositories used by jobs, but is also available to
perform any tasks normally performed by standalone mergers. Because
the executor performs both roles, small Zuul installations may not
need to run standalone mergers.
Executors need to be able to connect to the Gearman server (usually
the scheduler host), any services for which connections are configured
(Gerrit, GitHub, etc), as well as directly to the hosts which Nodepool
provides.
Trusted and Untrusted Playbooks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The executor runs playbooks in one of two execution contexts depending
on whether the project containing the playbook is a
:term:`config-project` or an :term:`untrusted-project`. If the
playbook is in a config project, the executor runs the playbook in the
*trusted* execution context, otherwise, it is run in the *untrusted*
execution context.
Both execution contexts use `bubblewrap`_ [#nullwrap]_ to create a
namespace to ensure that playbook executions are isolated and are unable
to access files outside of a restricted environment. The administrator
may configure additional local directories on the executor to be made
available to the restricted environment.
The trusted execution context has access to all Ansible features,
including the ability to load custom Ansible modules. Needless to
say, extra scrutiny should be given to code that runs in a trusted
context as it could be used to compromise other jobs running on the
executor, or the executor itself, especially if the administrator has
granted additional access through bubblewrap, or a method of escaping
the restricted environment created by bubblewrap is found.
Playbooks run in the untrusted execution context are not permitted to
load additional Ansible modules or access files outside of the
restricted environment prepared for them by the executor. In addition
to the bubblewrap environment applied to both execution contexts, in
the untrusted context some standard Ansible modules are replaced with
versions which prohibit some actions, including attempts to access
files outside of the restricted execution context. These redundant
protections are made as part of a defense-in-depth strategy.
.. _bubblewrap: https://github.com/projectatomic/bubblewrap
.. [#nullwrap] Unless one has set execution_wrapper to nullwrap in the
executor configuration.
Configuration
~~~~~~~~~~~~~
The following sections of ``zuul.conf`` are used by the executor:
.. attr:: executor
.. attr:: command_socket
:default: /var/lib/zuul/executor.socket
Path to command socket file for the executor process.
.. attr:: finger_port
:default: 7900
Port to use for finger log streamer.
.. attr:: git_dir
:default: /var/lib/zuul/git
Directory that Zuul should clone local git repositories to. The
executor keeps a local copy of every git repository it works
with to speed operations and perform speculative merging.
This should be on the same filesystem as
:attr:`executor.job_dir` so that when git repos are cloned into
the job workspaces, they can be hard-linked to the local git
cache.
.. attr:: job_dir
:default: /tmp
Directory that Zuul should use to hold temporary job directories.
When each job is run, a new entry will be created under this
directory to hold the configuration and scratch workspace for
that job. It will be deleted at the end of the job (unless the
`--keep-jobdir` command line option is specified).
This should be on the same filesystem as :attr:`executor.git_dir`
so that when git repos are cloned into the job workspaces, they
can be hard-linked to the local git cache.
.. attr:: log_config
Path to log config file for the executor process.
.. attr:: pidfile
:default: /var/run/zuul-executor/zuul-executor.pid
Path to PID lock file for the executor process.
.. attr:: private_key_file
:default: ~/.ssh/id_rsa
SSH private key file to be used when logging into worker nodes.
.. _admin_sitewide_variables:
.. attr:: variables
Path to an Ansible variables file to supply site-wide variables.
This should be a YAML-formatted file consisting of a single
dictionary. The contents will be made available to all jobs as
Ansible variables. These variables take precedence over all
other forms (job variables and secrets). Care should be taken
when naming these variables to avoid potential collisions with
those used by jobs. Prefixing variable names with a
site-specific identifier is recommended. The default is not to
add any site-wide variables. See the :ref:`User's Guide
<user_sitewide_variables>` for more information.
.. attr:: disk_limit_per_job
:default: 250
This integer is the maximum number of megabytes that any one job
is allowed to consume on disk while it is running. If a job's
scratch space has more than this much space consumed, it will be
aborted.
.. attr:: trusted_ro_paths
List of paths, separated by ``:`` to read-only bind mount into
trusted bubblewrap contexts.
.. attr:: trusted_rw_paths
List of paths, separated by ``:`` to read-write bind mount into
trusted bubblewrap contexts.
.. attr:: untrusted_ro_paths
List of paths, separated by ``:`` to read-only bind mount into
untrusted bubblewrap contexts.
.. attr:: untrusted_rw_paths
List of paths, separated by ``:`` to read-write bind mount into
untrusted bubblewrap contexts.
.. attr:: execution_wrapper
:default: bubblewrap
Name of the execution wrapper to use when executing
`ansible-playbook`. The default, `bubblewrap` is recommended for
all installations.
There is also a `nullwrap` driver for situations where one wants
to run Zuul without access to bubblewrap or in such a way that
bubblewrap may interfere with the jobs themselves. However,
`nullwrap` is considered unsafe, as `bubblewrap` provides
significant protections against malicious users and accidental
breakage in playbooks. As such, `nullwrap` is not recommended
for use in production.
This option, and thus, `nullwrap`, may be removed in the future.
`bubblewrap` has become integral to securely operating Zuul. If you
have a valid use case for it, we encourage you to let us know.
.. attr:: load_multiplier
:default: 2.5
When an executor host gets too busy, the system may suffer
timeouts and other ill effects. The executor will stop accepting
more than 1 job at a time until load has lowered below a safe
level. This level is determined by multiplying the number of
CPU's by `load_multiplier`.
So for example, if the system has 2 CPUs, and load_multiplier
is 2.5, the safe load for the system is 5.00. Any time the
system load average is over 5.00, the executor will quit
accepting multiple jobs at one time.
The executor will observe system load and determine whether
to accept more jobs every 30 seconds.
.. attr:: hostname
:default: hostname of the server
The executor needs to know its hostname under which it is reachable by
zuul-web. Otherwise live console log streaming doesn't work. In most cases
This is automatically detected correctly. But when running in environments
where it cannot determine its hostname correctly this can be overridden
here.
.. attr:: merger
.. attr:: git_user_email
Value to pass to `git config user.email
<https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup>`_.
.. attr:: git_user_name
Value to pass to `git config user.name
<https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup>`_.
Operation
~~~~~~~~~
To start the executor, run ``zuul-executor``.
There are several commands which can be run to control the executor's
behavior once it is running.
To stop the executor immediately, aborting all jobs (they may be
relaunched according to their retry policy), run ``zuul-executor
stop``.
To request that the executor stop executing new jobs and exit when all
currently running jobs have completed, run ``zuul-executor graceful``.
To enable or disable running Ansible in verbose mode (with the
``-vvv`` argument to ansible-playbook) run ``zuul-executor verbose``
and ``zuul-executor unverbose``.
Web Server
----------
The Zuul web server currently acts as a websocket interface to live log
streaming. Eventually, it will serve as the single process handling all
HTTP interactions with Zuul.
Web servers need to be able to connect to the Gearman server (usually
the scheduler host). If the SQL reporter is used, they need to be
able to connect to the database it reports to in order to support the
dashboard. If a GitHub connection is configured, they need to be
reachable by GitHub so they may receive notifications.
Configuration
~~~~~~~~~~~~~
In addition to the common configuration sections, the following
sections of ``zuul.conf`` are used by the web server:
.. attr:: web
.. attr:: listen_address
:default: 127.0.0.1
IP address or domain name on which to listen.
.. attr:: log_config
Path to log config file for the web server process.
.. attr:: pidfile
:default: /var/run/zuul-web/zuul-web.pid
Path to PID lock file for the web server process.
.. attr:: port
:default: 9000
Port to use for web server process.
.. attr:: websocket_url
Base URL on which the websocket service is exposed, if different
than the base URL of the web app.
.. attr:: static_cache_expiry
:default: 3600
The Cache-Control max-age response header value for static files served
by the zuul-web. Set to 0 during development to disable Cache-Control.
Operation
~~~~~~~~~
To start the web server, run ``zuul-web``. To stop it, kill the
PID which was saved in the pidfile specified in the configuration.
Finger Gateway
--------------
The Zuul finger gateway listens on the standard finger port (79) for
finger requests specifying a build UUID for which it should stream log
results. The gateway will determine which executor is currently running that
build and query that executor for the log stream.
This is intended to be used with the standard finger command line client.
For example::
finger UUID@zuul.example.com
The above would stream the logs for the build identified by `UUID`.
Finger gateway servers need to be able to connect to the Gearman
server (usually the scheduler host), as well as the console streaming
port on the executors (usually 7900).
Configuration
~~~~~~~~~~~~~
In addition to the common configuration sections, the following
sections of ``zuul.conf`` are used by the finger gateway:
.. attr:: fingergw
.. attr:: command_socket
:default: /var/lib/zuul/fingergw.socket
Path to command socket file for the executor process.
.. attr:: listen_address
:default: all addresses
IP address or domain name on which to listen.
.. attr:: log_config
Path to log config file for the finger gateway process.
.. attr:: pidfile
:default: /var/run/zuul-fingergw/zuul-fingergw.pid
Path to PID lock file for the finger gateway process.
.. attr:: port
:default: 79
Port to use for the finger gateway. Note that since command line
finger clients cannot usually specify the port, leaving this set to
the default value is highly recommended.
.. attr:: user
:default: zuul
User ID for the zuul-fingergw process. In normal operation as a
daemon, the finger gateway should be started as the ``root`` user, but
it will drop privileges to this user during startup.
Operation
~~~~~~~~~
To start the finger gateway, run ``zuul-fingergw``. To stop it, kill the
PID which was saved in the pidfile specified in the configuration.

71
doc/source/admin/connections.rst

@ -0,0 +1,71 @@
:title: Connection Configuration
.. _connection-config:
Connection Configuration
========================
Most of Zuul's configuration is contained in the git repositories upon
which Zuul operates, however, some configuration outside of git
repositories is still required to bootstrap the system. This includes
information on connections between Zuul and other systems, as well as
identifying the projects Zuul uses.
.. _connections:
Connections
-----------
In order to interact with external systems, Zuul must have a
*connection* to that system configured. Zuul includes a number of
drivers, each of which implements the functionality necessary to
connect to a system. Each connection in Zuul is associated with a
driver.
To configure a connection in Zuul, select a unique name for the
connection and add a section to ``zuul.conf`` with the form
``[connection NAME]``. For example, a connection to a gerrit server
may appear as:
.. code-block:: ini
[connection mygerritserver]
driver=gerrit
server=review.example.com
Zuul needs to use a single connection to look up information about
changes hosted by a given system. When it looks up changes, it will
do so using the first connection it finds that matches the server name
it's looking for. It's generally best to use only a single connection
for a given server, however, if you need more than one (for example,
to satisfy unique reporting requirements) be sure to list the primary
connection first as that is what Zuul will use to look up all changes
for that server.
.. _drivers:
Drivers
-------
Drivers may support any of the following functions:
* Sources -- hosts git repositories for projects. Zuul can clone git
repos for projects and fetch refs.
* Triggers -- emits events to which Zuul may respond. Triggers are
configured in pipelines to cause changes or other refs to be
enqueued.
* Reporters -- outputs information when a pipeline is finished
processing an item.
Zuul includes the following drivers:
.. toctree::
:maxdepth: 2
drivers/gerrit
drivers/github
drivers/git
drivers/smtp
drivers/sql
drivers/timer
drivers/zuul

299
doc/source/admin/drivers/gerrit.rst

@ -0,0 +1,299 @@
:title: Gerrit Driver
Gerrit
======
`Gerrit`_ is a code review system. The Gerrit driver supports
sources, triggers, and reporters.
.. _Gerrit: https://www.gerritcodereview.com/
Zuul will need access to a Gerrit user.
Create an SSH keypair for Zuul to use if there isn't one already, and
create a Gerrit user with that key::
cat ~/id_rsa.pub | ssh -p29418 review.example.com gerrit create-account --ssh-key - --full-name Zuul zuul
Give that user whatever permissions will be needed on the projects you
want Zuul to report on. For instance, you may want to grant
``Verified +/-1`` and ``Submit`` to the user. Additional categories
or values may be added to Gerrit. Zuul is very flexible and can take
advantage of those.
Connection Configuration
------------------------
The supported options in ``zuul.conf`` connections are:
.. attr:: <gerrit connection>
.. attr:: driver
:required:
.. value:: gerrit
The connection must set ``driver=gerrit`` for Gerrit connections.
.. attr:: server
Fully qualified domain name of Gerrit server.
.. attr:: canonical_hostname
The canonical hostname associated with the git repos on the
Gerrit server. Defaults to the value of
:attr:`<gerrit connection>.server`. This is used to identify
projects from this connection by name and in preparing repos on
the filesystem for use by jobs. Note that Zuul will still only
communicate with the Gerrit server identified by ``server``;
this option is useful if users customarily use a different
hostname to clone or pull git repos so that when Zuul places
them in the job's working directory, they appear under this
directory name.
.. attr:: port
:default: 29418
Gerrit server port.
.. attr:: baseurl
Path to Gerrit web interface.
.. attr:: gitweb_url_template
:default: {baseurl}/gitweb?p={project.name}.git;a=commitdiff;h={sha}
Url template for links to specific git shas. By default this will
point at Gerrit's built in gitweb but you can customize this value
to point elsewhere (like cgit or github).
The three values available for string interpolation are baseurl
which points back to Gerrit, project and all of its safe attributes,
and sha which is the git sha1.
.. attr:: user
:default: zuul
User name to use when logging into Gerrit via ssh.
.. attr:: sshkey
:default: ~zuul/.ssh/id_rsa
Path to SSH key to use when logging into Gerrit.
.. attr:: keepalive
:default: 60
SSH connection keepalive timeout; ``0`` disables.
Trigger Configuration
---------------------
Zuul works with standard versions of Gerrit by invoking the ``gerrit
stream-events`` command over an SSH connection. It also reports back
to Gerrit using SSH.
If using Gerrit 2.7 or later, make sure the user is a member of a group
that is granted the ``Stream Events`` permission, otherwise it will not
be able to invoke the ``gerrit stream-events`` command over SSH.
.. attr:: pipeline.trigger.<gerrit source>
The dictionary passed to the Gerrit pipeline ``trigger`` attribute
supports the following attributes:
.. attr:: event
:required:
The event name from gerrit. Examples: ``patchset-created``,
``comment-added``, ``ref-updated``. This field is treated as a
regular expression.
.. attr:: branch
The branch associated with the event. Example: ``master``.
This field is treated as a regular expression, and multiple
branches may be listed.
.. attr:: ref
On ref-updated events, the branch parameter is not used, instead
the ref is provided. Currently Gerrit has the somewhat
idiosyncratic behavior of specifying bare refs for branch names
(e.g., ``master``), but full ref names for other kinds of refs
(e.g., ``refs/tags/foo``). Zuul matches this value exactly
against what Gerrit provides. This field is treated as a
regular expression, and multiple refs may be listed.
.. attr:: ignore-deletes
:default: true
When a branch is deleted, a ref-updated event is emitted with a
newrev of all zeros specified. The ``ignore-deletes`` field is a
boolean value that describes whether or not these newrevs
trigger ref-updated events.
.. attr:: approval
This is only used for ``comment-added`` events. It only matches
if the event has a matching approval associated with it.
Example: ``Code-Review: 2`` matches a ``+2`` vote on the code
review category. Multiple approvals may be listed.
.. attr:: email
This is used for any event. It takes a regex applied on the
performer email, i.e. Gerrit account email address. If you want
to specify several email filters, you must use a YAML list.
Make sure to use non greedy matchers and to escapes dots!
Example: ``email: ^.*?@example\.org$``.
.. attr:: username
This is used for any event. It takes a regex applied on the
performer username, i.e. Gerrit account name. If you want to
specify several username filters, you must use a YAML list.
Make sure to use non greedy matchers and to escapes dots.
Example: ``username: ^zuul$``.
.. attr:: comment
This is only used for ``comment-added`` events. It accepts a
list of regexes that are searched for in the comment string. If
any of these regexes matches a portion of the comment string the
trigger is matched. ``comment: retrigger`` will match when
comments containing ``retrigger`` somewhere in the comment text
are added to a change.
.. attr:: require-approval
This may be used for any event. It requires that a certain kind
of approval be present for the current patchset of the change
(the approval could be added by the event in question). It
follows the same syntax as :attr:`pipeline.require.<gerrit
source>.approval`. For each specified criteria there must exist
a matching approval.
.. attr:: reject-approval
This takes a list of approvals in the same format as
:attr:`pipeline.trigger.<gerrit source>.require-approval` but
will fail to enter the pipeline if there is a matching approval.
Reporter Configuration
----------------------
Zuul works with standard versions of Gerrit by invoking the
``gerrit`` command over an SSH connection. It reports back to
Gerrit using SSH.
The dictionary passed to the Gerrit reporter is used for ``gerrit
review`` arguments, with the boolean value of ``true`` simply
indicating that the argument should be present without following it
with a value. For example, ``verified: 1`` becomes ``gerrit review
--verified 1`` and ``submit: true`` becomes ``gerrit review
--submit``.
A :ref:`connection<connections>` that uses the gerrit driver must be
supplied to the trigger.
Requirements Configuration
--------------------------
As described in :attr:`pipeline.require` and :attr:`pipeline.reject`,
pipelines may specify that items meet certain conditions in order to
be enqueued into the pipeline. These conditions vary according to the
source of the project in question. To supply requirements for changes
from a Gerrit source named ``my-gerrit``, create a configuration such
as the following:
.. code-block:: yaml
pipeline:
require:
my-gerrit:
approval:
- Code-Review: 2
This indicates that changes originating from the Gerrit connection
named ``my-gerrit`` must have a ``Code-Review`` vote of ``+2`` in
order to be enqueued into the pipeline.
.. attr:: pipeline.require.<gerrit source>
The dictionary passed to the Gerrit pipeline `require` attribute
supports the following attributes:
.. attr:: approval
This requires that a certain kind of approval be present for the
current patchset of the change (the approval could be added by
the event in question). It takes several sub-parameters, all of
which are optional and are combined together so that there must
be an approval matching all specified requirements.
.. attr:: username
If present, an approval from this username is required. It is
treated as a regular expression.
.. attr:: email
If present, an approval with this email address is required. It is
treated as a regular expression.
.. attr:: older-than
If present, the approval must be older than this amount of time
to match. Provide a time interval as a number with a suffix of
"w" (weeks), "d" (days), "h" (hours), "m" (minutes), "s"
(seconds). Example ``48h`` or ``2d``.
.. attr:: newer-than
If present, the approval must be newer than this amount
of time to match. Same format as "older-than".
Any other field is interpreted as a review category and value
pair. For example ``Verified: 1`` would require that the
approval be for a +1 vote in the "Verified" column. The value
may either be a single value or a list: ``Verified: [1, 2]``
would match either a +1 or +2 vote.
.. attr:: open
A boolean value (``true`` or ``false``) that indicates whether
the change must be open or closed in order to be enqueued.
.. attr:: current-patchset
A boolean value (``true`` or ``false``) that indicates whether the
change must be the current patchset in order to be enqueued.
.. attr:: status
A string value that corresponds with the status of the change
reported by the trigger.
.. attr:: pipeline.reject.<gerrit source>
The `reject` attribute is the mirror of the `require` attribute. It
also accepts a dictionary under the connection name. This
dictionary supports the following attributes:
.. attr:: approval
This takes a list of approvals. If an approval matches the
provided criteria the change can not be entered into the
pipeline. It follows the same syntax as
:attr:`pipeline.require.<gerrit source>.approval`.
Example to reject a change with any negative vote:
.. code-block:: yaml
reject:
my-gerrit:
approval:
- Code-Review: [-1, -2]

59
doc/source/admin/drivers/git.rst

@ -0,0 +1,59 @@
:title: Git Driver
Git
===
This driver can be used to load Zuul configuration from public Git repositories,
for instance from ``openstack-infra/zuul-jobs`` that is suitable for use by
any Zuul system. It can also be used to trigger jobs from ``ref-updated`` events
in a pipeline.
Connection Configuration
------------------------
The supported options in ``zuul.conf`` connections are:
.. attr:: <git connection>
.. attr:: driver
:required:
.. value:: git
The connection must set ``driver=git`` for Git connections.
.. attr:: baseurl
Path to the base Git URL. Git repos name will be appended to it.
.. attr:: poll_delay
:default: 7200
The delay in seconds of the Git repositories polling loop.
Trigger Configuration
---------------------
.. attr:: pipeline.trigger.<git source>
The dictionary passed to the Git pipeline ``trigger