| bionicbb | |
| ======== | |
| The bionic buildbot contains two services: a gmail polling service, and a web | |
| service that interacts with gerrit. | |
| Dependencies | |
| ------------ | |
| * Python 2.7 | |
| * [Advanced Python Scheduler](https://apscheduler.readthedocs.org/en/latest/) | |
| * [Flask](http://flask.pocoo.org/) | |
| * [Google API Client Library](https://developers.google.com/api-client-library/python/start/installation) | |
| * [jenkinsapi](https://pypi.python.org/pypi/jenkinsapi) | |
| * [Requests](http://docs.python-requests.org/en/latest/) | |
| Setup | |
| ----- | |
| Create a `config.py` in the same directory as the sources. The structure of the | |
| configuration file is as follows: | |
| ```python | |
| client_secret_file = 'CLIENT_SECRET_FILE.json' | |
| build_listener_url = 'BUILD_LISTENER_URL' | |
| jenkins_url = 'JENKINS_URL' | |
| jenkins_credentials = { | |
| 'username': 'JENKINS_USERNAME', | |
| 'password': 'JENKINS_PASSWORD', | |
| } | |
| ``` | |
| The client secret file comes from the Gmail API page of the [Google Developers | |
| Console](https://console.developers.google.com/). The Jenkins credentials are | |
| for a Jenkins account that has the appropriate permissions to launch the jobs | |
| the buildbot will use. | |
| You will also need to add the HTTP password for the buildbot's Gerrit account to | |
| `~/.netrc`. The HTTP password can be obtained from the [Gerrit HTTP password | |
| settings](https://android-review.googlesource.com/#/settings/http-password). | |
| To launch the services: | |
| ```bash | |
| $ python build_listener.py >build.log 2>&1 & | |
| $ python gmail_listener.py >mail.log 2>&1 & | |
| ``` | |
| The mail listener will direct your browser to an authentication page for the | |
| Gmail API. | |
| gmail\_listener.py | |
| ------------------ | |
| Bionicbb polls a gmail account to find changes that need to be built. The gmail | |
| account needs to have a gerrit account set up with project watches on anything | |
| it finds interesting. This is a rather ugly hack, but it seems to be the | |
| simplest option available. | |
| Gerrit does offer a streaming notification service that would be _far_ better, | |
| but it is only available over an SSH conection to gerrit, and the AOSP gerrit | |
| does not support this connection. | |
| Another option would be polling gerrit itself, but we'd have to process each | |
| change every time to see if it should be built, whereas project watches allow us | |
| to treat these as semi-push notifications (we still have to poll gmail). | |
| One drawback to this approach is that it's a hassle to set up the project | |
| watches for a large number of projects. Since bionicbb is only interested in a | |
| small subset of projects, this is a non-issue. | |
| If the buildbot has applied Verified-1 to a patchset, the user may add their own | |
| Verified+1 to the change and the buildbot will remove its rejection the next | |
| time the services polls (by default, every five minutes). | |
| The service will also listen for the following commands: | |
| * `bionicbb:clean`: Something is very broken and the buildbot's output | |
| directory needs to be nuked. | |
| * `bionicbb:retry`: Something went wrong and the buildbot should retry the | |
| build. | |
| build\_listener.py | |
| ------------------ | |
| The build listener service responds to HTTP POST events sent from Jenkins and | |
| updates CLs accordingly. The only other API endpoint is `/drop-rejection`, which | |
| will remove a Verified-1 from a previously rejected patchset. The actually | |
| invocation of this is handled by the gmail listener. |