2011-10-03 82 views
22

我在Jenkins有很多自由風格的工作,我想轉換成多配置作業,這樣我就可以在一個作業下跨多個平臺構建。這些作業指定了很多構建參數,我不想通過創建新的多配置作業來手動設置它們。目前,每項工作都將其構建限制在我們一直在構建的平臺上,而我所看到的另一個選擇是克隆現有工作並將限制更改爲新平臺。這並不理想,因爲我需要維持2個職位,唯一的區別就是目標平臺。是否可以將Jenkins自由式作業轉換爲多配置作業?

我沒有看到通過用戶界面執行此操作的方法,但是想知道是否有其他方法。

回答

22

據我所知,沒有辦法轉換UI中的作業類型。您必須編輯作業的config.xml,或者複製並編輯配置文件,並根據編輯後的配置創建新作業。

您必須檢查自由風格和多配置作業與使用的各種設置之間的差異。它可能如 一樣簡單,因爲將config.xml中的頂級元素從project更改爲matrix-project

如果您編輯現有的作業配置,你要麼需要做的,而 詹金斯是脫機狀態,或者告訴詹金斯通過重新加載其配置管理 詹金斯 - 從磁盤>重新加載配置。

如果您決定創建新作業,則this previous question可能會有所幫助,因此您可以找出需要進行哪些編輯的地方 。具體來說this answer描述瞭如何 上傳一個配置文件來創建一個新的工作。

+0

雖然我沒有真正嘗試這個,但看起來你所概述的過程是可行的。我決定繼續前進,並通過用戶界面進行操作。我覺得這種做法有點冒險,我可能最終會遇到一些微妙的問題。感謝您的迴應。 –

+0

隨着新的「管理舊數據」功能,它應顯示已被作業類型更改過時的東西。 – reechard

+1

運作良好。還添加了所需的元素並刪除了以保存必須執行的任何UI編輯。但是,它確實失去了工作的構建歷史。 – OrangeDog

4

只爲那些希望從maven轉向自由式工作的人提供一個說明。

  1. 更改maven2-moduleset標記爲project
  2. 刪除標籤:rootModulegoalsmavenValidationLevel(應該彼此接近)。
  3. 合併prebuilderspostbuilders分成builders
+0

Hrm,在這樣做之後 - 「管理jenkins」報告未使用的數據,其中清理崩潰時出現「找不到父母」的錯誤,我想知道是否還有其他元素/屬性需要調整? –

+1

你可能會遇到一些搞砸的插件(你需要手動刪除它的標籤)。或者你可能需要使用選項「從磁盤重新加載配置」,如果你沒有。 – Nux

1

我剛剛寫了一個腳本,將約10000個Jenkins作業從Maven作業類型轉換爲Freestyle。請不要盲目使用它。您可能會丟失配置選項,或者最終導致Jenkins設置中斷。 Python部分將一個config xml作爲參數,並用轉換後的數據覆蓋同一個文件。我跑這個活的詹金斯文件系統使用以下命令:

cd /path/to/jenkins/jobs

find * -maxdepth 2 -name config.xml -exec /path/to/maven2freestyle.py {} \;

警告重。這可能會破壞你的詹金斯!請保留備份!

#!/usr/bin/env python2 

import copy 
import sys 
from lxml import etree 
from lxml.etree import fromstring, tostring 
from StringIO import StringIO 

def parseXML(xmlFile): 
    print(xmlFile) 
    f = open(xmlFile) 
    xml = f.read() 
    f.close() 

    e = etree.parse(xmlFile) 
    root = e.getroot() 

    if root.tag != 'maven2-moduleset': 
     #print("WARNING: Skipping non Maven Project") 
     return 

    #change project type 
    root.tag = "project" 
    if 'plugin' in root.attrib: 
     del root.attrib["plugin"] 

    #get maven data 
    rootModule = root.find('./rootModule') 
    rootPOM = root.find('./rootPOM') 
    goals = root.find('./goals') 
    mavenName = root.find('./mavenName') 
    mavenOpts = root.find('./mavenOpts') 

    # merge prebuilders into builders 
    prebuilders = root.findall("./prebuilders/*") 
    builders = etree.Element("builders") 
    root.insert(99, builders) 
    if len(prebuilders) > 0: 
     builders.append(copy.deepcopy(prebuilders[0])) 

    #create maven builder 
    maven = etree.Element("hudson.tasks.Maven") 

    if not goals is None: 
     etree.SubElement(maven, "targets").text = goals.text 
    if not mavenName is None: 
     etree.SubElement(maven, "mavenName").text = mavenName.text 
    if not rootPOM is None: 
     etree.SubElement(maven, "pom").text = rootPOM.text 
    if not mavenOpts is None: 
     etree.SubElement(maven, "javaOpts").text = mavenOpts.text 

    builders.append(maven) 

    #cleanup 
    prebuilder = root.findall("./prebuilders") 
    if len(prebuilder) > 0: 
     root.remove(prebuilder[0]) 
    if not rootModule is None: 
     root.remove(rootModule) 
    if not rootPOM is None: 
     root.remove(rootPOM) 
    if not goals is None: 
     root.remove(goals) 
    if not mavenName is None: 
     root.remove(mavenName) 
    if not mavenOpts is None: 
     root.remove(mavenOpts) 

    e.write(sys.argv[1], xml_declaration=True, pretty_print=True, encoding='utf-8', method="xml") 

if __name__ == "__main__": 
    parseXML(sys.argv[1]) 
相關問題