4

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

现在我有很多旧的 jenkins 作业,如果有一个 python 脚本xml2yaml将现有的 jenkins 作业转换config.xmlYAML文件格式,那就太好了。

你有什么建议可以在 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,可以查看https://ci.jenkins-ci.org的 infra_backend-merge-all-repo 作业

4

3 回答 3

3

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

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

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

于 2015-08-26T23:05:37.933 回答
2

很难从您的问题中确切地说出您在这里寻找什么,但假设您正在寻找基本结构:

Python 在大多数平台上对 XML 解析都有很好的支持。您可能会想要使用一些简单易用的东西,例如 minidom。有关您的 python 版本,请参阅python 文档中的XML 处理模块。

打开文件后,查找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 解析器。

于 2014-01-26T12:18:59.377 回答
1

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

" xmlstarlet el" 将整个 XML 的元素结构显示为 XPath 表达式。

" xmlstarlet sel -t -c XPath-expression" 将准确提取您想要的内容。

也许您想提前花一个(或两个)小时来更新您的 XPath 知识。

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

于 2016-04-27T09:30:23.840 回答