Quick Start Guide
=================

This provides a very simple overview of Zuul.  It is recommended to
read the following sections for more details.

Install Zuul
------------

You can get zuul from pypi via::

    pip install zuul

Zuul Components
---------------

Zuul provides the following components:

    - **zuul-scheduler**: The main Zuul process. Handles receiving
      events, executing jobs, collecting results and posting reports.
      Coordinates the work of the other components.

    - **zuul-merger**: Scale-out component that performs git merge
      operations.  Zuul performs a large number of git operations in
      the course of its work.  Adding merger processes can help speed
      Zuul's processing.  This component is optional (zero or more of
      these can be run).

    - **zuul-executor**: Scale-out component for executing jobs.  At
      least one of these is required.  Depending on system
      configuration, you can expect a single executor to handle up to
      about 100 simultaneous jobs.  Can handle the functions of a
      merger if dedicated mergers are not provided.  One or more of
      these must be run.

    - **gearman**: optional builtin gearman daemon provided by zuul-scheduler

External components:

    - **gearman**: A gearman daemon if the built-in daemon is not used.

    - **zookeeper**: A zookeeper cluster (or single host) for
      communicating with Nodepool.

    - **nodepool**: Provides nodes for Zuul to use when executing jobs.


Zuul Setup
----------

At minimum you need to provide **zuul.conf** and **main.yaml** placed
in **/etc/zuul/**.  The following example uses the builtin gearman
service in Zuul, and a connection to Gerrit.

**zuul.conf**::

    [zuul]
    tenant_config=/etc/zuul/main.yaml

    [gearman_server]
    start=true

    [gearman]
    server=127.0.0.1

    [connection gerrit]
    driver=gerrit
    server=git.example.com
    port=29418
    baseurl=https://git.example.com/gerrit/
    user=zuul
    sshkey=/home/zuul/.ssh/id_rsa

See :ref:`components` and :ref:`connections` for more details.

The following tells Zuul to read its configuration from and operate on
the *example-project* project:

**main.yaml**::

    - tenant:
        name: example-tenant
        source:
          gerrit:
            untrusted-projects:
              - example-project

Starting Zuul
-------------

You can run any zuul process with the **-d** option to make it not
daemonize. It's a good idea at first to confirm there's no issues with
your configuration.

To start, simply run::

    zuul-scheduler

Once run you should have two zuul-scheduler processes (if using the
built-in gearman server, or one process otherwise).

Before Zuul can run any jobs, it needs to load its configuration, most
of which is in the git repositories that Zuul operates on.  Start an
executor to allow zuul to do that::

    zuul-executor

Zuul should now be able to read its configuration from the configured
repo and process any jobs defined therein.

Troubleshooting
---------------

You can use telnet to connect to gearman to check which Zuul
components are online::

    telnet <gearman_ip> 4730

Useful commands are **workers** and **status** which you can run by just
typing those commands once connected to gearman.
