Skip to content

Instantly share code, notes, and snippets.

@amoralej
Last active October 11, 2016 17:05
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 amoralej/65117ecdb1056df029454ce35e517b7b to your computer and use it in GitHub Desktop.
Save amoralej/65117ecdb1056df029454ce35e517b7b to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import argparse
import jenkins
import os
import requests
import sys
TRUNK_URL_PREFIX='http://trunk.rdoproject.org/centos7-'
CI_CENTOS_ARTIFACTS_BASE='https://ci.centos.org/artifacts/rdo/'
CI_CENTOS_PROMOTE_PREFFIX='rdo-delorean-promote-'
def parse_args():
parser = argparse.ArgumentParser(description='Process information about a delorean promote job')
parser.add_argument('-r', '--release', dest='release', default='master',
help='OpenStack release')
parser.add_argument('-b', '--build', dest='build', default='ok',
help='build number, \'ok\' or \'latest\'')
parser.add_argument('-d', '--dir', dest='dir_name', default='/tmp',
help='Directory where info will be saved')
parser.add_argument('-s', '--server', dest='server_url', default='http://ci.centos.org',
help='URL of jenkins server')
return parser.parse_args()
def get_sub_builds(parent_job_name, parent_job_number):
job_info = server.get_build_info(parent_job_name,parent_job_number)
return job_info['subBuilds']
def get_parameter_values(parent_job_name, parent_job_number, parameter):
build_info = server.get_build_info(parent_job_name, parent_job_number)
builds = build_info['subBuilds']
values = []
for build in builds:
try:
params = server.get_build_info(build['jobName'], build['buildNumber'])['actions'][0]['parameters']
values = values + [param['value'] for param in params if param['name'] == parameter]
except:
pass
return set(values)
def get_versions_csv(release,parent_job_name, parent_job_number):
delorean_hash_set = get_parameter_values(parent_job_name, parent_job_number,'delorean_current_hash')
if len(delorean_hash_set) > 1:
print "ERROR: more that one hash repo found in different child jobs"
sys.exit(1)
try:
delorean_hash = delorean_hash_set.pop()
versions = requests.get(TRUNK_URL_PREFIX + release + '/' + delorean_hash + '/versions.csv')
if versions.status_code == 200:
return [delorean_hash, versions.text]
else:
print "ERROR: no versions file found for hash %s" % delorean_hash
return None
except:
print "ERROR: problem downloading versions file for hash %s" % delorean_hash
return None
def get_build_artifact(parent_job_name, parent_job_number, artifact):
child_builds = get_sub_builds(parent_job_name, parent_job_number)
for build in child_builds:
artifact_text = requests.get(CI_CENTOS_ARTIFACTS_BASE + build['jobName'] + "/" + str(build['buildNumber']) + artifact)
if artifact_text.status_code == 200:
return artifact_text.text
print "ERROR: No artifact %s found for subjobs of %s %s" % (artifact,parent_job_name,parent_job_number)
return None
def write_promote_repos_info(release,promote_job_name,job_number,dir_name):
rc = 0
print "INFO: Processing job %s %s" % (promote_job_name, job_number)
delorean_info = get_versions_csv(release,promote_job_name, job_number)
if delorean_info == None:
sys.exit(1)
else:
delorean_hash_dir = delorean_info[0]
delorean_hash = delorean_hash_dir.split('/')[2]
release = promote_job_name.rsplit('-')[-1]
rdo_repo_url = TRUNK_URL_PREFIX + release + '/' + delorean_hash_dir
job_result = server.get_build_info(promote_job_name,job_number)['result']
print "INFO: promote job repo %s" % rdo_repo_url
print "INFO: promote job result: %s" % job_result
versions = delorean_info[1]
versions_path = os.path.join(dir_name, delorean_hash + "-versions.csv")
trunk_versions = open(versions_path, "w")
trunk_versions.write(versions)
print "INFO: versions info in %s" % versions_path
rdo_trunk_deps = get_build_artifact(promote_job_name,job_number,'/rdo-trunk-deps-start.txt.gz')
if rdo_trunk_deps == None:
sys.exit(2)
else:
trunk_deps_path = os.path.join(dir_name, delorean_hash + "-rdo-trunk-deps.txt")
trunk_deps = open(trunk_deps_path, "w")
trunk_deps.write(rdo_trunk_deps)
print "INFO: rdo-trunk-deps info in %s" % trunk_deps_path
sys.exit(rc)
def process_job_info(release,job,dir_name):
promote_job_name = CI_CENTOS_PROMOTE_PREFFIX + release
if job == 'ok':
job_number = server.get_job_info(promote_job_name)['lastSuccessfulBuild']['number']
elif job == 'last':
job_number = server.get_job_info(promote_job_name)['lastBuild']['number']
else:
job_number = int(job)
write_promote_repos_info(release,promote_job_name,job_number,dir_name)
if __name__ == "__main__":
args = parse_args()
server = jenkins.Jenkins(args.server_url)
version = server.get_version()
print('Connected to Jenkins version %s' % version)
process_job_info(args.release,args.build,args.dir_name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment