Compare commits

..

No commits in common. "rawhide" and "f33" have entirely different histories.

29 changed files with 1650 additions and 1 deletions

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
/zuul-3.18.0.tar.gz
results_zuul
*.rpm
/zuul-3.19.0.tar.gz
/zuul-3.19.1.tar.gz

View file

@ -0,0 +1,58 @@
From 6feb399854ef55a3e43c5a46c56fae487dcd8d28 Mon Sep 17 00:00:00 2001
From: Fabien Boucher <fboucher@redhat.com>
Date: Tue, 19 May 2020 14:40:51 +0200
Subject: [PATCH] Remove another shebang and remove useless exec bits
Change-Id: Id49bc9a4b50948b1f07e4fa917c93acac0c2a17e
---
zuul/cmd/__init__.py | 0
zuul/cmd/client.py | 0
zuul/cmd/executor.py | 0
zuul/cmd/merger.py | 5 -----
zuul/cmd/scheduler.py | 0
zuul/cmd/web.py | 0
6 files changed, 5 deletions(-)
mode change 100755 => 100644 zuul/cmd/__init__.py
mode change 100755 => 100644 zuul/cmd/client.py
mode change 100755 => 100644 zuul/cmd/executor.py
mode change 100755 => 100644 zuul/cmd/merger.py
mode change 100755 => 100644 zuul/cmd/scheduler.py
mode change 100755 => 100644 zuul/cmd/web.py
diff --git a/zuul/cmd/__init__.py b/zuul/cmd/__init__.py
old mode 100755
new mode 100644
diff --git a/zuul/cmd/client.py b/zuul/cmd/client.py
old mode 100755
new mode 100644
diff --git a/zuul/cmd/executor.py b/zuul/cmd/executor.py
old mode 100755
new mode 100644
diff --git a/zuul/cmd/merger.py b/zuul/cmd/merger.py
old mode 100755
new mode 100644
index 1d4b6fef..9b827427
--- a/zuul/cmd/merger.py
+++ b/zuul/cmd/merger.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
# Copyright 2012 Hewlett-Packard Development Company, L.P.
# Copyright 2013-2014 OpenStack Foundation
#
@@ -69,7 +68,3 @@ class Merger(zuul.cmd.ZuulDaemonApp):
def main():
Merger().main()
-
-
-if __name__ == "__main__":
- main()
diff --git a/zuul/cmd/scheduler.py b/zuul/cmd/scheduler.py
old mode 100755
new mode 100644
diff --git a/zuul/cmd/web.py b/zuul/cmd/web.py
old mode 100755
new mode 100644
--
2.25.1

View file

@ -0,0 +1,54 @@
From b27dc5df5dc1617fc2f1d438611b87b3e63383c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
Date: Mon, 1 Jun 2020 12:49:07 +0200
Subject: [PATCH] Replace deprecated Thread.isAlive() with Thread.is_alive()
The isAlive() method of threading.Thread has been removed in Python 3.9.
The is_alive() method is available on Python 2.6+.
See https://bugs.python.org/issue37804
Change-Id: I951b1ae331c3101722fe34babf81d6f82d838380
---
zuul/ansible/base/library/command.py | 4 ++--
zuul/lib/log_streamer.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/zuul/ansible/base/library/command.py b/zuul/ansible/base/library/command.py
index a3b969d9..0c461b3a 100755
--- a/zuul/ansible/base/library/command.py
+++ b/zuul/ansible/base/library/command.py
@@ -474,7 +474,7 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
if t:
t.join(10)
with Console(zuul_log_id) as console:
- if t.isAlive():
+ if t.is_alive():
console.addLine("[Zuul] standard output/error still open "
"after child exited")
# ZUUL: stdout and stderr are in the console log file
@@ -495,7 +495,7 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
finally:
if t:
with Console(zuul_log_id) as console:
- if t.isAlive():
+ if t.is_alive():
console.addLine("[Zuul] standard output/error still open "
"after child exited")
if fail_json_kwargs:
diff --git a/zuul/lib/log_streamer.py b/zuul/lib/log_streamer.py
index 16b72227..9ed124c5 100644
--- a/zuul/lib/log_streamer.py
+++ b/zuul/lib/log_streamer.py
@@ -181,7 +181,7 @@ class LogStreamer(object):
raise
def stop(self):
- if self.thd.isAlive():
+ if self.thd.is_alive():
self.server.shutdown()
self.server.server_close()
self.thd.join()
--
2.25.4

View file

@ -0,0 +1,36 @@
From e8935676a8b6db3b29d419d440f9e82b5090a5b2 Mon Sep 17 00:00:00 2001
From: Fabien Boucher <fboucher@redhat.com>
Date: Mon, 13 Jul 2020 15:32:53 +0000
Subject: [PATCH] Update cherrypy and cheroot requirement pinning
Cheroot 8.3.1 have been released with the https://github.com/cherrypy/cheroot/issues/263
fix.
Change-Id: I83aad30a6145ed2c7689d6c25c624c453c07ed2b
---
requirements.txt | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index 78eb980f..829c7606 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -29,13 +29,10 @@ iso8601
psutil
fb-re2>=1.0.6
paho-mqtt
-cherrypy==18.3.0; # last version to support cheroot below
+cherrypy
ws4py
routes
pathspec
jsonpath-rw
urllib3!=1.25.4,!=1.25.5 # https://github.com/urllib3/urllib3/pull/1684
-# TODO(tobiash): cheroot 8.1.0 introduced a regression when handling concurrent
-# requests. Remove the following line when this issue is resolved:
-# https://github.com/cherrypy/cheroot/issues/263
-cheroot<8.1.0
+cheroot!=8.1.*,!=8.2.*,!=8.3.0 # https://github.com/cherrypy/cheroot/issues/263
--
2.27.0

View file

@ -0,0 +1,28 @@
From ea0b50c90d22a2f24b288e1a91e2b85f17059cbc Mon Sep 17 00:00:00 2001
From: Tristan Cacqueray <tdecacqu@redhat.com>
Date: Mon, 25 May 2020 17:39:59 +0000
Subject: [PATCH] requirements: add explicit reference to dateutil
Zuul is using a dateutil provided transitively. This change
makes the requirements explicit.
Change-Id: I672d409a1bb241e5d199c77acdd51a8260d99ee2
---
requirements.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/requirements.txt b/requirements.txt
index 732aa35a..78eb980f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,6 +4,7 @@ importlib-resources==1.0.2
# Early virtualenv 20 had bad file location assumptions
virtualenv!=20.0.0,!=20.0.1,>20
+python-dateutil
github3.py>=1.1.0
PyYAML>=3.1.0
paramiko>=2.0.1
--
2.25.4

279
README.md Normal file
View file

@ -0,0 +1,279 @@
# Getting started with Zuul on Fedora
## Upstream documentation
The upstream documentation is available at: https://zuul-ci.org/docs/zuul/index.html
## Installation
This section describes the installation process of the minimal set of Zuul components to
get a working Zuul deployment. Please refer to the upstream documentation for advanced
setup.
Zuul requires a Web, a Zookeeper and SQL server running. This documentation covers all the step
to bootstrap Zuul.
### Install and setup Zookeeper
This process describes the minimal steps to get a Zookeeper service running. You
should refer to the Zookeeper documentation to get a production setup if needed.
```
$ mkdir /tmp/zookeeper && cd /tmp/zookeeper
$ curl -OL https://downloads.apache.org/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
$ tar -xvzf apache-zookeeper-3.6.1-bin.tar.gz
$ cp apache-zookeeper-3.6.1-bin/conf/zoo_sample.cfg apache-zookeeper-3.6.1-bin/conf/zoo.cfg
$ sudo apache-zookeeper-3.6.1-bin/bin/zkServer.sh start
```
### Install and setup postgresql
This process describes the minimal steps to get a postgres service running. You
should refer to the postgrres documentation to get a production setup if needed.
```
$ sudo dnf install -y posgresql python3-psycopg2
$ su - postgres
$ psql
ALTER USER postgres WITH PASSWORD 'mypassword';
$ createdb --owner=postgres zuul
$ exit
```
Update the local access setting:
```
$ sudo sed -i 's|127.0.0.1/32 ident|127.0.0.1/32 md5|' /var/lib/pgsql/data/pg_hba.conf
$ sudo systemctl restart posgreql
```
Validate server connection by running:
```
$ psql -h 127.0.0.1 -U postgres -W zuul
```
### Install Zuul components
To install the packages run:
```
$ sudo dnf install zuul-scheduler zuul-executor zuul-web zuul-webui
```
### Update the zuul configuration to define the sql connection
In /etc/zuul/zuul.conf add the following:
```
[connection sqlreporter]
driver=sql
dburi=postgresql://postgres:mypassword@127.0.0.1:5432/zuul
```
### Setup Ansible virtual environment for the Zuul executor
The Zuul executor is the component in charge of running Zuul Jobs. A Zuul job is
a set of Ansible playbook. The Zuul executor supports multiple version of Ansible.
Zuul provides a tool to manage the Ansible virtual environments. To initialize them
run:
```
$ sudo -u zuul bash -c "cd && zuul-manage-ansible -u -r /var/lib/zuul/ansible-bin"
```
### Build the Zuul web UI
The Zuul web UI is a React application. The Zuul packaging provides the source code of
the application. The following process describe how to compile the source to get a
production build:
```
$ curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo dnf install yarn
$ cd /usr/share/zuul-ui/
$ yarn install
$ REACT_APP_ZUUL_API='<api_url>' yarn build
```
Replace <api_url> by the URL where the zuul-web API is listening.
### Start the scheduler and executor
To do so run:
```
$ sudo -u zuul bash -c "ssh-keygen -t rsa -N '' -f /var/lib/zuul/.ssh/id_rsa"
$ sudo systemctl start zuul-scheduler
$ sudo systemctl start zuul-executor
```
The services logs are available into /var/log/zuul/zuul.log.
### Setup the web API
Install Apache:
```
$ sudo dnf install httpd
$ setsebool -P httpd_can_network_connect on
```
Then setup the reverve proxy by adding to /etc/httpd/conf.d/zuul.conf the
following content:
```
RewriteEngine on
RewriteRule ^/api/tenant/(.*)/console-stream ws://localhost:9000/api/tenant/$1/console-stream [P]
RewriteRule ^/(.*)$ http://localhost:9000/$1 [P]
```
Reload Apache:
```
$ sudo systemctl relead httpd
```
Finally start the zuul-web process
```
$ sudo systemctl start zuul-web
```
Validate the direct access to the API by running:
```
$ curl http://localhost:9000/api/tenants
```
Validate the access to the API via the reverse proxy:
```
$ curl http://<site_url>/api/tenants
```
## Run a first Zuul job
In this section, you'll find the steps to get a first periodic job running.
Please note that, this is a really basic configuration to ensure the services are working
as expected. To go further, please refer to the Zuul documentation to learn how to connect
Zuul to Code Review systems such as Github, Gerrit, Pagure. This demo uses the local system
to run jobs but this has serious limitation and should not be used in production.
Thus Nodepool must be used as the nodes and containers provider for Zuul.
Nodepool supports various cloud providers. Nodepool is packaged into Fedora and here is
its documentaion: https://zuul-ci.org/docs/nodepool/
### Prepare a Git repository to host the CI configuration
We need to prepare a local Git repository to host the pipelines and jobs configuration.
Follow the process below:
```
$ git init /home/fedora/zuul-config
```
In /home/fedora/zuul-config/.zuul.yaml add the following content:
```
- pipeline:
name: periodic
post-review: true
description: Jobs in this queue are triggered every minute.
manager: independent
precedence: low
trigger:
timer:
- time: '* * * * *'
success:
sqlreporter:
failure:
sqlreporter:
- job:
name: my-noop
description: Minimal working job
parent: null
run: my-noop.yaml
- project:
periodic:
jobs:
- my-noop
```
Create the /home/fedora/zuul-config/my-noop.yaml and add the following content:
```
---
- hosts: localhost
tasks:
- name: List working directory
command: ls -al {{ ansible_user_dir }}
- name: Sleep 30 seconds
wait_for:
timeout: 30
```
Then commit the configuration by running:
```
$ cd /home/fedora/zuul-config/
$ git config user.name "John Doe"
$ git config user.email "john@localhost"
$ git add -A .
$ git commit -m"Init demo config"
```
### Run a Git deamon to serve the config repository
```
$ sudo dnf install -y python3-dulwich
$ dulwich web-daemon -l 0.0.0.0 /
```
### Add the new connection in the Zuul configuration
In /etc/zuul/zuul.conf add the following:
```
[connection local_git]
driver=git
baseurl=http://localhost:8000/home/fedora
poll_delay=300
```
### Setup the Zuul tenant configuration file
In /etc/zuul/main.yaml add the following:
```
- tenant:
name: default
source:
local_git:
config-projects:
- zuul-config
```
### Restart the Zuul services
```
$ sudo systemctl restart zuul-*
```
### Verify the job executed periodically
Run the following command to access the builds API endpoint and ensure the
my-noop job run as expected every minutes w/o errors.
```
$ curl http://<host>/api/tenant/default/builds | python -m json.tool
```
Access the build page, where you should see the periodic job my-noop runs
```
http://<host>/t/default/builds
```

View file

@ -1 +0,0 @@
Orphaned for 6+ weeks

34
logging.conf Normal file
View file

@ -0,0 +1,34 @@
[loggers]
keys=root,zuul
[handlers]
keys=console,normal
[formatters]
keys=simple
[logger_root]
level=INFO
handlers=console
[logger_zuul]
level=INFO
handlers=normal
qualname=zuul
propagate=0
[handler_console]
level=INFO
class=StreamHandler
formatter=simple
args=(sys.stdout,)
[handler_normal]
level=INFO
class=logging.handlers.TimedRotatingFileHandler
formatter=simple
args=('/var/log/zuul/zuul.log', 'midnight', 1, 30,)
[formatter_simple]
format=%(asctime)s %(levelname)s %(name)s: %(message)s
datefmt=

3
main.yaml Normal file
View file

@ -0,0 +1,3 @@
- tenant:
name: default
source: {}

1
sources Normal file
View file

@ -0,0 +1 @@
SHA512 (zuul-3.19.1.tar.gz) = 0460e7e8407cd9cc005d1c05be718ca350a526cb7db44bfb1e8fe702a28c127ad828d6f6a7b1786205722e778def571fae80663db3d371df8a06e6b37ca50d89

View file

@ -0,0 +1,86 @@
- name: Install dulwich
package:
name: python3-dulwich
state: present
become: true
- name: Create a local git repository
shell: git init {{ ansible_user_dir }}/zuul-config
- name: Create .zuul.yaml
copy:
src: zuul.yaml
dest: "{{ ansible_user_dir }}/zuul-config/.zuul.yaml"
- name: Create my-noop.yaml
copy:
src: my-noop.yaml
dest: "{{ ansible_user_dir }}/zuul-config/my-noop.yaml"
- name: Commit zuul-config changes
shell: "{{ item }}"
register: cmd
failed_when:
- cmd.rc != 0
- not "'nothing to commit' in cmd.stdout"
args:
chdir: "{{ ansible_user_dir }}/zuul-config/"
loop:
- git config user.name "John Doe"
- git config user.email "john@localhost"
- git add -A .
- git commit -m"Init demo config"
- name: Ensure dulwich down
shell: pkill -f web-daemon
ignore_errors: true
# https://bugzilla.redhat.com/show_bug.cgi?id=1866463
- name: Ensure dulwich running
shell: "python3 /usr/lib64/python3.9/site-packages/dulwich/cli.py web-daemon -l 0.0.0.0 / &"
- name: Add the git connection into the zuul config
blockinfile:
path: /etc/zuul/zuul.conf
marker: "# {mark} local_git"
block: |
[connection local_git]
driver=git
baseurl=http://localhost:8000/{{ ansible_user_dir }}
poll_delay=300
become: true
- name: Setup the Zuul default tenant to load zuul-config
copy:
src: main.yaml
dest: /etc/zuul/main.yaml
become: true
- name: Restart Zuul components
service:
name: "{{ item }}"
state: restarted
become: true
loop:
- zuul-scheduler
- zuul-executor
- zuul-web
- name: Give some time to services to fully start
pause:
seconds: 15
- name: Check zuul services are up
shell: systemctl is-active {{ item }}
loop:
- zuul-scheduler
- zuul-executor
- zuul-web
become: true
- name: Give some time to Zuul to trigger and execute the job
pause:
minutes: 2
- name: Ensure the my-noop job was executed
shell: python -c "import requests; r = requests.get('http://localhost/api/tenant/default/builds').json(); assert r[0]['job_name'] == 'my-noop'; assert r[0]['result'] == 'SUCCESS'"

10
tests/install_zuul.yml Normal file
View file

@ -0,0 +1,10 @@
- name: Install Zuul packages
package:
name:
- zuul-scheduler
- zuul-executor
- zuul-web
- zuul-webui
- zuul-doc
state: present
become: true

6
tests/main.yaml Normal file
View file

@ -0,0 +1,6 @@
- tenant:
name: default
source:
local_git:
config-projects:
- zuul-config

8
tests/my-noop.yaml Normal file
View file

@ -0,0 +1,8 @@
---
- hosts: localhost
tasks:
- name: List working directory
command: ls -al {{ ansible_user_dir }}
- name: Sleep 30 seconds
wait_for:
timeout: 30

3
tests/orig_main.yaml Normal file
View file

@ -0,0 +1,3 @@
- tenant:
name: default
source: {}

56
tests/setup_postgres.yml Normal file
View file

@ -0,0 +1,56 @@
- name: Install postgres
package:
name:
- postgresql
- postgresql-server
- python3-psycopg2
state: present
become: true
- name: Init postgreql DB
shell: /usr/bin/postgresql-setup --initdb
ignore_errors: true
become: true
- name: Start postgres
service:
name: postgresql
state: started
become: true
- name: Wait for the service to be up
pause:
seconds: 15
- name: Setup a postgres admin password
shell: psql -c "ALTER USER postgres WITH PASSWORD 'mypassword';"
become_user: postgres
become: true
environment:
PGPASSWORD: mypassword
- name: Create the database for zuul
shell: createdb --owner=postgres zuul
register: cmd
failed_when: cmd.rc != 0 and not "'already exists' in cmd.stderr"
# ignore_errors: true
become_user: postgres
become: true
environment:
PGPASSWORD: mypassword
- name: Enable auth access
shell: sed -i 's|127.0.0.1/32 ident|127.0.0.1/32 md5|' /var/lib/pgsql/data/pg_hba.conf
become: true
- name: Restart postgres
service:
name: postgresql
state: restarted
become: true
- name: Ensure postgres access
shell: psql -h 127.0.0.1 -U postgres zuul -c "\dt"
environment:
PGPASSWORD: mypassword

34
tests/setup_zookeeper.yml Normal file
View file

@ -0,0 +1,34 @@
- name: Install JDK
package:
name: java-latest-openjdk
state: present
become: true
- name: Create /tmp/zookeeper
file:
path: /tmp/zookeeper
state: directory
become: true
- name: Get and extract Zookeeper
unarchive:
src: https://downloads.apache.org/zookeeper/zookeeper-{{ zookeeper_version }}/apache-zookeeper-{{ zookeeper_version }}-bin.tar.gz
dest: /tmp/zookeeper
remote_src: yes
become: true
- name: Setup Zookeeper config file
copy:
src: /tmp/zookeeper/apache-zookeeper-{{ zookeeper_version }}-bin/conf/zoo_sample.cfg
dest: /tmp/zookeeper/apache-zookeeper-{{ zookeeper_version }}-bin/conf/zoo.cfg
remote_src: true
become: true
- name: Ensure Zookeeper not running
command: pkill -f zookeeper
ignore_errors: true
become: true
- name: Start Zookeeper
shell: /tmp/zookeeper/apache-zookeeper-{{ zookeeper_version }}-bin/bin/zkServer.sh start
become: true

56
tests/setup_zuul_core.yml Normal file
View file

@ -0,0 +1,56 @@
- name: Ensure scheduler and executor service are down
service:
name: "{{ item }}"
state: stopped
loop:
- zuul-executor
- zuul-scheduler
become: true
- name: Setup the Zuul default tenant to be empty
copy:
src: orig_main.yaml
dest: /etc/zuul/main.yaml
become: true
- name: Define the sql connection
blockinfile:
path: /etc/zuul/zuul.conf
marker: "# {mark} sqlreporter"
block: |
[connection sqlreporter]
driver=sql
dburi=postgresql://postgres:mypassword@127.0.0.1:5432/zuul
become: true
- name: Setup Ansible virtual environment for the Zuul executor
shell: zuul-manage-ansible -u -r /var/lib/zuul/ansible-bin
become_user: zuul
become: true
- name: Create ssh keypair for Zuul
shell: ssh-keygen -t rsa -N '' -f /var/lib/zuul/.ssh/id_rsa
args:
creates: /var/lib/zuul/.ssh/id_rsa
become_user: zuul
become: true
- name: Start scheduler and executor services
service:
name: "{{ item }}"
state: started
loop:
- zuul-executor
- zuul-scheduler
become: true
- name: Give some time to services to fully start
pause:
seconds: 15
- name: Check zuul core services are up
shell: systemctl is-active {{ item }}
loop:
- zuul-executor
- zuul-scheduler
become: true

80
tests/setup_zuul_web.yml Normal file
View file

@ -0,0 +1,80 @@
- name: Ensure zuul-web service is down
service:
name: zuul-web
state: stopped
become: true
- name: Install httpd
package:
name:
- httpd
state: present
become: true
- name: Ensure httpd can connect to zuul-web
command: setsebool -P httpd_can_network_connect on
become: true
- name: Add the reverse proxy setting in httpd
blockinfile:
create: true
path: /etc/httpd/conf.d/zuul.conf
block: |
RewriteEngine on
RewriteRule ^/api/tenant/(.*)/console-stream ws://localhost:9000/api/tenant/$1/console-stream [P]
RewriteRule ^/(.*)$ http://localhost:9000/$1 [P]
become: true
- name: Reload httpd
service:
name: httpd
state: reloaded
become: true
- name: Add the yarn yum repository
shell: "curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo"
become: true
- name: Install yarn
package:
name: yarn
state: present
become: true
- name: Start a production build of the Zuul web UI
shell: "{{ item }}"
args:
chdir: /usr/share/zuul-ui/
environment:
REACT_APP_ZUUL_API: 'http://domain.com'
loop:
- yarn install
- yarn build
become: true
- name: Ensure zuul-web service is up
service:
name: zuul-web
state: started
become: true
- name: Give some time to services to fully start
pause:
seconds: 15
- name: Check zuul web services are up
shell: systemctl is-active {{ item }}
loop:
- zuul-web
- httpd
become: true
- name: Check we can access the Zuul API
shell: curl http://localhost:9000/api/tenants
register: cmd
failed_when: not "'default' in cmd.stdout"
- name: Check we can access the Zuul API via httpd
shell: curl http://localhost/api/tenants
register: cmd
failed_when: not "'default' in cmd.stdout"

23
tests/tests.yml Normal file
View file

@ -0,0 +1,23 @@
- hosts: localhost
vars:
zookeeper_version: "3.6.1"
tasks:
- import_tasks: setup_zookeeper.yml
tags:
- zookeeper
- import_tasks: setup_postgres.yml
tags:
- postgres
- import_tasks: install_zuul.yml
tags:
- install_zuul
- import_tasks: setup_zuul_core.yml
tags:
- setup_zuul_core
- import_tasks: setup_zuul_web.yml
tags:
- setup_zuul_web
# Now configure Zuul to run a job
- import_tasks: configure_zuul_jobs.yml
tags:
- configure_zuul_jobs

24
tests/zuul.yaml Normal file
View file

@ -0,0 +1,24 @@
- pipeline:
name: periodic
post-review: true
description: Jobs in this queue are triggered every minute.
manager: independent
precedence: low
trigger:
timer:
- time: '* * * * *'
success:
sqlreporter:
failure:
sqlreporter:
- job:
name: my-noop
description: Minimal working job
parent: null
run: my-noop.yaml
- project:
periodic:
jobs:
- my-noop

15
zuul-executor.service Normal file
View file

@ -0,0 +1,15 @@
[Unit]
Description=Zuul Executor Service
After=network.target
[Service]
Type=simple
User=zuul
Group=zuul
SyslogIdentifier=zuul-executor
EnvironmentFile=-/etc/sysconfig/zuul
ExecStart=/usr/bin/zuul-executor -f
PrivateTmp=true
[Install]
WantedBy=multi-user.target

14
zuul-fingergw.service Normal file
View file

@ -0,0 +1,14 @@
[Unit]
Description=Zuul Finger Gateway Service
After=network.target
[Service]
Type=simple
User=root
Group=root
SyslogIdentifier=zuul-fingergw
EnvironmentFile=-/etc/sysconfig/zuul
ExecStart=/usr/bin/zuul-fingergw -f
[Install]
WantedBy=multi-user.target

15
zuul-merger.service Normal file
View file

@ -0,0 +1,15 @@
[Unit]
Description=Zuul Merger Service
After=network.target
[Service]
Type=simple
User=zuul
Group=zuul
LimitNOFILE=8192
SyslogIdentifier=zuul-merger
EnvironmentFile=-/etc/sysconfig/zuul
ExecStart=/usr/bin/zuul-merger -f
[Install]
WantedBy=multi-user.target

15
zuul-scheduler.service Normal file
View file

@ -0,0 +1,15 @@
[Unit]
Description=Zuul Scheduler Service
After=network.target
[Service]
Type=simple
User=zuul
Group=zuul
SyslogIdentifier=zuul-scheduler
EnvironmentFile=-/etc/sysconfig/zuul
ExecStart=/usr/bin/zuul-scheduler -f
ExecReload=/usr/bin/zuul-scheduler smart-reconfigure
[Install]
WantedBy=multi-user.target

14
zuul-web.service Normal file
View file

@ -0,0 +1,14 @@
[Unit]
Description=Zuul Web Service
After=network.target
[Service]
Type=simple
User=zuul
Group=zuul
SyslogIdentifier=zuul-web
EnvironmentFile=-/etc/sysconfig/zuul
ExecStart=/usr/bin/zuul-web -f
[Install]
WantedBy=multi-user.target

82
zuul.conf Normal file
View file

@ -0,0 +1,82 @@
[gearman]
server=127.0.0.1
;port=4730
;ssl_ca=/path/to/ca.pem
;ssl_cert=/path/to/client.pem
;ssl_key=/path/to/client.key
[statsd]
server=127.0.0.1
[zookeeper]
hosts=127.0.0.1:2181
[gearman_server]
start=true
;ssl_ca=/path/to/ca.pem
;ssl_cert=/path/to/server.pem
;ssl_key=/path/to/server.key
;port=4730
[scheduler]
tenant_config=/etc/zuul/main.yaml
log_config=/etc/zuul/logging.conf
pidfile=/var/run/zuul/zuul.pid
state_dir=/var/lib/zuul
[merger]
git_dir=/var/lib/zuul/git
;git_user_email=zuul@example.com
;git_user_name=zuul
[executor]
default_username=zuul
log_config=/etc/zuul/logging.conf
;trusted_ro_paths=/opt/zuul-scripts:/var/cache
;trusted_rw_paths=/opt/zuul-logs
[web]
log_config=/etc/zuul/logging.conf
listen_address=127.0.0.1
port=9000
static_cache_expiry=0
status_url=https://zuul.example.com/status
static_path=/usr/share/zuul-ui/build
[webclient]
url=https://zuul.example.com
verify_ssl=true
[auth zuul_operator]
driver=HS256
allow_authz_override=true
realm=zuul.example.com
default=true
client_id=zuul.example.com
issuer_id=zuul_operator
secret=NoDanaOnlyZuul
max_validity_time=36000
skew=0
;[connection gerrit]
;driver=gerrit
;server=review.example.com
;baseurl=https://review.example.com/r
;user=jenkins
;sshkey=/home/jenkins/.ssh/id_rsa
;keepalive=60
[connection smtp]
driver=smtp
server=localhost
port=25
default_from=zuul@example.com
default_to=you@example.com
;[connection mqtt]
;driver=mqtt
;server=localhost
;user=zuul
;password=zuul
;keepalive=60

61
zuul.rpmlintrc Normal file
View file

@ -0,0 +1,61 @@
# Documentation in a separate sub-package
addFilter("zuul.noarch: W: no-documentation")
addFilter("zuul-executor.noarch: W: no-documentation")
addFilter("zuul-fingergw.noarch: W: no-documentation")
addFilter("zuul-merger.noarch: W: no-documentation")
addFilter("zuul-migrate.noarch: W: no-documentation")
addFilter("zuul-scheduler.noarch: W: no-documentation")
addFilter("zuul-web.noarch: W: no-documentation")
addFilter("zuul-webui.noarch: W: no-documentation")
# Expected - Zuul services should run as the zuul user identity
addFilter("zuul.noarch: W: non-standard-uid /etc/zuul/logging.conf zuul")
addFilter("zuul.noarch: W: non-standard-gid /etc/zuul/logging.conf zuul")
addFilter("zuul.noarch: W: non-standard-uid /etc/zuul/zuul.conf zuul")
addFilter("zuul.noarch: W: non-standard-gid /etc/zuul/zuul.conf zuul")
addFilter("zuul.noarch: W: non-standard-uid /etc/zuul/main.yaml zuul")
addFilter("zuul.noarch: W: non-standard-gid /etc/zuul/main.yaml zuul")
addFilter("zuul.noarch: W: non-standard-uid /var/lib/zuul zuul")
addFilter("zuul.noarch: W: non-standard-gid /var/lib/zuul zuul")
addFilter("zuul.noarch: W: non-standard-uid /var/lib/zuul/.ssh zuul")
addFilter("zuul.noarch: W: non-standard-gid /var/lib/zuul/.ssh zuul")
addFilter("zuul.noarch: W: non-standard-uid /var/lib/zuul/ansible zuul")
addFilter("zuul.noarch: W: non-standard-gid /var/lib/zuul/ansible zuul")
addFilter("zuul.noarch: W: non-standard-uid /var/lib/zuul/keys zuul")
addFilter("zuul.noarch: W: non-standard-gid /var/lib/zuul/keys zuul")
addFilter("zuul.noarch: W: non-standard-uid /var/log/zuul zuul")
addFilter("zuul.noarch: W: non-standard-gid /var/log/zuul zuul")
addFilter("zuul-executor.noarch: W: non-standard-uid /var/lib/zuul/ansible zuul")
addFilter("zuul-executor.noarch: W: non-standard-gid /var/lib/zuul/ansible zuul")
addFilter("zuul-executor.noarch: W: non-standard-uid /var/lib/zuul/executor zuul")
addFilter("zuul-executor.noarch: W: non-standard-gid /var/lib/zuul/executor zuul")
# Expected - zuul.conf can store credentials
addFilter("zuul.noarch: E: non-readable /etc/zuul/zuul.conf 640")
# Expected - See upstream comments https://review.opendev.org/728955
addFilter("zuul.noarch: E: non-executable-script /usr/lib/python3.9/site-packages/zuul/ansible/base/library/command.py 644 /usr/bin/python3")
addFilter("zuul.noarch: E: non-executable-script /usr/lib/python3.9/site-packages/zuul/ansible/base/library/zuul_console.py 644 /usr/bin/python3")
# Expected - Zuul runtime expects to find that directory
addFilter("zuul.noarch: W: hidden-file-or-dir /var/lib/zuul/.ssh")
addFilter("zuul.noarch: W: hidden-file-or-dir /var/lib/zuul/.ssh")
# Expected - Provided Python logging configuration configures the rotation
addFilter("zuul.noarch: W: log-files-without-logrotate \['/var/log/zuul'\]")
# Expected - upstream does not provide man pages
addFilter("zuul.noarch: W: no-manual-page-for-binary zuul")
addFilter("zuul.noarch: W: no-manual-page-for-binary zuul-bwrap")
addFilter("zuul-executor.noarch: W: no-manual-page-for-binary zuul-executor")
addFilter("zuul-executor.noarch: W: no-manual-page-for-binary zuul-manage-ansible")
addFilter("zuul-fingergw.noarch: W: no-manual-page-for-binary zuul-fingergw")
addFilter("zuul-merger.noarch: W: no-manual-page-for-binary zuul-merger")
addFilter("zuul-migrate.noarch: W: no-manual-page-for-binary zuul-migrate")
addFilter("zuul-scheduler.noarch: W: no-manual-page-for-binary zuul-scheduler")
addFilter("zuul-web.noarch: W: no-manual-page-for-binary zuul-web")
# Expected - executor service require python3-devel to install ansible virtualenvs
addFilter("zuul-executor.noarch: E: devel-dependency python3-devel")
# Expected - gearman is a protocol name
addFilter("zuul-scheduler.noarch: W: spelling-error %description -l en_US gearman -> gear man, gear-man, germane")
# Expected - executor devel-dependency
addFilter("zuul-executor.noarch: E: devel-dependency libffi-devel")
addFilter("zuul-executor.noarch: E: explicit-lib-dependency libffi-devel")
# No idea for this one
addFilter("zuul-doc.noarch: W: wrong-file-end-of-line-encoding /usr/share/doc/zuul-doc/html/objects.inv")
# Expected - https://github.com/rpm-software-management/rpmlint/issues/427
addFilter("zuul.noarch: E: useless-provides bundled\(ansible\)")

550
zuul.spec Normal file
View file

@ -0,0 +1,550 @@
Name: zuul
Version: 3.19.1
Release: 1%{?dist}
Summary: Trunk Gating System
# The entire source code is ASL 2.0 except files under %%{python3_sitelib}/zuul/ansible which is GPLv3+
License: ASL 2.0 and GPLv3+
URL: https://zuul-ci.org
Source0: %pypi_source
Source2: zuul-scheduler.service
Source3: zuul-merger.service
Source4: zuul-executor.service
Source5: zuul-web.service
Source6: zuul-fingergw.service
Source7: README.md
Source8: zuul.conf
Source9: logging.conf
Source10: main.yaml
Patch01: 0001-Remove-another-shebang-and-remove-useless-exec-bits.patch
Patch02: 0001-requirements-add-explicit-reference-to-dateutil.patch
Patch03: 0001-Replace-deprecated-Thread.isAlive-with-Thread.is_ali.patch
Patch04: 0001-Update-cherrypy-and-cheroot-requirement-pinning.patch
BuildArch: noarch
BuildRequires: python3-devel
BuildRequires: python3-pbr
BuildRequires: python3-setuptools
BuildRequires: python3-zuul-sphinx
BuildRequires: python3-snowballstemmer
BuildRequires: python3-fixtures
BuildRequires: python3-sphinx-autodoc-typehints
BuildRequires: python3-sphinxcontrib-blockdiag
BuildRequires: python3-sphinxcontrib-programoutput
BuildRequires: python3-sphinxcontrib-openapi
BuildRequires: python3-reno
BuildRequires: python3-CacheControl
BuildRequires: python3-jwt
BuildRequires: python3-github3py
BuildRequires: python3-pyyaml
BuildRequires: python3-paramiko
BuildRequires: python3-GitPython
BuildRequires: python3-daemon
BuildRequires: python3-extras
BuildRequires: python3-statsd
BuildRequires: python3-voluptuous
BuildRequires: python3-gear
BuildRequires: python3-APScheduler
BuildRequires: python3-prettytable
BuildRequires: python3-babel
BuildRequires: python3-kazoo
BuildRequires: python3-sqlalchemy
BuildRequires: python3-alembic
BuildRequires: python3-cryptography
BuildRequires: python3-cherrypy
BuildRequires: python3-ws4py
BuildRequires: python3-routes
BuildRequires: python3-netaddr
BuildRequires: python3-paho-mqtt
BuildRequires: python3-psutil
BuildRequires: python3-fb-re2
BuildRequires: python3-cachetools
BuildRequires: python3-jsonpath-rw
BuildRequires: python3-dateutil
BuildRequires: python3-iso8601
BuildRequires: python3-PyMySQL
BuildRequires: python3-psycopg2
BuildRequires: python3-pathspec
BuildRequires: python3-graphene
BuildRequires: systemd
BuildRequires: ansible
Provides: bundled(ansible) = 2.9
Provides: bundled(ansible) = 2.8
Provides: bundled(ansible) = 2.7
%description
Zuul is a program that drives continuous integration, delivery,
and deployment systems with a focus on project gating and
interrelated projects.
%package webui
Summary: The Zuul web interface
%description webui
This package provides the Zuul web interface source code.
Please refers to README.fedora for build and deployment instruction.
%package scheduler
Summary: The Zuul scheduler service
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: systemd
%description scheduler
The main Zuul process. Handles receiving events, executing jobs,
collecting results and posting reports. Coordinates the work of
the other components. It also provides a gearman daemon which
the other components use for coordination.
%package merger
Summary: The Zuul merger service
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: systemd
%description 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 Zuuls processing.
This component is optional (zero or more of these can be run).
%package web
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: nodejs
Summary: The Zuul web service
%description web
A web server that receives “web-hook” events from external providers,
supplies a web dashboard, and provides web-socket access to live
streaming of logs.
%package executor
Summary: The Zuul executor service
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: systemd
Requires: git-core
Requires: bubblewrap
# zuul-manage-ansible requires them to create ansible virtualenvs
## Requires: python3-virtualenv
Requires: gcc
Requires: python3-devel
Requires: libffi-devel
%description 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.
%package fingergw
Summary: Executor finger gateway service
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: systemd
%description fingergw
A gateway which provides finger protocol access to live streaming of logs.
%package migrate
Summary: Migrate zuul v2 and Jenkins Job Builder to Zuul v3
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: bubblewrap
%description migrate
Migrate zuul v2 and Jenkins Job Builder to Zuul v3
%package doc
Summary: Zuul documentation
%description doc
The Zuul HTML documentation
%prep
%autosetup -n zuul-%{version} -p1
sed -i '/^importlib-resources.*/d' requirements.txt
# remove extra uneeded shebangs in zuul_return
# archive on pypi do not preserve links
# could be removed at next release
find zuul/ansible/ -type f -name "zuul_return.py" \
-exec sed -i '/\/usr\/bin\/python/d' {} \;
# Inject package version
cat << EOF > zuul/version.py
is_release = True
release_string = "%{version}-%{release}"
class version_info:
def release_string():
return release_string
EOF
# Fix non compliant shebangs
/usr/bin/pathfix.py -i %{python3} -p -n -k zuul/ansible
install -m 0644 %{SOURCE7} README.fedora
# Fix 0001-Replace-deprecated-Thread.isAlive-with-Thread.is_ali.patch not fully apply
# due to pypi archive removing the symlinks
cp zuul/ansible/base/library/command.py zuul/ansible/2.7/library/
cp zuul/ansible/base/library/command.py zuul/ansible/2.8/library/
cp zuul/ansible/base/library/command.py zuul/ansible/2.9/library/
%build
%py3_build
# Create fake zuul clients suitable for sphinx programoutput
cp zuul/cmd/client.py build/zuul
sed -i '1i \#!/usr/bin/env python3' build/zuul
chmod +x build/zuul
cp zuul/cmd/manage_ansible.py build/zuul-manage-ansible
sed -i '1i \#!/usr/bin/env python3' build/zuul-manage-ansible
chmod +x build/zuul-manage-ansible
# Generate documentation (without release note because source doesn't have git log)
sed -e 's/^ *releasenotes$//' -i doc/source/reference/index.rst
rm doc/source/reference/releasenotes.rst
# TODO: https://bugzilla.redhat.com/show_bug.cgi?id=1849654
# sed '/sphinx_autodoc_typehints/d' -i doc/source/conf.py
PYTHONPATH=../../build/lib PATH=$PATH:$(pwd)/build PBR_VERSION=%{version} SPHINX_DEBUG=1 sphinx-build-3 \
-b html doc/source build/html
# Remove empty stub files
find build -type f -name "*.pyi" -size 0 -delete
# rm doc build leftovers
rm -Rf build/html/.buildinfo build/html/.doctrees
# Fix file-not-utf8
iconv -f iso8859-1 -t utf-8 build/html/objects.inv > build/html/objects.inv.conv && \
mv -f build/html/objects.inv.conv build/html/objects.inv
# Fix wrong-file-end-of-line-encoding
sed -i 's/\r$//' LICENSE
sed -i 's/\r$//' build/html/objects.inv
%install
install -p -d -m 0755 %{buildroot}/%{_datadir}/zuul-ui
mv web/* %{buildroot}/%{_datadir}/zuul-ui/
%py3_install
rm -Rf %{buildroot}%{python3_sitelib}/zuul/web/static
install -p -D -m 0644 %{SOURCE2} %{buildroot}%{_unitdir}/zuul-scheduler.service
install -p -D -m 0644 %{SOURCE3} %{buildroot}%{_unitdir}/zuul-merger.service
install -p -D -m 0644 %{SOURCE4} %{buildroot}%{_unitdir}/zuul-executor.service
install -p -D -m 0644 %{SOURCE5} %{buildroot}%{_unitdir}/zuul-web.service
install -p -D -m 0644 %{SOURCE6} %{buildroot}%{_unitdir}/zuul-fingergw.service
install -p -D -m 0640 %{SOURCE8} %{buildroot}%{_sysconfdir}/zuul/zuul.conf
install -p -D -m 0644 %{SOURCE9} %{buildroot}%{_sysconfdir}/zuul/logging.conf
install -p -D -m 0644 %{SOURCE10} %{buildroot}%{_sysconfdir}/zuul/main.yaml
install -p -d -m 0700 %{buildroot}%{_sharedstatedir}/zuul
install -p -d -m 0755 %{buildroot}%{_localstatedir}/log/zuul
# Prepare lib directory
install -p -d -m 0700 %{buildroot}%{_sharedstatedir}/zuul/.ssh
install -p -d -m 0755 %{buildroot}%{_sharedstatedir}/zuul/ansible
install -p -d -m 0755 %{buildroot}%{_sharedstatedir}/zuul/executor
install -p -d -m 0755 %{buildroot}%{_sharedstatedir}/zuul/git
install -p -d -m 0700 %{buildroot}%{_sharedstatedir}/zuul/keys
%pre
getent group zuul >/dev/null || groupadd -r zuul
if ! getent passwd zuul >/dev/null; then
useradd -r -g zuul -G zuul -d %{_sharedstatedir}/zuul -s /sbin/nologin -c "Zuul Daemon" zuul
fi
exit 0
%post scheduler
%systemd_post zuul-scheduler.service
%post merger
%systemd_post zuul-merger.service
%post web
%systemd_post zuul-web.service
%post executor
%systemd_post zuul-executor.service
%post fingergw
%systemd_post zuul-fingergw.service
%preun scheduler
%systemd_preun zuul-scheduler.service
%preun merger
%systemd_preun zuul-merger.service
%preun web
%systemd_preun zuul-web.service
%preun executor
%systemd_preun zuul-executor.service
%preun fingergw
%systemd_preun zuul-fingergw.service
%files
%license LICENSE
%doc README.rst
%dir %attr(0755,zuul,zuul) %{_sysconfdir}/zuul
%config(noreplace) %attr(0640,zuul,zuul) %{_sysconfdir}/zuul/zuul.conf
%config(noreplace) %attr(0644,zuul,zuul) %{_sysconfdir}/zuul/main.yaml
%config(noreplace) %attr(0644,zuul,zuul) %{_sysconfdir}/zuul/logging.conf
%dir %attr(0755,zuul,zuul) %{_sharedstatedir}/zuul
%dir %attr(0755,zuul,zuul) %{_sharedstatedir}/zuul/.ssh
%dir %attr(0755,zuul,zuul) %{_sharedstatedir}/zuul/ansible
# Zuul runtime check complains
# Project key directory /var/lib/zuul/keys must be mode 0700; current mode is 755
%dir %attr(0700,zuul,zuul) %{_sharedstatedir}/zuul/keys
%dir %attr(0755,zuul,zuul) %{_localstatedir}/log/zuul
%{python3_sitelib}/zuul
%{python3_sitelib}/zuul-*.egg-info/
%{_bindir}/zuul
%{_bindir}/zuul-bwrap
%files webui
%license LICENSE
%{_datadir}/zuul-ui
%files scheduler
%license LICENSE
%{_bindir}/zuul-scheduler
%{_unitdir}/zuul-scheduler.service
%files merger
%license LICENSE
%{_bindir}/zuul-merger
%{_unitdir}/zuul-merger.service
%files web
%license LICENSE
%{_bindir}/zuul-web
%{_unitdir}/zuul-web.service
%files executor
%license LICENSE
%{_bindir}/zuul-executor
%{_bindir}/zuul-manage-ansible
%{_unitdir}/zuul-executor.service
%dir %attr(0755,zuul,zuul) %{_sharedstatedir}/zuul/ansible
%dir %attr(0755,zuul,zuul) %{_sharedstatedir}/zuul/executor
%files fingergw
%license LICENSE
%{_bindir}/zuul-fingergw
%{_unitdir}/zuul-fingergw.service
%files migrate
%license LICENSE
%{_bindir}/zuul-migrate
%files doc
%license LICENSE
%doc build/html README.fedora
%changelog
* Mon Jul 27 2020 Fabien Boucher <fboucher@redhat.com> - 3.19.1-1
- Bump to 3.19.1
- Fedora rawhide compat
* Tue Mar 3 2020 Tristan Cacqueray <tdecacqu@redhat.com> - 3.18.0-1
- Bump to 3.18.0
- Use -f argument for services
- Use smart-reconfigure command for scheduler reload
* Wed Feb 26 2020 Tristan Cacqueray <tdecacqu@redhat.com> - 3.13.0-2
- Add security fix
* Tue Dec 10 2019 Fabien Boucher <fboucher@redhat.com> - 3.13.0-1
- Bump to 3.13.0
* Tue Oct 22 2019 Fabien Boucher <fboucher@redhat.com> - 3.11.1-1
- Bump to 3.11.1
* Mon Sep 23 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.10.2-2
- Remove SCL leftovers
* Tue Sep 17 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.10.2-1
- Add synchronize rsh security fix
* Thu Aug 15 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.10.1-1
- Bump to 3.10.1
* Mon May 20 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.8.1-3
- Add merger optimization
* Tue May 14 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.8.1-2
- Remove a couple of un-needed patches
* Wed May 8 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.8.1-1
- Bump to 3.8.1
- Remove React service worker
* Wed Apr 17 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.8.0-1
- Bump to 3.8.0
* Mon Mar 25 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.7.1-1
- Bump to 3.7.1
* Mon Mar 18 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.7.0-1
- Bump to 3.7.0
* Mon Feb 11 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.6.0-1
- Bump to 3.6.0
* Fri Feb 8 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.5.0-2
- Cherry-pick github fix
- Fix config endpoint
* Wed Jan 23 2019 Javier Peña <jpena@redhat.com> - 3.5.0-1
- Bump to 3.5.0
* Wed Jan 2 2019 Tristan Cacqueray <tdecacqu@redhat.com> - 3.4.0-1
- Bump to 3.4.0
* Thu Nov 29 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.3.1-1
- Update the openshift resources patches
- Use package version in the zuul.version module
* Tue Nov 6 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.3.0-1
- Bump to 3.3.0
* Mon Sep 24 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.2.0-6
- Add react web interface
* Wed Sep 19 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.2.0-5
- Bump to latest master
* Thu Aug 9 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.2.0-4
- Add timer trigger fix
* Mon Aug 6 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.2.0-3
- Add missing canonical name in scheduler status
* Sat Aug 4 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.2.0-2
- Add node age to webpage
* Mon Jul 30 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.2.0-1
- Bump version
* Wed Jul 18 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.1.0-5
- Bump to last master for ui fix
* Mon Jul 2 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.1.0-4
- Bump to 3.1.1 tech preview
* Fri Jun 22 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.1.0-3
- Add resource connection type patch
- Add patch to get the zuul-scheduler -t validation option
- Add /etc/localtime patch
* Thu Jun 21 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.1.0-2
- Fix tenant status page reload issue
- Add glyphicon status balls
* Fri Jun 15 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.1.0-1
- Bump version to 3.1.0
- Add angular6 patch
* Mon May 28 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.2-2
- Bump ansible patch to 2.5 version
* Fri Apr 13 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.2-1
- Update version to 3.0.2 release
- Update the MQTT driver patch
* Fri Apr 13 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.1-1
- Update version to 3.0.1 release
- Add patch to fix tag reporter
- Update the MQTT driver patch
* Thu Mar 29 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-26
- Update version to 3.0.0 release
* Tue Mar 20 2018 Fabien Boucher <fboucher@redhat.com> - 3.0.0-25
- Bump version for security fixes
- Add patches for supporting zuul to start with a broken config
* Fri Mar 16 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-24
- Bump version for security fixes
- Add new Nodepool dashboards
* Thu Mar 15 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-23
- Bump version
* Tue Mar 13 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-22
- Bump version
* Thu Feb 22 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-21
- Add missing ansible-2.4 fix
* Wed Feb 21 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-20
- Bump version
- Add branch-column patch
- Fix dynamic config loader
* Mon Feb 19 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-19
- Bump version and switch to ansible 2.4 requirement
* Wed Feb 07 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-18
- Bump version
- Add pipelines.json endpoint
* Wed Jan 31 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-17
- Bump version
- Add external webui built with npm
* Mon Jan 22 2018 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-16
- Bump version
- Add config-loader optimization patch
- Add job page description patch
- Add dynamic config load
- Remove with_restart in systemd unit
- Add doc sub package
* Wed Dec 27 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-15
- Bump version
- Add jmespath to the executor requirements
- Add fingergw sub-package
- Add zookeeper retry logic patch
* Tue Dec 05 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-14
- Bump version
* Wed Nov 29 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-13
- Bump version
- Add MQTT driver patch
- Add log_stream options patch
* Fri Nov 17 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-12
- Force ssh known_host to be in scl user home
* Mon Nov 6 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-11
- Bump version and slightly update the patches
* Wed Nov 1 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-10
- Bump version and remove merged patches
* Wed Sep 27 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-9
- Add newrev patch
* Thu Sep 14 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-8
- Add zuul-web interfaces
* Tue Sep 05 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-7
- Add scheduler StartPost command to wait for gearman server.
* Fri Aug 25 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-6
- Fix zuul-web static file missing from python module
- Fix bwrap usage (LD_LIBRARY_PATH is removed by setuid)
- Bump version
* Tue Jul 25 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-5
- Bump version and fix executor reload
* Wed Jul 12 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-4
- Bump version and add zuul-web package
* Thu Jul 6 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-3
- Remove demonization from service file
* Thu Jun 29 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-2
- Fix service reload
* Mon Jun 19 2017 Tristan Cacqueray <tdecacqu@redhat.com> - 3.0.0-1
- Initial packaging