![](/img/trans.png)
[英]How to parse and update jenkins job config.xml using python jenkinsapi module
[英]How to convert jenkins job configuration config.xml to YAML format in python to be used jenkins-job-builder?
jenkins-job-builder是一個很好的工具,可以幫助我維護YAML
文件中的作業。 請參閱配置章節中的示例。
現在我有很多舊的jenkins工作,有一個python腳本xml2yaml
將現有的jenkins job config.xml
轉換為YAML
文件格式會很不錯。
你有任何建議在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作業 。
很難從你的問題中准確地告訴你在這里尋找什么,但假設你正在尋找基本結構:
Python在大多數XML解析平台上都有很好的支持。 您可能希望使用像minidom這樣簡單易用的東西。 有關您的python版本,請參閱python docs中的XML Processing Modules 。
一旦你打開文件,尋找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解析器。
我正在編寫一個程序來執行從XML到YAML的轉換。 它可以動態查詢Jenkins服務器並將所有作業轉換為YAML。
https://github.com/ktdreyer/jenkins-job-wrecker
現在它適用於非常簡單的工作。 我采取了一種安全/悲觀的方法,如果遇到無法翻譯的XML,程序將會保釋。
我建議在命令行和shell腳本中使用xmlstarlet查詢和訪問帶有xpath表達式的xml 。 對XML的低級程序化訪問沒有問題。 XMLStarlet
是命令行上的XPath瑞士軍刀。
“ xmlstarlet el
”向您展示整個XML的元素結構作為XPath表達式。
“ xmlstarlet sel -t -c XPath-expression
”將精確提取您想要的內容。
也許你想花一個小時(或兩個小時)提前完成你的XPath技術訣竅。
一旦你意識到在使用XMLStarlet之前花了多少時間編程XML訪問,你就會流下眼淚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.