如何在python中将jenkins作业配置config.xml转换为YAML格式以使用jenkins-job-builder?

时间:2014-01-25 14:48:22

标签: python xml-parsing jenkins yaml jenkins-job-builder

jenkins-job-builder是一个很好的工具,可以帮助我维护YAML个文件中的作业。请参阅configuration章节中的示例。

现在我有很多旧的jenkins工作,最好有一个python脚本xml2yaml将现有的jenkins工作config.xml转换为YAML文件格式。

你有任何建议在python中有一个快速的解决方案吗?

我不需要直接在jenkins-job-builder中使用它,只需将其转换为YAML以供参考。

对于转换,某些部分可以像名称空间一样被忽略。

config.xml细分如下:

<project>
  <logRotator class="hudson.tasks.LogRotator">
    <daysToKeep>-1</daysToKeep>
    <numToKeep>20</numToKeep>
    <artifactDaysToKeep>-1</artifactDaysToKeep>
    <artifactNumToKeep>-1</artifactNumToKeep>
  </logRotator>
  ...
</project>

yaml输出可能是:

- project:
   logrotate:
     daysToKeep: -1
     numToKeep: 20
     artifactDaysToKeep: -1
     artifactNumToKeep: -1

如果您不熟悉jenkins中的config.xml,可以查看infra_backend-merge-all-repo job中的https://ci.jenkins-ci.org

3 个答案:

答案 0 :(得分:2)

很难从你的问题中准确地告诉你在这里寻找什么,但假设你正在寻找基本结构:

Python在大多数XML解析平台上都有很好的支持。您可能希望使用像minidom这样简单易用的东西。请参阅python文档中的 XML处理模块,了解您的python版本。

打开文件后,查找project然后从那里解析并使用简单的映射应该可以很好地工作,因为yaml格式很简单。

from xml.dom.minidom import parse

def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)

def getTextForTag(nodelist,tag):
    elements = nodelist.getElementsByTagName(tag)
    if (elements.length>0):
        return getText( elements[0].childNodes)
    return ''

def printValueForTag(parent, indent, tag, valueName=''):
    value = getTextForTag( parent,tag)
    if (len(value)>0):
        if (valueName==''):
            valueName = tag
        print indent + valueName+": "+value

def emitLogRotate(indent, rotator):
    print indent+"logrotate:"
    indent+='  '
    printValueForTag( rotator,indent, 'daysToKeep')
    printValueForTag( rotator,indent, 'numToKeep')  
def emitProject(project):
    print "- project:"
    # all projects have log rotators, so no need to chec
    emitLogRotate("   ",project.getElementsByTagName('logRotator')[0])
    # next section...

dom = parse('config.xml')
emitProject(dom)

此代码段只会打印最终配置文件的几行,但它会为您提供简单翻译的正确方向。基于我所看到的,由于命名差异,自动翻译方案的空间不大。你可以在迭代更多选项和表驱动时简化代码,但这只是“编程问题”,这至少可以让你开始使用python中的DOM解析器。

答案 1 :(得分:2)

我正在编写一个程序来执行从XML到YAML的转换。它可以动态查询Jenkins服务器并将所有作业转换为YAML。

https://github.com/ktdreyer/jenkins-job-wrecker

现在它适用于非常简单的工作。我采取了一种安全/悲观的方法,如果遇到无法翻译的XML,程序将会保释。

答案 2 :(得分:1)

我建议在命令行和shell脚本中使用使用表达式查询和访问。对XML的低级程序化访问没有问题。 XMLStarlet是命令行上的XPath瑞士军刀。

&#34; xmlstarlet el&#34;向您展示整个XML的元素结构作为XPath表达式。

&#34; xmlstarlet sel -t -c XPath-expression&#34;会精确地提取你想要的东西。

也许您希望花一小时(或两个小时)提前完成XPath专业知识。

一旦你意识到在使用XMLStarlet之前花了多少时间编程XML访问,你就会流下眼泪。