怎么批量自動(dòng)將Maven類型Job遷移到自由風(fēng)格類型-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“怎么批量自動(dòng)將Maven類型Job遷移到自由風(fēng)格類型”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

十載的城關(guān)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整城關(guān)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“城關(guān)網(wǎng)站設(shè)計(jì)”,“城關(guān)網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

為什么要遷移?

近期進(jìn)行 Jenkins 從1.X到2.X的升級(jí)演練
Jenkins2 最新版本只能在 JDK8 或 JDK11 版本下運(yùn)行,我所使用的 JDK 版本為 JDK8
在構(gòu)建 Maven Job,Job 配置的 JDK 版本為 JDK7時(shí),構(gòu)建報(bào)錯(cuò)

$ /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 版本構(gòu)建,不能隨意修改 JDK 版本
而自由風(fēng)格類型的 Job,不會(huì)出現(xiàn)這個(gè)問題
所以,計(jì)劃將 Maven 類型 Job 遷移到自由風(fēng)格類型

如何遷移?

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

嘗試運(yùn)行該腳本,可能與環(huán)境有關(guān),它會(huì)報(bào)錯(cuò)
由于對(duì) groovy 不太熟悉,解決起來比較麻煩
所以參考它的邏輯,使用 python 腳本實(shí)現(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()

“怎么批量自動(dòng)將Maven類型Job遷移到自由風(fēng)格類型”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

當(dāng)前題目:怎么批量自動(dòng)將Maven類型Job遷移到自由風(fēng)格類型-創(chuàng)新互聯(lián)
鏈接URL:http://muchs.cn/article16/dsiggg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化、網(wǎng)站建設(shè)、微信小程序手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)