Skip to content

Instantly share code, notes, and snippets.

@Iristyle
Created January 20, 2012 03:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Iristyle/1644792 to your computer and use it in GitHub Desktop.
Save Iristyle/1644792 to your computer and use it in GitHub Desktop.
Bitbucket Jenkins API Source
import string, urllib
from django.utils.http import urlencode
try:
from brokers import BaseBroker
except ImportError:
BaseBroker = object
class URLOpener(urllib.FancyURLopener):
version = 'Bitbucket.org'
class Jenkins(BaseBroker):
def handle(self, payload):
data = JenkinsData(payload)
if self.should_do_build(data):
self.do_build(data)
def should_do_build(self, data):
if data.module_name:
return self.module_name_matches_commits(data)
else:
data.commit = data.commits[0]
return True
def module_name_matches_commits(self, data):
for commit in data.commits:
for file in commit['files']:
file_path = file['file']
if file_path.startswith(data.module_name):
data.commit = commit
return True
else:
return False
def do_build(self, data):
if data.parameters is None:
url = data.endpoint + '/job/' + data.project_name + '/build?token' + data.token
else:
url = data.endpoint + '/job/' + data.project_name + '/buildWithParameters?token' + data.token + '&' + Template(data.parameters).substitute(data.commit)
body = urlencode(
{'token': data.token,
'cause': 'Triggered by push of revision ' + data.commit['node'] + ': "' + data.commit['message'] + '" to ' + data.full_url + ' by ' + data.commit['author']})
opener = URLOpener()
return opener.open(url, body).read()
class JenkinsData():
def __init__(self, payload):
self.full_url = payload['canon_url'] + payload['repository']['absolute_url']
service = payload['service']
self.endpoint = service['endpoint']
self.project_name = service['project_name']
self.module_name = service['module_name']
if self.module_name:
if self.module_name[-1:] != "/":
self.module_name = self.module_name + "/"
self.token = service['token']
self.parameters = service['parameters']
self.commits = payload['commits']
self.commits.reverse()
@Iristyle
Copy link
Author

Added in token to url for rev 0d04ef624aeeb46b3b79021023c09b2df03fd2ff

@Iristyle
Copy link
Author

Added in parameterization for rev d56582e95b8719ab0afebd6d42234e188277e817
Still need to variable substitute - i.e. something like ${commit.node} should be replaced with the real value

@Iristyle
Copy link
Author

Latest gist should allow a new parameters value to be passed in from service like

HgRevId=$node&Author=$author

String interpolation should be performed to pick values out of data.commit -- but I'm not a Python hacker and that might be wrong

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment