Last active
August 29, 2015 14:03
-
-
Save wabson/cbf1e5fa42a48a848220 to your computer and use it in GitHub Desktop.
This file contains 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
#!/usr/bin/env python | |
import getpass | |
import json | |
import sys | |
import urllib | |
import urllib2 | |
#AUTOMATION_PLAN = "ALF-SHAREPO12" # Share-PO Tests > HEAD-BUG-FIX (Maven) | |
AUTOMATION_PLAN = "ALF-SHAREPO0" # Share-PO Tests > HEAD-BUG-FIX | |
BAMBOO_URL = "https://bamboo.alfresco.com/bamboo" | |
# create a password manager | |
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() | |
def prepare_opener(username, password): | |
# Add the username and password. | |
# If we knew the realm, we could use it instead of None. | |
if username is not None and password is not None: | |
password_mgr.add_password(None, BAMBOO_URL, username, password) | |
handler = urllib2.HTTPBasicAuthHandler(password_mgr) | |
return urllib2.build_opener(handler) | |
def prompt_username(): | |
input_value = raw_input("Enter Bamboo username: ") | |
return input_value | |
def prompt_password(): | |
input_value = getpass.getpass("Enter Bamboo password: ") | |
return input_value | |
def load_json(opener, path, params=""): | |
url = "%s/rest/api/latest/%s.json?os_authType=basic&%s" % (BAMBOO_URL, path, params) | |
#print url | |
# TODO put an upper limit e.g. 3 on the number of retries allowed | |
while True: | |
try: | |
return json.loads(opener.open(url).read()) | |
except urllib2.HTTPError, e: | |
if e.code == 401: | |
password_mgr.add_password(None, BAMBOO_URL, prompt_username(), prompt_password()) | |
except Exception, e: | |
raise e | |
def main(): | |
opener = prepare_opener(None, None) | |
plan_data = load_json(opener, "plan/%s" % (AUTOMATION_PLAN)) | |
print plan_data['name'] | |
page_size = 25 | |
result_index = 0 | |
is_green = False | |
parent_job = None # Name of the parent build when we have a green build | |
while True: | |
jobs_data = load_json(opener, "result/%s" % (AUTOMATION_PLAN), "start-index=%s" % (result_index)) | |
result_index += page_size | |
if jobs_data['results']['size'] != page_size or len(jobs_data['results']['result']) == 0: # Seems we reached the last build in the list | |
print "No green builds were found" | |
break | |
for result in jobs_data['results']['result']: | |
if not is_green: | |
if result['state'] == 'Successful': | |
print 'Found successful build %s' % (result['key']) | |
is_green = True | |
if is_green: | |
job_data = load_json(opener, "result/%s" % (result['key']), "expand=metadata") | |
for item in job_data['metadata']['item']: | |
if item['key'] == 'dependency.parent.0': | |
parent_job = item['value'] | |
break | |
if parent_job is not None: | |
break | |
if parent_job is not None: | |
print "Found successful parent job %s" % (parent_job) | |
job_data = load_json(opener, "result/%s" % (parent_job)) | |
print 'Revision r%s' % (job_data['vcsRevisionKey']) | |
break | |
try: | |
main() | |
except (KeyboardInterrupt, SystemExit): | |
print 'Interruped' | |
sys.exit(1) | |
except: | |
raise |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment