Можно ли преобразовать работу в стиле Дженкинса в многоуровневое задание?
У меня довольно много бесплатных работ в Jenkins, которые я хотел бы преобразовать в задания с несколькими конфигурациями, чтобы я мог создавать на нескольких платформах под одной работой. Эти задания задают несколько параметров сборки, и я бы не хотел, чтобы их вручную настраивать вручную, создавая новые задания с несколькими конфигурациями. Каждая работа в настоящее время ограничивает их сборку на платформе, на которой мы строим, и единственным другим вариантом, который я вижу, является клонирование существующей работы и изменение ограничения на новую платформу. Это не идеально, так как мне нужно поддерживать 2 задания, где единственная разница - целевая платформа.
Я не вижу способа сделать это с помощью пользовательского интерфейса, но задаюсь вопросом, есть ли другой способ.
Ответы
Ответ 1
Насколько я знаю, нет способа конвертировать тип задания в пользовательский интерфейс. Вам придется либо отредактировать задание config.xml, либо скопировать и отредактировать файл конфигурации и создать новое задание на основе отредактированной конфигурации.
Вам нужно будет проверить различия между свободным стилем и
многоконфигурационное задание с различными настройками, которые вы используете. Это может быть как
просто как изменение элемента верхнего уровня в config.xml от project
до matrix-project
.
Если вы редактируете существующую конфигурацию заданий, вам нужно либо сделать это, пока
Jenkins отключен, или сообщите Jenkins о перезагрузке конфигурации через Управление
Jenkins → Обновить конфигурацию с диска.
Если вы решите создать новые рабочие места, этот предыдущий вопрос может быть вам полезен
вы выясните, какие изменения необходимо внести. В частности этот ответ описывает, как
для загрузки файла конфигурации для создания нового задания.
Ответ 2
Просто примечание для тех, кто хотел бы переключиться с maven на фристайл.
- Измените тег
maven2-moduleset
на project
.
- Удалить теги:
rootModule
, goals
, mavenValidationLevel
(должны быть близки друг к другу).
- Объединить
prebuilders
и postbuilders
в builders
.
Ответ 3
Я только что написал script, чтобы конвертировать около 10000 Jenkins Jobs из Maven Job Type в Freestyle. Пожалуйста, не используйте его вслепую. Вы можете потерять параметры конфигурации или оказаться в сломанной настройке Jenkins.
Часть Python принимает конфигурационный файл xml в качестве аргумента и перезаписывает один и тот же файл с преобразованными данными. Я запустил это в прямом эфире в файловой системе Jenkins со следующей командой:
cd /path/to/jenkins/jobs
find * -maxdepth 2 -name config.xml -exec /path/to/maven2freestyle.py {} \;
ВНИМАНИЕ. Это может сломать ваших Дженкинсов! Сохраните резервную копию!
#!/usr/bin/env python2
import copy
import sys
from lxml import etree
from lxml.etree import fromstring, tostring
from StringIO import StringIO
def parseXML(xmlFile):
print(xmlFile)
f = open(xmlFile)
xml = f.read()
f.close()
e = etree.parse(xmlFile)
root = e.getroot()
if root.tag != 'maven2-moduleset':
#print("WARNING: Skipping non Maven Project")
return
#change project type
root.tag = "project"
if 'plugin' in root.attrib:
del root.attrib["plugin"]
#get maven data
rootModule = root.find('./rootModule')
rootPOM = root.find('./rootPOM')
goals = root.find('./goals')
mavenName = root.find('./mavenName')
mavenOpts = root.find('./mavenOpts')
# merge prebuilders into builders
prebuilders = root.findall("./prebuilders/*")
builders = etree.Element("builders")
root.insert(99, builders)
if len(prebuilders) > 0:
builders.append(copy.deepcopy(prebuilders[0]))
#create maven builder
maven = etree.Element("hudson.tasks.Maven")
if not goals is None:
etree.SubElement(maven, "targets").text = goals.text
if not mavenName is None:
etree.SubElement(maven, "mavenName").text = mavenName.text
if not rootPOM is None:
etree.SubElement(maven, "pom").text = rootPOM.text
if not mavenOpts is None:
etree.SubElement(maven, "javaOpts").text = mavenOpts.text
builders.append(maven)
#cleanup
prebuilder = root.findall("./prebuilders")
if len(prebuilder) > 0:
root.remove(prebuilder[0])
if not rootModule is None:
root.remove(rootModule)
if not rootPOM is None:
root.remove(rootPOM)
if not goals is None:
root.remove(goals)
if not mavenName is None:
root.remove(mavenName)
if not mavenOpts is None:
root.remove(mavenOpts)
e.write(sys.argv[1], xml_declaration=True, pretty_print=True, encoding='utf-8', method="xml")
if __name__ == "__main__":
parseXML(sys.argv[1])