Skip to content
Python Build Integration Toolkit - a distributed cross platform AMQP based build system
Python CSS JavaScript Shell Perl
Find file
Failed to load latest commit information.
configs Left config in which shouldnt have been Nov 12, 2013
db Fixed bug in populate.sql Feb 14, 2013
examples More whitespace changes via pycharm for PEP compatibilty. May 18, 2013
hook Remove tcl specific default variables from the svn hook configuration May 18, 2013
pybit Switch from tabs to spaces and a few tidy ups May 18, 2013
pybitclient More whitespace changes via pycharm for PEP compatibilty. May 18, 2013
pybitweb Added vhost to all javascript url generation to fix absolute path Nov 12, 2013
test Switch from tabs to spaces and a few tidy ups May 18, 2013
.gitignore ignore pycharm meta data May 18, 2013 add the examples to the manifest May 18, 2013
README.txt update for changes to Debian packaging arrangements May 18, 2013
application.wsgi Fix debug logger breakage introduced by last change, #123. Feb 12, 2013 Switch from tabs to spaces and a few tidy ups May 18, 2013
makeme update for changes to Debian packaging arrangements May 18, 2013
pybit-watcher Removed TCL refs, updated emails to those from the Ex-TCL mailing list May 15, 2013 Push to version 1.0.0 May 18, 2013


pyBit (πβ or πβιϑ) itself is what it says on the tin, the Python Build Integration Toolkit.

The aim was to create a distributed AMQP based build system system using python and RabbitMQ. We talk to the queue using python-amqplib, with messages being encoded using python-jsonpickle. python-bottle is used to provide a lightweight HTTP based API, which the associated (static) web GUI can query using the jQuery javascript library.

The system consists of two parts, a single server, and one to many clients. pybit-web is the server part, and pybit-client the client part. You will also need a PostgreSQL database, which we speak to using python-psycopg2.

The front-end (Static HTML) web GUI queries the back-end (python) HTTP API using the jQuery Javascript library. The [HTML side] of the web GUI is not coupled otherwise to the system, as it does not speak to the queue or database directly.

Likewise, the client only speaks to the controller using the queue, and the HTTP API, never the database. By loosely coupling components, we aim to make it easy to extend the system to support a variety of different configurations and scenarios.

We aim to be flexible enough to build any combination of package type (i.e. DEB, RPM) for any arch, for any system (even, say .MSI installers for MS Windows). Currently however, we are mostly concerned with building ARM and i386 packages targeting Debian GNU/Linux 'Wheezy', and above.

Data Exchange
We use a well known interchange format (JSON, with the JSONPickle library). We will present a RESTful HTTP based API. i.e. using the GET verb on http://[server]/job shall return a list of all running build jobs, while http://[server]/job/1 shall return the specific job instance with the ID 1.

Note that we proxy POST and PUT, and map /[object]/[id]/delete to DELETE. This is as HTML forms, in most browsers can only do GET and POST (JQuery can do more using its AJAX functions).

Note that gained a new route rule syntax, amongst other things, in Bottle 0.10x. However, Debian Squeeze has python-bottle 0.8x in the repository. Therefore, we no longer support Squeeze. This can be worked around by overriding with a copy of bottle from upstream. Drop us a message, if you really want Squeeze support.

python-requests is available from squeeze-backports, as is python-psycopg2. Do NOT use the version of psycopg2 from squeeze/main, if you intend to use a multi-threaded web server, this is unsupported.

In /db, there are scripts to create and populate the database manually. However, when installing on Debian or a Debian derivative, we reccomend you use dbconfig-common and debconf, during the package installation process. See the Debian packaging at for more information.

Running the software
The connection string, hostname, etc.... are stored in /etc/pybit/configs/*. These should be set during the package installation process, but you may edit and configure these as you wish. Then simply start the server first, then the client(s) second. The client will pick up any suitable queued jobs when it comes up.

For support:
IRC - #pybit on irc:// (Or use github issues)

Packaging requirements

* rabbitmq-server
* python-amqplib
* python-debian
* python-jsonpickle
* python-bottle
* python-psycopg2
* python-requests

Debian packaging is now on

Useful links:

* - A RabbitMQ tutorial using Python.
Something went wrong with that request. Please try again.