2012-02-14 53 views
8

我們有一個定製的Hudson插件,它可以將構建的輸出上傳到遠程機器上。我們剛開始考慮使用Hudson slave來提高構建的吞吐量,但使用定製插件的項目無法使用FileNotFoundExceptions進行部署。哈德遜奴隸可以運行插件嗎?

從我們可以看到的情況來看,即使構建發生在從屬設備上,插件也會在主設備上運行。未找到的文件確實存在於從屬設備上,但不存在於主設備上。

問題:

  1. 可以插件來的奴隸運行?如果是這樣,怎麼樣?有沒有一種方法可以將插件識別爲「可序列化」?如果Hudson奴隸無法運行插件,那麼SVN結帳如何發生?
  2. 這裏的一些開發人員認爲解決這個問題的方法是讓哈德遜主人的工作空間成爲網絡驅動器,讓奴隸使用同一個工作空間 - 這與我看來的想法一樣糟糕嗎?

回答

16

首先,go Jenkins! ;)

其次,你是正確的—該代碼正在主控上執行。這是Hudson/Jenkins插件的默認行爲。

當您想在遠程節點上運行代碼時,您需要獲得對該節點的引用,例如VirtualChannel,例如,通過Launcher這可能傳遞到您的插件的主要方法。

的代碼要被遠程節點應該以Callable —被封裝上運行,這是一個需要serialisable的一部分,如詹金斯將自動地連載它,經由它的信道把它傳遞給節點,執行它和返回結果。

即使構建實際在主服務器上運行,這也隱藏了主從服務器—之間的區別,「可調用」代碼將透明地在正確的機器上運行。

例如:

@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 2014-04-29 16:02:20