2015-08-06 14 views
7

में एकाधिक-एससीएम-प्लगइन का उपयोग करके एकाधिक रिपोज़ के लिए गिट कमेट्स नहीं मिल सकता है, इसलिए, मैंने एक जेनकींस जॉब कॉन्फ़िगर किया है जो 3 रिपोज़ से मास्टर शाखा की जांच करता है। अब मैं सभी तीन रिपो के लिए नवीनतम परिवर्तन प्राप्त करना चाहता हूं।जेनकिंस

वर्तमान में, GIT_COMMIT env चर केवल स्वीकृति में जोड़े गए अंतिम रेपो के लिए प्रतिबद्धता देता है, न कि उन सभी तीनों के लिए।

क्या पिछले तीन प्रतिबद्धताओं के लिए पिछली प्रतिबद्धता और वर्तमान गिट प्रतिबद्धता प्राप्त करने का कोई तरीका है?

उत्तर

2

मैं एक ही मुद्दे में भाग गया और इसे ठीक करने के लिए एकाधिक एस सी एम एस प्लगइन कांटा करने के लिए फैसला किया: https://github.com/JakeStoeffler/multiple-scms-plugin

आप चाहें, तो बस मेरी रेपो क्लोन और चलाने mvn HPI फ़ाइल (target/multiple-scms.hpi पर स्थित) का निर्माण करने के , जिसे आप मैन्युअल रूप से अपलोड कर सकते हैं और जेनकींस में इंस्टॉल कर सकते हैं। इसके बजाय यदि आप अपने आप को सुधार करने करना चाहते हैं, तो क्लोन the original repo सीधे, MultiSCM.java को खोलने, और निम्नलिखित की तरह कुछ के साथ buildEnvVars() विधि में कोड की जगह:

@Override 
public void buildEnvVars(AbstractBuild<?,?> build, Map<String, String> env) { 
    // Add each SCM's env vars, appending indices where needed to avoid collisions 
    for (int i = 0; i < scms.size(); i++) { 
     try { 
      EnvVars currScmVars = new EnvVars(); 
      scms.get(i).buildEnvVars(build, currScmVars); 
      for (Entry<String, String> entry : currScmVars.entrySet()) { 
       if (env.containsKey(entry.getKey())) { 
        // We have a collision; append the index of this SCM to the env var name 
        env.put(entry.getKey() + "_" + i, entry.getValue()); 
       } else { 
        // No collision; just put the var as usual 
        env.put(entry.getKey(), entry.getValue()); 
       } 
      } 
     } 
     catch(NullPointerException npe) {} 
    } 
} 

उम्मीद है कि टिप्पणियों सुंदर आत्म व्याख्यात्मक रहे हैं। असल में, मूल कोड में बग यह है कि जब आपके पास एक ही पर्यावरण चर नामों के साथ एकाधिक एससीएम होते हैं, तो वेरिएबल्स को ओवरराइट किया जाता है क्योंकि उन्हें फिर से चालू किया जा रहा है। हम इन ओवरराइट्स को रोकने और वैरिएबल नाम में एक इंडेक्स जोड़ने के बजाय इसके आसपास काम करते हैं।

इसका इस्तेमाल करने का एक उदाहरण है: यदि हमारी परियोजना 3 Git एस सी एम एस के लिए कॉन्फ़िगर है, अब हम व्यक्तिगत रूप से env का उपयोग करके प्रत्येक Git रेपो के नवीनतम प्रतिबद्ध हैश का उपयोग कर सकते वार्स GIT_COMMIT, GIT_COMMIT_1, और GIT_COMMIT_2। संलग्न इंडेक्स जेनकींस में प्रोजेक्ट कॉन्फ़िगरेशन में एससीएम के आदेश से मेल खाते हैं।

जाहिर है यह एक त्वरित और गंदे समाधान है, लेकिन यह मेरे लिए आवश्यक काम करने के लिए काम करता है। अपनी जरूरतों को पूरा करने के लिए इसे अनुकूलित करने के लिए स्वतंत्र महसूस करें।

+0

धन्यवाद मैं एक नज़र डालेगा। – Jason

+0

इसे जेनकिन्स अपस्ट्रीम के लिए पुल अनुरोध क्यों नहीं किया गया है? – Will

+0

@Will इसे विलय कर दिया गया है - देखें [पीआर] (https://github.com/jenkinsci/multiple-scms-plugin/pull/12)। –