2011-10-03 83 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]) 
相关问题