溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么批量自動將Maven類型Job遷移到自由風格類型

發(fā)布時間:2021-12-14 17:42:06 來源:億速云 閱讀:125 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“怎么批量自動將Maven類型Job遷移到自由風格類型”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

為什么要遷移?

近期進行 Jenkins 從1.X到2.X的升級演練
Jenkins2 最新版本只能在 JDK8 或 JDK11 版本下運行,我所使用的 JDK 版本為 JDK8
在構建 Maven Job,Job 配置的 JDK 版本為 JDK7時,構建報錯

$ /usr/local/java/bin/java -cp /data/jenkins/maven31-agent.jar:/usr/local/maven/boot/plexus-classworlds-2.5.2.jar:/usr/local/maven/conf/logging jenkins.maven3.agent.Maven31Main /usr/local/maven /data/jenkins/slave.jar /data/jenkins/maven31-interceptor.jar /data/jenkins/maven3-interceptor-commons.jar 45631Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.java:401)
        at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:42)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
        at jenkins.maven3.agent.Maven31Main.main(Maven31Main.java:138)
        at jenkins.maven3.agent.Maven31Main.main(Maven31Main.java:67)

經(jīng)定位,原來 Maven 類型 Job 與 JDK 版本有一定兼容性,部分說明如下:

Maven jobs and Java versions compatibility : Because java serialized classes are exchanged between Jenkins master and Maven Jobs it is required that the JVM used to launch Maven is superior or equal to the version of Java for which Jenkins Master is built for.

  • Jenkins >= 1.520 requires Java 6 thus Maven jobs must be launched with Java >= 6.

  • Jenkins >= 1.612 requires Java 7 thus Maven jobs must be launched with Java >= 7.

  • Jenkins >= 2.54 requires Java 8 thus Maven jobs must be launched with Java >= 8.

而我們的這些 Job 必須使用指定 JDK 版本構建,不能隨意修改 JDK 版本
而自由風格類型的 Job,不會出現(xiàn)這個問題
所以,計劃將 Maven 類型 Job 遷移到自由風格類型

如何遷移?

那么如何遷移呢?
統(tǒng)計了下 Maven 類型的 Job,有數(shù)百個,手動遷移不現(xiàn)實的

嘗試運行該腳本,可能與環(huán)境有關,它會報錯
由于對 groovy 不太熟悉,解決起來比較麻煩
所以參考它的邏輯,使用 python 腳本實現(xiàn)了遷移的功能

python 腳本如下所示,有需要的可以自行修改:

# -*- coding:utf-8 -*-import xml.etree.ElementTree as ETimport 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_treedef 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()

“怎么批量自動將Maven類型Job遷移到自由風格類型”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI