我在Jenkins有很多自由風格的工作,我想轉換成多配置作業,這樣我就可以在一個作業下跨多個平臺構建。這些作業指定了很多構建參數,我不想通過創建新的多配置作業來手動設置它們。目前,每項工作都將其構建限制在我們一直在構建的平臺上,而我所看到的另一個選擇是克隆現有工作並將限制更改爲新平臺。這並不理想,因爲我需要維持2個職位,唯一的區別就是目標平臺。是否可以將Jenkins自由式作業轉換爲多配置作業?
我沒有看到通過用戶界面執行此操作的方法,但是想知道是否有其他方法。
我在Jenkins有很多自由風格的工作,我想轉換成多配置作業,這樣我就可以在一個作業下跨多個平臺構建。這些作業指定了很多構建參數,我不想通過創建新的多配置作業來手動設置它們。目前,每項工作都將其構建限制在我們一直在構建的平臺上,而我所看到的另一個選擇是克隆現有工作並將限制更改爲新平臺。這並不理想,因爲我需要維持2個職位,唯一的區別就是目標平臺。是否可以將Jenkins自由式作業轉換爲多配置作業?
我沒有看到通過用戶界面執行此操作的方法,但是想知道是否有其他方法。
據我所知,沒有辦法轉換UI中的作業類型。您必須編輯作業的config.xml,或者複製並編輯配置文件,並根據編輯後的配置創建新作業。
您必須檢查自由風格和多配置作業與使用的各種設置之間的差異。它可能如 一樣簡單,因爲將config.xml中的頂級元素從project
更改爲matrix-project
。
如果您編輯現有的作業配置,你要麼需要做的,而 詹金斯是脫機狀態,或者告訴詹金斯通過重新加載其配置管理 詹金斯 - 從磁盤>重新加載配置。
如果您決定創建新作業,則this previous question可能會有所幫助,因此您可以找出需要進行哪些編輯的地方 。具體來說this answer描述瞭如何 上傳一個配置文件來創建一個新的工作。
只爲那些希望從maven轉向自由式工作的人提供一個說明。
maven2-moduleset
標記爲project
。rootModule
,goals
,mavenValidationLevel
(應該彼此接近)。prebuilders
和postbuilders
分成builders
。Hrm,在這樣做之後 - 「管理jenkins」報告未使用的數據,其中清理崩潰時出現「找不到父母」的錯誤,我想知道是否還有其他元素/屬性需要調整? –
你可能會遇到一些搞砸的插件(你需要手動刪除它的標籤)。或者你可能需要使用選項「從磁盤重新加載配置」,如果你沒有。 – Nux
我剛剛寫了一個腳本,將約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])
雖然我沒有真正嘗試這個,但看起來你所概述的過程是可行的。我決定繼續前進,並通過用戶界面進行操作。我覺得這種做法有點冒險,我可能最終會遇到一些微妙的問題。感謝您的迴應。 –
隨着新的「管理舊數據」功能,它應顯示已被作業類型更改過時的東西。 – reechard
運作良好。還添加了所需的元素並刪除了以保存必須執行的任何UI編輯。但是,它確實失去了工作的構建歷史。 –
OrangeDog