小编典典

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

jenkins

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

如果您不熟悉config.xmljenkins,可以在https://ci.jenkins-ci.org中检查infra_backend-merge-all-repo作业


阅读 456

收藏
2020-07-25

共1个答案

小编典典

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

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解析器。

2020-07-25