jenkins-job-builder是一个很好的工具,可以帮助我维护YAML文件中的作业。请参见配置章节中的示例。
YAML
现在我有很多旧的jenkins作业,拥有一个Python脚本xml2yaml将现有的jenkins作业转换config.xml为YAML文件格式会很好。
xml2yaml
config.xml
您对在python中快速解决方案有何建议?
我不需要jenkins-job-builder直接使用它,只需将其转换为YAML以供参考。
jenkins-job-builder
对于转换,可以忽略某些部分,例如名称空间。
config.xml 段看起来像:
<project> <logRotator class="hudson.tasks.LogRotator"> <daysToKeep>-1</daysToKeep> <numToKeep>20</numToKeep> <artifactDaysToKeep>-1</artifactDaysToKeep> <artifactNumToKeep>-1</artifactNumToKeep> </logRotator> ... </project>
该yaml输出可以是:
yaml
- project: logrotate: daysToKeep: -1 numToKeep: 20 artifactDaysToKeep: -1 artifactNumToKeep: -1
如果您不熟悉config.xmljenkins,可以在https://ci.jenkins-ci.org中检查infra_backend-merge-all-repo作业。
从您的问题很难确切地知道您在这里寻找什么,但是假设您正在寻找基本结构:
Python在大多数平台上都对XML解析提供了良好的支持。您可能会想使用一些简单易用的东西,例如minidom。有关您的python版本,请参见python文档中的 XML处理模块 。
project鉴于yaml格式的简单性,打开文件后,查找然后从那里进行解析并使用简单的映射应该可以很好地工作。
project
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解析器。