Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jmcgeheeiv/8a7431aa2483a5a4f420 to your computer and use it in GitHub Desktop.
Save jmcgeheeiv/8a7431aa2483a5a4f420 to your computer and use it in GitHub Desktop.
Download the latest successful build artifacts from Jenkins using Python 3
#!/usr/bin/env python3
# Download the latest successful build artifacts from Jenkins using Python 3
# John McGehee 1/25/2016
#
# Based on the Python 2 version by supertom: https://gist.github.com/supertom/2759847
import argparse
import codecs
import io
import json
import os
import sys
try:
import pycurl
isPyCurlAvailable = True
except ImportError:
import urllib.request
isPyCurlAvailable = False
parser = argparse.ArgumentParser(description="Download the latest successful build artifacts from Jenkins.")
parser.add_argument('jobs', metavar='jobName', nargs='+',
help="List of job names from which to fetch the latest artifact, "
"including folder name(s). For example: 'folderName1/folderName2/jobName'.")
args = parser.parse_args()
assert isinstance(args.jobs, list) and args.jobs, "A list of at least one job must be specified"
##########
# configuration
build_host = "jenkins.johnnado.com"
lastBuildAPIURL = "http://" + build_host + "/job/%s/lastSuccessfulBuild/api/json"
lastBuildArtifactLURL = "http://" + build_host + "/job/%s/lastSuccessfulBuild/artifact/%s"
localSaveDir = "."
# Default for .tgz artifacts; change if yours are different, for example .apk files.
artifactExtension=".internal.tgz"
##########
# UDFs
def downloadFile(url, filename):
print("==> Downloading File: ", filename, " URL: ", url)
if isPyCurlAvailable:
fp = open(filename, "wb")
curl = pycurl.Curl()
curl.setopt(pycurl.URL, url)
curl.setopt(pycurl.WRITEDATA, fp)
curl.perform()
curl.close()
fp.close()
else:
urllib.request.urlretrieve(url, filename)
###########
# start
print("Fetching files from Jenkins")
if not os.path.exists(localSaveDir):
print("==> Creating Dir %s" % (localSaveDir))
os.makedirs(localSaveDir)
for job in args.jobs:
job = job.strip('/')
job = job.replace('/', '/job/')
jobURL = lastBuildAPIURL % (job)
if isPyCurlAvailable:
buf = io.BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, jobURL)
c.setopt(c.WRITEFUNCTION, buf.write)
c.perform()
jsonbytes = buf.getvalue()
buf.close()
else:
with urllib.request.urlopen(jobURL) as response:
jsonbytes = response.read() # a `bytes` object
jsonstr = jsonbytes.decode('utf-8')
jd = json.loads(jsonstr)
artifacts = jd['artifacts']
for art in artifacts:
if art['fileName'].find(artifactExtension) > -1:
artURL = lastBuildArtifactLURL % (job,art['relativePath'])
downloadFile(str(artURL),localSaveDir + "/" + str(art['fileName']))
@parkerlreed
Copy link

I added a comment documenting artifactExtension. Thanks @parkerlreed!

Cheers!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment