# -*- coding:utf-8 -*-import xml.etree.ElementTree as ET
import sysfrom jenkinsapi.jenkins import Jenkins
reload(sys)sys.setdefaultencoding('utf8')
def get_jenkins_server(): JENKINS_URL = "http://127.0.0.1:8080/" JENKINS_USERNAME = "jenkins" JENKINS_PASSWORD = "jenkins" return Jenkins(JENKINS_URL, username=JENKINS_USERNAME, password=JENKINS_PASSWORD, timeout=30)
def get_modified_xml(job_config_xml_tree): # create builders node builders_element = ET.Element("builders") job_config_xml_tree.append(builders_element)
# Move prebuilders to builders prebuilders_node = job_config_xml_tree.find("prebuilders") if prebuilders_node is not None and prebuilders_node.getchildren() is not None: for pre_builder in prebuilders_node.getchildren(): builders_element.append(pre_builder) job_config_xml_tree.remove(prebuilders_node)
# Create a maven block maven_node = ET.Element("hudson.tasks.Maven") builders_element.append(maven_node) move(job_config_xml_tree.find("goals"), job_config_xml_tree, maven_node, "targets") maven_name_node = job_config_xml_tree.find("mavenName") if maven_name_node: move(maven_name_node, job_config_xml_tree, maven_node) else: maven_name_node = ET.Element("mavenName") maven_name_node.text = "Maven" maven_node.append(maven_name_node) move(job_config_xml_tree.find("rootPOM"), job_config_xml_tree, maven_node) move(job_config_xml_tree.find("mavenOpts"), job_config_xml_tree, maven_node) move(job_config_xml_tree.find("settings"), job_config_xml_tree, maven_node) move(job_config_xml_tree.find("globalSettings"), job_config_xml_tree, maven_node)
# items that don't exist in maven step: remove(job_config_xml_tree, [ 'resolveDependencies', 'processPlugins', 'siteArchivingDisabled', 'archivingDisabled', 'mavenValidationLevel', 'disableTriggerDownstreamProjects', 'blockTriggerWhenBuilding', 'fingerprintingDisabled', 'incrementalBuild', 'processPlugins', 'siteArchivingDisabled', 'ignoreUpstremChanges', 'rootModule' ])
# Move postbuilders to builders postbuilders_node = job_config_xml_tree.find("postbuilders") if postbuilders_node is not None and postbuilders_node.getchildren() is not None: for post_builder in postbuilders_node.getchildren(): builders_element.append(post_builder) job_config_xml_tree.remove(postbuilders_node)
# rename top-level element # new parent node new_job_config_xml_tree = ET.Element("project") for child_node in job_config_xml_tree.getchildren(): new_job_config_xml_tree.append(child_node)
return new_job_config_xml_tree
def move(from_node, from_parent_node, to_node, to_name=None): if from_node is not None: if to_name: tmp_element_node = ET.Element(to_name) tmp_element_node.text = from_node.text tmp_element_node.attrib = from_node.attrib to_node.append(tmp_element_node) from_parent_node.remove(from_node) else: to_node.append(from_node) from_parent_node.remove(from_node)
def remove(from_node, name_list): for name in name_list: tmp_node = from_node.find(name) if tmp_node is not None: from_node.remove(tmp_node)
def main(): jenkins_server = get_jenkins_server()
job_list = jenkins_server.get_jobs_list() for job_name in job_list: if not job_name.endswith("-DEPRECATED"): job_obj = jenkins_server.get_job(job_name) config_text = job_obj.get_config() config_xml_tree = ET.fromstring(config_text) if config_xml_tree.tag == "maven2-moduleset": new_config_xml_tree = get_modified_xml(config_xml_tree) new_config_xml = ET.tostring(new_config_xml_tree) jenkins_server.rename_job(job_name, job_name + "-DEPRECATED") jenkins_server.create_job(job_name, new_config_xml) print("migrate job from Maven Type to FreeStyle Type: " + job_name)
if __name__ == "__main__": main()
评论