首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中将jenkins作业配置config.xml转换为YAML格式,以便使用jenkins-作业生成器?

如何在python中将jenkins作业配置config.xml转换为YAML格式,以便使用jenkins-作业生成器?
EN

Stack Overflow用户
提问于 2014-01-25 14:48:21
回答 3查看 8.1K关注 0票数 4

詹金斯-职业建设者是一个很好的工具,可以帮助我维护YAML文件中的作业。参见配置章节中的示例。

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

您对在python中找到一个快速解决方案有什么建议吗?

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

对于转换,某些部分可以被忽略,比如命名空间。

config.xml段看起来如下:

代码语言:javascript
复制
<project>
  <logRotator class="hudson.tasks.LogRotator">
    <daysToKeep>-1</daysToKeep>
    <numToKeep>20</numToKeep>
    <artifactDaysToKeep>-1</artifactDaysToKeep>
    <artifactNumToKeep>-1</artifactNumToKeep>
  </logRotator>
  ...
</project>

yaml输出可以是:

代码语言:javascript
复制
- project:
   logrotate:
     daysToKeep: -1
     numToKeep: 20
     artifactDaysToKeep: -1
     artifactNumToKeep: -1

如果您不熟悉詹金斯的config.xml,可以在https://ci.jenkins-ci.org中检查后端-合并所有回购作业

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-26 12:18:59

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

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

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

代码语言:javascript
复制
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解析器。

票数 2
EN

Stack Overflow用户

发布于 2015-08-26 23:05:37

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

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

现在它适用于非常简单的工作。我已经采取了一种安全/悲观的方法,如果程序遇到还无法转换的XML,程序就会退出。

票数 3
EN

Stack Overflow用户

发布于 2016-04-27 09:30:23

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

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

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

也许你想花一个小时(或两个)来提前更新你的XPath诀窍。

一旦您认识到在使用XMLStarlet之前您在编程XMLStarlet上花费了多少时间,您就会流下几滴眼泪。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21351996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档