Created
July 25, 2012 14:40
-
-
Save jlaska/3176514 to your computer and use it in GitHub Desktop.
Delete jenkins jobs matching a provided regular expression
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/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 "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