问题描述
jenkins-job-builder 是一个很好的工具,可以帮助我维持工作在YAML
文件中.参见配置章节中的示例.
jenkins-job-builder is a nice tool to help me to maintain jobs in YAML
files. see example in configuration chapter.
现在我有很多旧的jenkins作业,拥有python脚本xml2yaml
将现有的jenkins作业config.xml
转换为YAML
文件格式会很好.
Now I had lots of old jenkins jobs, it will be nice to have a python script xml2yaml
to convert the existing jenkins job config.xml
to YAML
file format.
您对使用python快速解决方案有任何建议吗?
Do you any suggestions to had a quick solution in python ?
我不需要直接在jenkins-job-builder
中使用它,只需将其转换为YAML以供参考.
I don't need it to be used in jenkins-job-builder
directly, just can be converted it into YAML for reference.
对于转换,某些部分可以忽略,例如名称空间.
For the convert, some part can be ignored like namespace.
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
,则可以检查 .jenkins-ci.org
If you are not familiar with config.xml
in jenkins, you can check infra_backend-merge-all-repo job in https://ci.jenkins-ci.org
推荐答案
很难从您的问题中确切地知道您在这里寻找什么,但是假设您正在寻找基本结构:
It's hard to tell from your question exactly what you're looking for here, but assuming you're looking for the basic structure:
Python在大多数平台上都对XML解析提供了良好的支持.您可能会想使用一些简单易用的东西,例如minidom.有关您的python版本,请参阅python文档中的 XML处理模块.
Python has good support on most platforms for XML Parsing. Chances are you'll want to use something simple and easy to use like minidom. See the XML Processing Modules in the python docs for your version of python.
打开文件后,先查找project
,然后从那里解析,然后使用简单的映射就可以了,因为yaml格式很简单.
Once you've opened the file, looking for project
and then parsing down from there and using a simple mapping should work pretty well given the simplicity of the yaml format.
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解析器.
This snippet will print just a few lines of the eventual configuration file, but it puts you in the right direction for a simple translator. Based on what I've seen, there's not much room for an automatic translation scheme due to naming differences. You could streamline the code as you iterate for more options and to be table driven, but that's "just a matter of programming", this will at least get you started with the DOM parsers in python.
这篇关于如何在python中将jenkins作业配置config.xml转换为YAML格式以用于jenkins-job-builder?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!