2011-10-03 18 views
22

मेरे पास जेनकिन्स में कुछ मुफ्त-शैली की नौकरियां हैं जिन्हें मैं बहु-कॉन्फ़िगरेशन नौकरियों में परिवर्तित करना चाहता हूं ताकि मैं एक नौकरी के तहत कई प्लेटफार्मों में निर्माण कर सकूं। ये नौकरियां कुछ बिल्ड पैरामीटर निर्दिष्ट करती हैं और मैं नई बहु-कॉन्फ़िगरेशन नौकरियां बनाकर मैन्युअल रूप से उन्हें सेट अप नहीं करना चाहूंगा। प्रत्येक नौकरी वर्तमान में उस प्लेटफॉर्म पर अपने निर्माण को सीमित कर रही है जिसे हम बना रहे हैं और एकमात्र अन्य विकल्प जो मैं देख रहा हूं वह मौजूदा नौकरी को क्लोन करना और नए प्लेटफ़ॉर्म पर प्रतिबंध को बदलना है। यह आदर्श नहीं है क्योंकि मुझे 2 नौकरियों को बनाए रखने की आवश्यकता होगी जहां एकमात्र अंतर लक्ष्य मंच है।क्या जेनकिन्स फ्री-स्टाइल नौकरी को बहु-कॉन्फ़िगरेशन जॉब में परिवर्तित करना संभव है?

मुझे यूआई के माध्यम से ऐसा करने का कोई तरीका नहीं दिख रहा है, लेकिन सोच रहा है कि कोई और तरीका है या नहीं।

उत्तर

22

जहां तक ​​मुझे पता है, यूआई में नौकरी के प्रकार को बदलने का कोई तरीका नहीं है। आपको या तो नौकरी के config.xml संपादित करना होगा, या कॉन्फ़िगरेशन फ़ाइल कॉपी और संपादित करना होगा और संपादित कॉन्फ़िगरेशन के आधार पर एक नई नौकरी बनाना होगा।

आपको उपयोग की जाने वाली विभिन्न सेटिंग्स के साथ एक फ्री-स्टाइल और बहु-कॉन्फ़िगरेशन जॉब के बीच अंतरों को देखना होगा। यह config.xmlproject से matrix-project से शीर्ष-स्तर तत्व को बदलने के रूप में सरल हो सकता है।

आप मौजूदा नौकरी विन्यास संपादित करते हैं, आपको या तो यह करना है, जबकि जेनकींस ऑफ़लाइन है, या जेनकींस बता के माध्यम से इसके विन्यास को फिर से लोड करने के लिए जेनकींस प्रबंधित करें - डिस्क से>पुनः लोड विन्यास।

यदि आप नई नौकरियां बनाने का निर्णय लेते हैं, this previous question पर एक बार सहायक हो सकता है, तो आप समझते हैं कि किन संपादनों की आवश्यकता है। विशेष रूप से this answer वर्णन करता है कि एक नई नौकरी बनाने के लिए कॉन्फ़िगरेशन फ़ाइल अपलोड करने के लिए कैसे करें।

+0

हालांकि मैं वास्तव में यह कोशिश नहीं करता था, ऐसा प्रतीत होता है कि आपने जिस प्रक्रिया को रेखांकित किया है वह काम करेगा।मैंने आगे बढ़ने का फैसला किया और उन्हें यूआई के माध्यम से किया। मुझे लगा कि यह दृष्टिकोण थोड़ा जोखिम भरा था और मैं सड़क के नीचे सूक्ष्म मुद्दों के साथ समाप्त हो सकता है। जवाब के लिए धन्यवाद। –

+0

और नए "पुराने डेटा प्रबंधित करें" सुविधा के साथ, यह उन चीज़ों को दिखाना चाहिए जो नौकरी प्रकार के परिवर्तन से अप्रचलित थे। – reechard

+1

अच्छी तरह से काम करता है। वांछित तत्व भी जोड़ा और किसी भी यूआई संपादन करने के लिए सहेजने के लिए को हटा दिया। हालांकि, यह नौकरी के लिए निर्माण इतिहास खो देता है। – OrangeDog

4

उन लोगों के लिए बस एक नोट जो मैवेन से फ्रीस्टाइल नौकरी में स्विच करना चाहते हैं।

  1. maven2-modulesetproject पर टैग बदलें।
  2. टैग निकालें: rootModule, goals, mavenValidationLevel (एक दूसरे के करीब होना चाहिए)।
  3. prebuilders और postbuildersमें मर्ज करें।
+0

एचआरएम, ऐसा करने के बाद - "जेनकिन्स प्रबंधित करें" अप्रयुक्त डेटा की रिपोर्ट करता है, जिसमें से एक क्लीनअप "कोई अभिभावक नहीं मिला" कहने में त्रुटि के साथ दुर्घटनाग्रस्त हो जाता है, मुझे आश्चर्य है कि क्या कोई अन्य तत्व/विशेषता है tweak? –

+1

आपके पास कुछ प्लगइन्स हो सकते हैं जो गड़बड़ हो जाते हैं (और आपको मैन्युअल रूप से इसके टैग को हटाने की आवश्यकता है)। या यदि आपके पास नहीं है तो आपको "डिस्क से रीलोड कॉन्फ़िगरेशन" विकल्प का उपयोग करने की आवश्यकता हो सकती है। – Nux

1

मैंने मैवेन जॉब टाइप टू फ्रीस्टाइल से लगभग 10000 जेनकिन्स जॉब्स को बदलने के लिए एक स्क्रिप्ट लिखी है। कृपया इसे अंधाधुंध प्रयोग न करें। आप कॉन्फ़िगरेशन विकल्प खो सकते हैं या टूटे हुए जेनकिंस सेटअप में समाप्त हो सकते हैं। पायथन भाग एक कॉन्फ़िगरेशन 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]) 
संबंधित मुद्दे