Могут ли Hudson-рабы использовать плагины? - PullRequest
10 голосов
/ 14 февраля 2012

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

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

Вопросы:

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

1 Ответ

18 голосов
/ 14 февраля 2012

Во-первых, иди Дженкинс ! ;)

Во-вторых, вы правы & mdash; код выполняется на мастере. Это поведение по умолчанию для плагина Hudson / Jenkins.

Если вы хотите запустить код на удаленном узле, вам нужно получить ссылку на VirtualChannel этого узла, например через Launcher, который, вероятно, передается в основной метод вашего плагина.

Код для запуска на удаленном узле должен быть заключен в Callable & mdash; эта часть должна быть сериализуемой, так как Jenkins будет автоматически сериализовать ее, передать ее узлу через его канал, выполнить и вернуть результат.

Это также скрывает различие между хозяином и рабом & mdash; даже если сборка фактически выполняется на главном сервере, вызываемый код будет прозрачно выполняться на правильном компьютере.

Например:

@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 и ознакомьтесь с исходным кодом других плагинов Jenkins с аналогичными функциями.

Я бы порекомендовал заставить ваш плагин работать должным образом, а не использовать решение для общего доступа к сети ..:)

...