2012-02-14 3 views
8

У нас есть пользовательский плагин для Hudson, который загружает выходные данные сборки на удаленную машину. Мы только начали изучать использование slave-устройства Hudson для повышения пропускной способности сборки, но проекты, которые используют настраиваемый плагин, не могут развертываться с помощью FileNotFoundExceptions.Могут ли рабов Хадсона запускать плагины?

Из того, что мы видим, плагин запускается на ведущем устройстве, даже когда сборка выполняется на подчиненном устройстве. Файл, который не найден, существует на подчиненном устройстве, но не на главном.

Вопросы:

  1. Может быть плагины работают на рабов? Если да, то как? Есть ли способ идентифицировать плагин как «сериализуемый»? Если хадсонские рабы не могут запускать плагины, как происходит проверка SVN?
  2. Некоторые из разработчиков здесь считают, что решение этой проблемы состоит в том, чтобы сделать рабочее пространство мастера Hudson сетевым диском и позволить рабочему рабочему рабочему пространству - это такая же плохая идея, как мне кажется?

ответ

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