Как преобразовать файл конфигурации конфигурации 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.