방금 Maven Job Type에서 Freestyle으로 약 10000 Jenkins Jobs를 변환하는 스크립트를 작성했습니다. 맹목적으로 사용하지 마십시오. 구성 옵션을 잃어 버리거나 Jenkins의 깨진 설정에서 종료 될 수 있습니다. 파이썬 파트는 config xml을 인수로 취해서 변환 된 데이터로 동일한 파일을 덮어 씁니다. 다시
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])
실제로 시도하지는 않았지만 개괄 한 프로세스가 효과가있는 것 같습니다.UI로 직접 해보기로했습니다. 이 접근 방식이 약간 위험하다고 생각하고 길 아래의 미묘한 문제로 끝날 수도 있습니다. 응답 해 주셔서 감사합니다. –
새로운 "오래된 데이터 관리"기능을 사용하면 작업 유형이 변경되어 쓸모없는 항목이 표시됩니다. – reechard
잘 작동합니다. 또한 원하는 요소를 추가하고 UI를 편집하지 않고도 를 제거했습니다. 그러나 작업의 빌드 이력은 손실됩니다. –
OrangeDog