2011-10-03 3 views
22

저는 Jenkins에서 하나의 작업으로 여러 플랫폼에 걸쳐 빌드 할 수 있도록 여러 구성 작업으로 변환하고 싶은 꽤 많은 프리 스타일 작업이 있습니다. 이 작업은 꽤 많은 빌드 매개 변수를 지정하며 새로운 다중 구성 작업을 만들어 수동으로 다시 설정할 필요가 없습니다. 각 작업은 현재 우리가 구축해온 플랫폼으로 빌드를 제한하고 있으며 기존 작업을 복제하고 새로운 플랫폼으로 제한을 변경하는 유일한 다른 옵션이 있습니다. 유일한 차이점이 대상 플랫폼 인 경우 2 개의 작업을 유지해야하므로 이상적인 것은 아닙니다.젠킨스 프리 스타일 작업을 다중 구성 작업으로 변환 할 수 있습니까?

UI를 통해이를 수행하는 방법이 보이지 않지만 다른 방법이 있는지 궁금합니다.

답변

22

내가 아는 한 UI의 작업 유형을 변환 할 수있는 방법이 없습니다. 작업의 config.xml을 편집하거나 구성 파일을 복사 및 편집하고 편집 된 구성을 기반으로 새 작업을 만들어야합니다.

자유형과 다중 구성 작업 간의 차이점을 사용하는 다양한 설정으로 확인해야합니다. config.xml에서 최상위 요소를 project에서 matrix-project으로 변경하면 간단하게 일 수 있습니다.

기존 작업 구성을 편집 할 경우, 당신이해야하는 하나 젠킨스가 오프라인 또는 젠킨스 관리 를 통해 구성을 다시로드 젠킨스에게 동안을 - 디스크에서>다시로드 구성.

새 작업을 만들기로 결정한 경우 을 수정하면 this previous question이 도움이 될 수 있습니다. 특히 this answer은 이 새 작업을 만들기 위해 구성 파일을 업로드하는 방법을 설명합니다.

+0

실제로 시도하지는 않았지만 개괄 한 프로세스가 효과가있는 것 같습니다.UI로 직접 해보기로했습니다. 이 접근 방식이 약간 위험하다고 생각하고 길 아래의 미묘한 문제로 끝날 수도 있습니다. 응답 해 주셔서 감사합니다. –

+0

새로운 "오래된 데이터 관리"기능을 사용하면 작업 유형이 변경되어 쓸모없는 항목이 표시됩니다. – reechard

+1

잘 작동합니다. 또한 원하는 요소를 추가하고 UI를 편집하지 않고도 를 제거했습니다. 그러나 작업의 빌드 이력은 손실됩니다. – OrangeDog

4

메이븐에서 프리 스타일 직업으로 전환하려는 사람들을위한 메모.

  1. project으로 태그를 변경하십시오.
  2. 태그 제거 : rootModule, goals, mavenValidationLevel (서로 가깝게 위치해야 함).
  3. prebuilderspostbuildersbuilders으로 병합합니다.
+0

Hrm, 이것을 수행 한 후 - "manage jenkins"가 사용하지 않는 데이터를보고합니다.이 중 "부모가 없습니다"라는 오류가 발생하여 정리가 중단되는 경우, 다른 요소/속성이 수정 될 수 있습니까? –

+1

일부 플러그인은 엉망이 될 수도 있습니다 (수동으로 태그를 제거해야합니다). 또는 "디스크에서 구성 다시로드"옵션을 사용해야 할 수도 있습니다. – Nux

1

방금 ​​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]) 
관련 문제