README.md
1 bionicbb
2 ========
3
4 The bionic buildbot contains two services: a gmail polling service, and a web
5 service that interacts with gerrit.
6
7 Dependencies
8 ------------
9
10 * Python 2.7
11 * [Advanced Python Scheduler](https://apscheduler.readthedocs.org/en/latest/)
12 * [Flask](http://flask.pocoo.org/)
13 * [Google API Client Library](https://developers.google.com/api-client-library/python/start/installation)
14 * [jenkinsapi](https://pypi.python.org/pypi/jenkinsapi)
15 * [Requests](http://docs.python-requests.org/en/latest/)
16
17 Setup
18 -----
19
20 Create a `config.py` in the same directory as the sources. The structure of the
21 configuration file is as follows:
22
23 ```python
24 client_secret_file = 'CLIENT_SECRET_FILE.json'
25 build_listener_url = 'BUILD_LISTENER_URL'
26 jenkins_url = 'JENKINS_URL'
27 jenkins_credentials = {
28 'username': 'JENKINS_USERNAME',
29 'password': 'JENKINS_PASSWORD',
30 }
31 ```
32
33 The client secret file comes from the Gmail API page of the [Google Developers
34 Console](https://console.developers.google.com/). The Jenkins credentials are
35 for a Jenkins account that has the appropriate permissions to launch the jobs
36 the buildbot will use.
37
38 You will also need to add the HTTP password for the buildbot's Gerrit account to
39 `~/.netrc`. The HTTP password can be obtained from the [Gerrit HTTP password
40 settings](https://android-review.googlesource.com/#/settings/http-password).
41
42 To launch the services:
43
44 ```bash
45 $ python build_listener.py >build.log 2>&1 &
46 $ python gmail_listener.py >mail.log 2>&1 &
47 ```
48
49 The mail listener will direct your browser to an authentication page for the
50 Gmail API.
51
52 gmail\_listener.py
53 ------------------
54
55 Bionicbb polls a gmail account to find changes that need to be built. The gmail
56 account needs to have a gerrit account set up with project watches on anything
57 it finds interesting. This is a rather ugly hack, but it seems to be the
58 simplest option available.
59
60 Gerrit does offer a streaming notification service that would be _far_ better,
61 but it is only available over an SSH conection to gerrit, and the AOSP gerrit
62 does not support this connection.
63
64 Another option would be polling gerrit itself, but we'd have to process each
65 change every time to see if it should be built, whereas project watches allow us
66 to treat these as semi-push notifications (we still have to poll gmail).
67
68 One drawback to this approach is that it's a hassle to set up the project
69 watches for a large number of projects. Since bionicbb is only interested in a
70 small subset of projects, this is a non-issue.
71
72 If the buildbot has applied Verified-1 to a patchset, the user may add their own
73 Verified+1 to the change and the buildbot will remove its rejection the next
74 time the services polls (by default, every five minutes).
75
76 The service will also listen for the following commands:
77
78 * `bionicbb:clean`: Something is very broken and the buildbot's output
79 directory needs to be nuked.
80 * `bionicbb:retry`: Something went wrong and the buildbot should retry the
81 build.
82
83 build\_listener.py
84 ------------------
85
86 The build listener service responds to HTTP POST events sent from Jenkins and
87 updates CLs accordingly. The only other API endpoint is `/drop-rejection`, which
88 will remove a Verified-1 from a previously rejected patchset. The actually
89 invocation of this is handled by the gmail listener.
90