Created
January 15, 2017 09:21
-
-
Save weldpua2008/a33f3c637af801b34c0385621af1e224 to your computer and use it in GitHub Desktop.
Get an artifact url from Jenkins
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 | |
# -*- coding: utf-8 -*- | |
############################################################## | |
# Get an artifact url | |
# | |
############################################################## | |
# author: Valeriy Solovyov <weldpua2008@gmail.com> | |
# version 0.1 <3.15.2016> | |
# - initial | |
############################################################## | |
# Example URL=$( resolve_url_from_jenkins.py \ | |
# --jenkins-host $JENKINS_HOST \ | |
# --jenkins-port ${JENKINS_PORT} \ | |
# --job "${JENKINS_JOB}" \ | |
# --build "${JENKINS_BUILD}" \ | |
# --artifact-name "${artifactName}" \ | |
# --jenkins-prefix "$JENKINS_PREFIX" ) | |
import argparse | |
import sys | |
import urllib2 | |
import json | |
PY3 = sys.version_info[0] == 3 | |
if PY3: | |
STRING_TYPES = (str, bytes) | |
# long = int | |
else: | |
STRING_TYPES = basestring, | |
def is_string(test_variable=None): | |
try: | |
return isinstance(test_variable, STRING_TYPES) | |
except Exception as error: | |
raise RuntimeError("Can't check is_string because: %s" % error) | |
def is_dict(test_variable=None): | |
try: | |
return isinstance(test_variable, dict) | |
except Exception as error: | |
raise RuntimeError("Can't check is_dict because: %s" % error) | |
def get_args(): # pragma: no cover | |
# Creating the argument parser | |
parser = argparse.ArgumentParser( | |
description="Get artifacts url") | |
parser.add_argument( | |
'--jenkins-host', | |
nargs=1, | |
required=True, | |
help='Jenkins host', | |
dest='host', | |
type=str) | |
parser.add_argument( | |
'--jenkins-port', | |
nargs=1, | |
required=True, | |
help='Jenkins host port', | |
dest='port', | |
type=str) | |
parser.add_argument( | |
'--job', | |
nargs=1, | |
required=True, | |
help='The Job name', | |
dest='job', | |
type=str) | |
parser.add_argument( | |
'--build', | |
nargs=1, | |
required=False, | |
help='The build number. By default lastSuccessfulBuild', | |
dest='build', | |
default=["lastSuccessfulBuild"], | |
type=str) | |
parser.add_argument( | |
'--artifact-start-with', | |
nargs=1, | |
required=False, | |
help='The artifact starts with ', | |
dest='artifactStartWith', | |
type=str) | |
parser.add_argument( | |
'--artifact-name', | |
nargs=1, | |
required=False, | |
help='The artifact name ', | |
dest='artifactName', | |
type=str) | |
parser.add_argument( | |
'--jenkins-prefix', | |
nargs=1, | |
required=False, | |
help='The Jenkins job prefix (by default it is jenkins (e.g. ip:port/jenkins/job)', | |
dest='jenkinsprefix', | |
type=str) | |
# subparsers = parser.add_subparsers(help='commands') | |
args = parser.parse_args() | |
return args | |
def validate_input(in_var, msg=None): | |
if not is_string(in_var): | |
_msg = "Can't validate" | |
if is_string(msg): | |
print(msg) | |
sys.exit(126) | |
def get_jenkins_data(host, port, job, build, jenkins_prefix="jenkins"): | |
jenkins_url = "http://%s:%s/%s/job/%s/%s/api/json" % (host, port,jenkins_prefix, job, build) | |
jenkinsData = None | |
try: | |
jenkinsStream = urllib2.urlopen(jenkins_url) | |
try: | |
jenkinsData = json.load(jenkinsStream) | |
except: | |
print("Failed to parse json from %s " % jenkins_url) | |
sys.exit(2) | |
if not is_dict(jenkinsData): | |
print("Parsed data from %s is not a dict" % jenkins_url) | |
sys.exit(2) | |
except urllib2.HTTPError, e: | |
print "URL Error: " + str(e.code) | |
print " (job name [" + job + "] probably wrong)" | |
return jenkinsData | |
def run(): # pragma: no cover | |
args = get_args() | |
host = args.host[0] | |
port = args.port[0] | |
job = args.job[0] | |
jenkins_prefix = args.jenkinsprefix[0] | |
build = args.build[0] | |
validate_input(host, "host must be string") | |
validate_input(port, "port must be string") | |
validate_input(job, "job must be string") | |
validate_input(build, "build must be string") | |
validate_input(jenkins_prefix, "build must be string") | |
data = get_jenkins_data(host=host, port=port, job=job, build=build, jenkins_prefix=jenkins_prefix) | |
if "artifacts" not in data: | |
print("Parsed data must contain 'artifacts':") | |
print ("%s" % data) | |
sys.exit(2) | |
if "url" not in data: | |
print("Parsed data must contain 'url':") | |
print ("%s" % data) | |
sys.exit(2) | |
artifacts_url = data["url"] | |
artifacts = data["artifacts"] | |
if args.artifactStartWith is not None: | |
artifactStartWith = args.artifactStartWith[0] | |
for artifact_data in artifacts: | |
if 'fileName' in artifact_data: | |
fileName = artifact_data["fileName"] | |
if fileName.startswith(artifactStartWith): | |
if "relativePath" in artifact_data: | |
print "%s/artifact/%s" %(artifacts_url,artifact_data["relativePath"]) | |
elif args.artifactName is not None: | |
print args.artifactName[0] | |
else: | |
print("Please provide how to find artifact --artifact-name or --artifact-start-with") | |
sys.exit(2) | |
if __name__ == '__main__': # pragma: no cover | |
run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment