簡體   English   中英

如何在python中將jenkins作業配置config.xml轉換為YAML格式以使用jenkins-job-builder?

[英]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腳本中使用查詢和訪問帶有表達式的 對XML的低級程序化訪問沒有問題。 XMLStarlet是命令行上的XPath瑞士軍刀。

xmlstarlet el ”向您展示整個XML的元素結構作為XPath表達式。

xmlstarlet sel -t -c XPath-expression ”將精確提取您想要的內容。

也許你想花一個小時(或兩個小時)提前完成你的XPath技術訣竅。

一旦你意識到在使用XMLStarlet之前花了多少時間編程XML訪問,你就會流下眼淚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM