Created
January 20, 2012 03:27
-
-
Save Iristyle/1644792 to your computer and use it in GitHub Desktop.
Bitbucket Jenkins API Source
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Added in parameterization for rev d56582e95b8719ab0afebd6d42234e188277e817
Still need to variable substitute - i.e. something like ${commit.node} should be replaced with the real value
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
Added in token to url for rev 0d04ef624aeeb46b3b79021023c09b2df03fd2ff