Как преобразовать файл конфигурации конфигурации jenkins config.xml в формат YAML на python, чтобы использовать jenkins-job-builder?

http://ci.openstack.org/jenkins-job-builder/ - хороший инструмент, чтобы помочь мне сохранить работу в YAML файлы. см. пример в главе о конфигурации.

Теперь у меня было много старых заданий Дженкинса, было бы неплохо иметь скрипт на python xml2yaml конвертировать существующую работу Дженкинс 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

Если вы не знакомы с config.xml в jenkins вы можете проверить задание infra_backend-merge-all-repo на https://ci.jenkins-ci.org/

3 ответа

Решение

По вашему вопросу трудно сказать, что именно вы ищете здесь, но при условии, что вы ищете базовую структуру:

Python имеет хорошую поддержку на большинстве платформ для разбора XML. Скорее всего, вы захотите использовать что-то простое и легкое в использовании, например, минидом. Посмотрите Модули Обработки XML в документации по Python для вашей версии Python.

После того, как вы открыли файл, ищите 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)

Этот фрагмент напечатает всего несколько строк конечного файла конфигурации, но он направит вас в правильном направлении для простого переводчика. Исходя из того, что я видел, не так много места для автоматической схемы перевода из-за различий в именах. Вы можете упростить код при выполнении итерации для получения дополнительных опций и управления таблицами, но это "просто вопрос программирования", это по крайней мере поможет вам начать работу с анализаторами DOM в python.

Я пишу программу, которая делает это преобразование из XML в YAML. Он может динамически запрашивать сервер Jenkins и переводить все задания в YAML.

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

Прямо сейчас это работает для очень простых заданий. Я выбрал безопасный / пессимистичный подход, и программа выполнит залог, если встретит XML, который еще не может перевести.

Я предлагаю запрашивать и получать доступ к xml с помощью выражений xpath, используя xmlstarlet в командной строке и в сценариях оболочки. Нет проблем с низкоуровневым программным доступом к XML. XMLStarlet швейцарский армейский нож XPath в командной строке

"xmlstarlet el"показывает вам структуру элемента всего XML в виде выражений XPath.

"xmlstarlet sel -t -c XPath-expressionбудет извлекать именно то, что вы хотите.

Может быть, вы хотите потратить час (или два) на обновление своего ноу-хау в XPath.

Вы прольете пару слез, когда узнаете, сколько времени вы потратили на программирование доступа к XML, прежде чем использовать XMLStarlet.

Другие вопросы по тегам