2012-02-14 15 views
8

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

हम जो देख सकते हैं उससे, प्लग पर दास पर होने पर भी प्लगइन मास्टर पर चल रहा है। जो फ़ाइल नहीं मिल रही है वह दास पर मौजूद है लेकिन मास्टर पर नहीं है।

सवाल:

  1. प्लगइन्स दास पर चलाया जा सकता है? यदि हां, तो कैसे? प्लगइन को 'serializable' के रूप में पहचानने का कोई तरीका है? यदि हडसन दास प्लगइन्स नहीं चला सकते हैं, तो एसवीएन चेकआउट कैसे होता है?
  2. यहां कुछ डेवलपर्स सोचते हैं कि इस समस्या का समाधान हडसन मास्टर के कार्यक्षेत्र को नेटवर्क ड्राइव बनाना है और दास को उसी कार्यक्षेत्र का उपयोग करने देना है - क्या यह मुझे ऐसा लगता है कि यह एक बुरा विचार है?

उत्तर

16

सबसे पहले, go Jenkins! ;)

दूसरा, आप सही हैं — कोड मास्टर पर निष्पादित किया जा रहा है। यह एक हडसन/जेनकींस प्लगइन का डिफ़ॉल्ट व्यवहार है।

जब आप रिमोट नोड पर कोड चलाने के लिए चाहते हैं, तो आपको उस नोड के VirtualChannel का संदर्भ प्राप्त करने की आवश्यकता है, उदा। Launcher के माध्यम से शायद यह आपके प्लगइन की मुख्य विधि में पारित हो गया है।

कोड दूरस्थ नोड एक Callable — में समाहित किया जाना चाहिए पर चलने के लिए इस बात यह है कि serialisable होने की जरूरत है है, जेनकींस स्वतः यह serialise के रूप में, अपने चैनल के माध्यम से नोड के लिए इसे पारित, यह और बदले निष्पादित परिणाम।

यह मास्टर और गुलाम — के बीच भेद को भी छुपाता है भले ही निर्माण वास्तव में मास्टर पर चल रहा हो, "कॉल करने योग्य" कोड पारदर्शी रूप से सही मशीन पर चलाएगा।

उदाहरण के लिए:

@Override 
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, 
         BuildListener listener) { 
    // This method is being run on the master... 

    // Define what should be run on the slave for this build 
    Callable<String, IOException> task = new Callable<String, IOException>() { 
     public String call() throws IOException { 
      // This code will run on the build slave 
      return InetAddress.getLocalHost().getHostName(); 
     } 
    }; 

    // Get a "channel" to the build machine and run the task there 
    String hostname = launcher.getChannel().call(task); 

    // Much success... 
} 

भी FileCallable देखें, और इसी तरह की सुविधा के साथ other Jenkins plugins के स्रोत कोड की जाँच करें।

मैं अपने प्लगइन काम करने को ठीक से करने के बजाय साझा नेटवर्क समाधान का उपयोग कर की सिफारिश करेंगे .. :)

+0

के लिए +1 "स्वतः" – Cole9350

संबंधित मुद्दे