Robin Winslow
on 28 January 2015
In the design team we keep some projects in Launchpad (as canonical-webmonkeys), and some project in Github (as UbuntuDesign), meaning we work in both Bazaar and Git.
The need to synchronise Github to Launchpad
Some of our Github projects need to be also stored in Launchpad, as some of our systems only have access to Launchpad repositories.
Initally we were converting these projects manually at regular intervals, but this quickly became too cumbersome.
The Bazaar synchroniser
To manage this we created a simple web-service project to synchronise Git projects to Bazaar. This script basically automates the techniques described in our previous article to pull down the Github repository, convert it to Bazaar and push it up to Launchpad at a specified location.
It’s a simple Python WSGI app which can be run directly or through a server that understands WSGI like gunicorn.
Setting up the server
Here’s a guide to setting up our bzr-sync
project on a server somewhere to sync Github to Launchpad.
System dependencies
Install necessary system dependencies:
User permissions
First off, you’ll have to make sure you set up a user on whichever server is to run this service which has read access to your Github projects and write access to your Launchpad projects:
Cloning the project
Then you should clone the project and install dependencies. We placed it at /srv/bzr-sync
but you can put it anywhere:
Preparing gunicorn
We should serve this over HTTPS, so our auth_token
will remain secret. This means you’ll need a SSL certificate keyfile and certfile. You should get one from a certificate authority, but for testing you could just generate a self-signed-certificate.
Put your certificate files somewhere accessible (like /srv/bzr-sync/certs/
), and then test out running your server with gunicorn
:
Try out the sync server
You should now be able to synchronise a Github repository with Launchpad by pointing your browser at:
https://{server-domain}/?token={secret-token}&git_url={url-of-github-repository}&bzr_url=lp:{launchpad-branch-location}
You should be able to see the progress of the conversion as command-line output from the above gunicorn
command.
Add upstart job
Rather than running the server directly, we can setup an upstart job to manage running the process. This way the bzr-sync service will restart if the server restarts.
Here’s an example of an upstart job, which we placed at /etc/init/bzr-sync.conf
:
You can now start the bzr-sync server as a service:
And output will be logged to /etc/upstart/bzr-sync.log
.
Setting up Github projects
Now to use this sync server to automatically synchronise your Github projects to Launchpad, you simply need to add a post-commit webhook to ping a URL of the form:
https://{server-domain}/?token={secret-token}&git_url={url-of-github-repository}&bzr_url=lp:{launchpad-branch-location}
In your repository settings, select “Webhooks and Services”, then “Add webhook”, and enter the following information:
- Payload URL:
https://{server-domain}/?token={secret-token}&git_url={url-of-github-repository}&bzr_url=lp:{launchpad-branch-location}
- Content type: “application/json”
- Secret: -leave blank-
- Select Just the push event
- Tick Active
NB: Notice the Disable SSL verification
button. By default, the hook will only work if your server has a valid certificate. If you are testing with a self-signed one then you’ll need to disable this SSL verification.
Now whenever you commit to your Github repository, Github should ping the URL, and the server should synchronise your repository into Launchpad.