| :title: Zuul Concepts |
| |
| Zuul Concepts |
| ============= |
| |
| Zuul's configuration is organized around the concept of a *pipeline*. |
| In Zuul, a pipeline encompasses a workflow process which can be |
| applied to one or more projects. For instance, a "check" pipeline |
| might describe the actions which should cause newly proposed changes |
| to projects to be tested. A "gate" pipeline might implement |
| :ref:`project_gating` to automate merging changes to projects only if |
| their tests pass. A "post" pipeline might update published |
| documentation for a project when changes land. |
| |
| The names "check", "gate", and "post" are arbitrary -- these are not |
| concepts built into Zuul, but rather they are just a few common |
| examples of workflow processes that can be described to Zuul and |
| implemented as pipelines. |
| |
| Once a pipeline has been defined, any number of projects may be |
| associated with it, each one specifying what jobs should be run for |
| that project in a given pipeline. |
| |
| Pipelines have associated *triggers* which are descriptions of events |
| which should cause something to be enqueued into a pipeline. For |
| example, when a patchset is uploaded to Gerrit, a Gerrit |
| *patchset-created* event is emitted. A pipeline configured to trigger |
| on *patchset-created* events would then enqueue the associated change |
| when Zuul receives that event. If there are jobs associated with that |
| project and pipeline, they will be run. In addition to Gerrit, other |
| triggers are available, including GitHub, timer, and zuul. See |
| :ref:`drivers` for a full list of available triggers. |
| |
| Once all of the jobs for an item in a pipeline have been run, the |
| pipeline's *reporters* are responsible for reporting the results of |
| all of the jobs. Continuing the example from earlier, if a pipeline |
| were configured with a Gerrit reporter, it would leave a review |
| comment on the change and set any approval votes that are configured. |
| There are several reporting phases available; each of which may be |
| configured with any number of reporters. See :ref:`drivers` for a |
| full list of available reporters. |
| |
| The items enqueued into a pipeline are each associated with a git ref. |
| That ref may point to a proposed change, or it may be the tip of a |
| branch or a tag. The triggering event determines the ref, and whether |
| it represents a proposed or merged commit. Zuul prepares the ref for |
| an item before running jobs. In the case of a proposed change, that |
| means speculatively merging the change into its target branch. This |
| means that any jobs that operate on the change will run with the git |
| repo in the state it will be in after the change merges (which may be |
| substantially different than the git repo state of the change itself |
| since the repo may have merged other changes since the change was |
| originally authored). Items in a pipeline may depend on other items, |
| and if they do, all of their dependent changes will be included in the |
| git repo state that Zuul prepares. For more detail on this process, |
| see :ref:`project_gating` and :ref:`dependencies`. |
| |
| The configuration for nearly everything described above is held in |
| files inside of the git repos upon which Zuul operates. Zuul's |
| configuration is global, but distributed. Jobs which are defined in |
| one project might be used in another project while pipelines are |
| available to all projects. When Zuul starts, it reads its |
| configuration from all of the projects it knows about, and when |
| changes to its configuration are proposed, those changes may take |
| effect temporarily as part of the proposed change, or immediately |
| after the change merges, depending on the type of project in which the |
| change appears. |
| |
| Jobs specify the type and quantity of nodes which they require. |
| Before executing each job, Zuul will contact it's companion program, |
| Nodepool, to supply them. Nodepool may be configured to supply static |
| nodes or contact cloud providers to create or delete nodes as |
| necessary. The types of nodes available to Zuul are determined by the |
| Nodepool administrator. |
| |
| The executable contents of jobs themselves are Ansible playbooks. |
| Ansible's support for orchestrating tasks on remote nodes is |
| particularly suited to Zuul's support for multi-node testing. Ansible |
| is also easy to use for simple tasks (such as executing a shell |
| script) or sophisticated deployment scenarios. When Zuul runs |
| Ansible, it attempts to do so in a manner most similar to the way that |
| Ansible might be used to orchestrate remote systems. Ansible itself |
| is run on the executor and acts remotely upon the test nodes supplied |
| to a job. This facilitates continuous delivery by making it possible |
| to use the same Ansible playbooks in testing and production. |