Build 是否可以将Jenkins自由式作业转换为多配置作业?

Build 是否可以将Jenkins自由式作业转换为多配置作业?,build,jenkins,hudson,multi-configuration,Build,Jenkins,Hudson,Multi Configuration,我在Jenkins有很多自由风格的工作,我想转换成多配置工作,这样我就可以在一个工作下跨多个平台进行构建。这些作业指定了很多构建参数,我不想再通过创建新的多配置作业来手动设置它们。每个作业当前都将其构建限制在我们构建的平台上,我看到的唯一其他选项是克隆现有作业并将限制更改为新平台。这并不理想,因为我需要维护两个作业,其中唯一的区别是目标平台 我看不到通过UI实现这一点的方法,但想知道是否还有其他方法。据我所知,无法在UI中转换作业类型。您必须编辑作业的config.xml,或者复制并编辑配置文件

我在Jenkins有很多自由风格的工作,我想转换成多配置工作,这样我就可以在一个工作下跨多个平台进行构建。这些作业指定了很多构建参数,我不想再通过创建新的多配置作业来手动设置它们。每个作业当前都将其构建限制在我们构建的平台上,我看到的唯一其他选项是克隆现有作业并将限制更改为新平台。这并不理想,因为我需要维护两个作业,其中唯一的区别是目标平台


我看不到通过UI实现这一点的方法,但想知道是否还有其他方法。

据我所知,无法在UI中转换作业类型。您必须编辑作业的config.xml,或者复制并编辑配置文件,并根据编辑的配置创建新作业

你必须检查自由风格和自由风格之间的区别 具有您使用的各种设置的多配置作业。可能是 只需将config.xml中的顶级元素从
project
更改为
matrix project

如果编辑现有作业配置,则需要在 Jenkins处于脱机状态,或者告诉Jenkins通过Manage重新加载其配置 Jenkins->从磁盘重新加载配置

如果你决定创造新的就业机会,可能会有帮助 您可以确定需要进行哪些编辑。具体描述了如何
上载配置文件以创建新作业

对于那些想从专业人士转到自由式工作的人来说,这只是一个提示

  • maven2模块集
    标记更改为
    project
  • 删除标记:
    rootModule
    goals
    mavenValidationLevel
    (应该彼此靠近)
  • prebuilders
    postbuilders
    合并到
    builders

  • 我刚刚写了一个脚本,将大约10000个Jenkins工作从Maven工作类型转换为Freestyle。请不要盲目使用它。您可能会丢失配置选项或最终导致Jenkins安装程序损坏。 Python部分采用配置xml作为参数,并用转换后的数据覆盖同一文件。我使用以下命令在Jenkins文件系统上运行了此live:

    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])
    

    虽然我并没有真正尝试过这个,但你所描述的过程似乎是可行的。我决定继续,通过用户界面来完成。我觉得这种方法有点冒险,我可能最终会遇到一些微妙的问题。感谢您的回复。有了新的“管理旧数据”功能,它应该可以显示因工作类型变化而过时的内容。效果很好。还添加了所需的元素,并删除了要保存的元素,以便进行任何UI编辑。但是,它确实会丢失该作业的构建历史记录。我在Jenkins 1.647中尝试了这一点,但之前的所有构建都有错误的时间戳,并且都是红色的。以前的版本也不再被记录。Hrm,执行此操作后,“manage jenkins”报告未使用的数据,其中一个清理崩溃,错误为“no parent found”,我想知道是否还有其他元素/属性需要调整?您可能有一些插件出错(您需要手动删除它的标记)。或者,如果没有,您可能需要使用选项“从磁盘重新加载配置”。如果您想保留构建,请在
    builds
    文件夹中使用
    grep-rl“hudson.maven.MavenModuleSetBuild”。| xargs sed-i's/hudson.maven.MavenModuleSetBuild/build/g'