Skip to content

Instantly share code, notes, and snippets.

@jlaska
Created July 25, 2012 14:40
Show Gist options
  • Save jlaska/3176514 to your computer and use it in GitHub Desktop.
Save jlaska/3176514 to your computer and use it in GitHub Desktop.
Delete jenkins jobs matching a provided regular expression
#!/usr/bin/python
import sys
import os
import optparse
import getpass
import re
import xml.dom.minidom
try:
import jenkinsapi.jenkins
except ImportError, e:
print "Error: Unable to import jenkinsapi (https://github.com/salimfadhley/jenkinsapi)"
print
print "You can install jenkinsapi using virtualenv and pip:"
print " # VENV=$(mktemp -d)"
print " # virtualenv --distribute --system-site-packages $VENV"
print " # pip-python -E $VENV install jenkinsapi"
print " # source $VENV/bin/activate"
sys.exit(1)
def parse_args():
def sanitize_input(parser, value, label, ispass=False):
'''Prompt for a value, if none was provided'''
if value is None and sys.stdin.isatty():
prompt = 'Enter %s: ' % label
if ispass:
value = getpass.getpass(prompt)
else:
value = raw_input(prompt)
if value is None:
parser.error('Must provide a valid %s' % label)
return value
parser = optparse.OptionParser(usage="%s <options> [job_name_regexp]" % \
os.path.basename(sys.argv[0]))
parser.add_option("--url", action="store", dest="baseurl",
default='http://hudson.rhq.lab.eng.bos.redhat.com:8080/hudson',
help="URL for jenkins instance (default: %default)")
parser.add_option("-u", "--user", action="store", dest="username", default='admin',
help="Jenkins user name (default: %default)")
parser.add_option("-p", "--pass", action="store", dest="password", default=None,
help="Jenkins user password (default: %default)")
(opts, args) = parser.parse_args()
opts.username = sanitize_input(parser, opts.username, "username")
opts.password = sanitize_input(parser, opts.password, "password", ispass=True)
# Make sure baseurl endswith('/')
if opts.baseurl is None or opts.baseurl == '':
parser.error("Missing --url")
if not opts.baseurl.endswith('/'):
opts.baseurl += '/'
return (opts, args)
def getText(nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
if __name__ == '__main__':
(opts, args) = parse_args()
jenkins = jenkinsapi.jenkins.Jenkins(baseurl=opts.baseurl, username=opts.username, password=opts.password)
# Login
jenkins.login()
for job_name in jenkins.get_jobs_list():
# Determine if current job fits the job name pattern(s)
if len(args) > 0:
try_to_delete = True in [re.search(pattern, job_name) is not None for pattern in args]
# no pattern given, prompt for every job
else:
try_to_delete = True
if try_to_delete:
j = jenkins.get_job(job_name)
# get XML job configuration
config_xml = j.get_config()
dom = xml.dom.minidom.parseString(config_xml)
# Is this job disabled?
disabled = dom.getElementsByTagName('disabled')
is_disabled = getText(disabled[0].childNodes) == 'true'
yesno = raw_input("Delete %sjob '%s' (y|n): " % \
(is_disabled and "disabled " or "", job_name,)).lower() == 'y'
if yesno:
jenkins.delete_job(job_name)
print "... deleted"
else:
print "... skipped"
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment