2015-10-13 15 views
8

के माध्यम से सबप्रोजेक्ट बिल्ड प्राप्त करना मेरे पास एक जेनकींस प्रोजेक्ट कॉन्फ़िगर किया गया है (मैं इसे सुपरजोब कहूंगा) बस क्रमशः कई अलग-अलग जेनकींस परियोजनाओं को कॉल करने के लिए।जेनकिंस एपीआई

मैं HERE तैनात जेनकींस एपीआई

के माध्यम से इस SuperJob की एक विशिष्ट बिल्ड नंबर के लिए सभी उप कोड को देखते हुए का परिणाम मैं विशिष्ट की सूची प्राप्त करने में सक्षम हूँ पता लगाने के लिए सक्षम होने के लिए चाहते हैं प्रत्येक बिल्ड से सुपरजोब प्रोजेक्ट में कॉन्फ़िगर की गई परियोजनाएं हालांकि मैं यह पूछने का कोई तरीका नहीं ढूंढ पा रहा हूं कि इन परियोजनाओं में से प्रत्येक का विशिष्ट निर्माण संख्या सुपरजोब के विशिष्ट निर्माण से चलाया गया था।

उदाहरण के लिए, मैं यह जानना चाहता हूं कि "सुपरजोब बिल्ड # 5" ने "मायजोब बिल्ड # 3" और "अन्य जोब बिल्ड # 20" ट्रिगर किया है, इसलिए मैं उन सभी के लिए परिणामों को एकत्रित और जांच सकता हूं।

मैंने सभी उपधाराओं और डाउनस्ट्रीम एपीआई को उप-परियोजनाओं का उपयोग करके संबंधों के लिए तर्क के रूप में उपयोग करने की कोशिश की है, लेकिन वे सभी खाली या शून्य वापस आते हैं।

मुझे लगता है कि यह संभव है क्योंकि जेनकिंस स्वयं वेब यूई में उस जानकारी को दिखाने में सक्षम है जो प्लगइन से आ रहा है लेकिन मैं यह पता लगाने में सक्षम नहीं हूं।

+0

क्या मैं वास्तव में ऐसी समस्या वाला अकेला व्यक्ति हूं? या शायद यह इतना आसान है कि मुझे कुछ याद आ रहा है – ByteFlinger

+0

नहीं, कुछ मिनट पहले मुझे एक ही प्रश्न का सामना करना पड़ा ..) मुझे आरईएसटी एपीआई के माध्यम से निर्माण की श्रृंखला को पुनः प्राप्त करने की आवश्यकता है। – Nakilon

+0

वैसे जेनकिंस स्पष्ट रूप से सही जानकारी पुनर्प्राप्त करने में सक्षम है क्योंकि जब मैं सुपर जॉब को उप-नौकरियों में से किसी एक पर तुरंत विफल होने के लिए कॉन्फ़िगर करता हूं, तो जेनकींस केवल उन लोगों को दिखाएगा जो सूची में भाग लेते हैं हालांकि एपीआई का उपयोग करके आप एक अंत प्राप्त करेंगे निर्माण करें जो उस विशिष्ट सुपर जॉब का निर्माण नहीं करता – ByteFlinger

उत्तर

2

मुझे एक ही समस्या है, और वर्तमान में समाधान जो मैं उप बिल्ड खोजने के लिए उपयोग करता हूं, प्रत्येक निर्माण के कंसोल लॉग को पार्स करके है। लॉग में ट्रिगर किए गए जॉब्स नाम होते हैं, और बिल्ड संख्याएं (समाप्त होने के बाद)।

import hudson.console.ConsoleNote; 
jenkins = Jenkins.getInstance() 
jobName = "root-job-name"  //just an example 
buildNumber = 123    //just an example 
job = jenkins.getItem(jobName) 
startBuild = job.getBuildByNumber(buildNumber) 

//scanning the tree using BFS 
list = [] 
visitedList = [] 
q = list as java.util.Queue 
q<<startBuild 
visitedList.add(startBuild) 
while (!q.empty){ 
    node = q.poll() 

    subjobs = getTriggeredBuildssByBuild(node) //see method bellow 
    subjobs.each{ subj -> 
     if (!(subj in visitedList)){ 
      visitedList.add(subj) 
      q<<subj 
     } 
    } 
} 

//printing results 
visitedList.each{ 
    println "Job name and build number: ${it}" 
} 


//parsing the log of the Run object to get sub builds triggered by it 
def getTriggeredBuildssByBuild(def run){ 
    list =[] 
    if (run != null && ((reader = run.getLogReader()) != null)) { 

     BufferedReader bufferedReader = new BufferedReader(reader); 

     for (String line = bufferedReader.readLine(); 
      line != null; 
      line = bufferedReader.readLine()) { 

      //strip off jenkins specific encoding 
      line = ConsoleNote.removeNotes(line); 
      matcher = line=~/Finished Build : #(\d+) of Job : (.*) with/ 
      if(matcher){ 
       foundJob = matcher[0][2] 
       foundBuildNum = Integer.parseInt(matcher[0][1]) 
       foundBuild=jenkins.getItem(foundJob).getBuildByNumber(foundBuildNum) 
       list.add(foundBuild) 
      } 
     } 
    } 
return list 
} 

कुछ नोट:

  1. आप यह देखना होगा कि regex मैं इस्तेमाल किया अपने सभी मामलों के लिए उपयुक्त है की आवश्यकता होगी, बेशक आप यह एक तरीका है कि कुछ अन्य की जांच करता है करने के लिए बदल सकते हैं रेगेक्स मैचों।
  2. यदि आप मल्टीजोब प्लगइन का उपयोग करते हैं, और आपकी सभी नौकरियां उस प्रकार से हैं, तो यह अधिक आसान है, क्योंकि मल्टीजोबबिल्ड के पास GetSubBuilds() है जो आपको वही देता है जो आप चाहते हैं।
  3. मैं अभी भी किसी दिए गए निर्माण द्वारा ट्रिगर किए गए उप-निर्माण को खोजने का एक बेहतर तरीका ढूंढ रहा हूं, खासकर यदि यह सभी राज्यों में निर्माण, समाप्त या अभी भी निर्माण कर सकता है।
+0

जारी करने के लिए धन्यवाद।मैं ईमानदारी से आशा करता हूं कि लॉग को पार्स करना इस जानकारी को पुनः प्राप्त करने का एकमात्र तरीका नहीं है। अगर ऐसा लगता है तो मुझे लगता है कि हमें जेनकींस के साथ एक एन्हांसमेंट टिकट लगाने की आवश्यकता हो सकती है क्योंकि इस तरह के एपीआई को – ByteFlinger

+0

गुम नहीं होना चाहिए। मुझे एक और विकल्प मिला है जिसे मैंने https://github.com/jenkinsci/downstream-buildview-plugin का उपयोग करने के लिए पाया है। यह प्लगइन DownstreamBuildViewRunListener का उपयोग कर प्रत्येक बिल्ड के लिए डाउनस्ट्रीमबिल्ड व्यूएक्शन जोड़ता है। फिर आप डाउनस्ट्रीमबिल्ड व्यूएक्शन प्राप्त करते हैं जिसमें विधियां हैं: सार्वजनिक int getDownstreamBuildNumber (स्ट्रिंग प्रोजेक्टनाम) और सार्वजनिक सूची <डाउनस्ट्रीमबिल्ड> getDownstreamBuildList()। –