Skip to content

Instantly share code, notes, and snippets.

@weldpua2008
Created January 15, 2017 09:21
Show Gist options
  • Save weldpua2008/a33f3c637af801b34c0385621af1e224 to your computer and use it in GitHub Desktop.
Save weldpua2008/a33f3c637af801b34c0385621af1e224 to your computer and use it in GitHub Desktop.
Get an artifact url from Jenkins
#!/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