2012-05-01 2 views
12

Мы переходим с CruiseControl.NET в Jenkins, чтобы быть в синхронизации с партнером, поэтому у нас нет двух разных сценариев CI. Мы пытаемся настроить Jenkins на то, чтобы сделать что-то похожее на то, что мы делали CruiseControl, на котором централизованный сервер вызывал проекты (задания в jenkins) на удаленных машинах сборки.Может ли мастер-дженкинс выполнять задания на удаленных дженкинсах?

У нас есть несколько машин для сборки, связанных с одним проектом, поэтому, когда мы строим проект с централизованного CI-сервера, он будет ссылаться на проекты на удаленных серверах CI. Удаленные серверы CI вытащили версию из централизованного проекта CI-сервера.

В управлении CruiseCruise мы настраиваем проект, который будет делать forceBuild на удаленных проектах. Проекты на машинах сборки использовали remoteProjectLabeller для получения номера версии, чтобы они всегда находились в синхронизации.

Чтобы получить номер мастер сборки:

<labeller type="remoteProjectLabeller"> 
    <project>MainProject</project> 
    <serverUri>tcp://central-server:21234/CruiseManager.rem</serverUri> 
</labeller> 

Для вызова удаленных проектов:

<forcebuild> 
    <project>RemoteBuildMachineA</project> 
    <serverUri>tcp://remote-server:21234/CruiseManager.rem</serverUri> 
    <integrationStatus>Success</integrationStatus> 
</forcebuild> 

До сих пор в Дженкинс я установки дополнительного сервера в качестве ведомого устройства с помощью Java Web Start но я не знаю, как бы я хотел, чтобы мастер-дженкинс вызывал настройку проектов на рабов.

Могу ли я настроить Jenkins для вызова проектов (работ) на подчиненных?

Могу ли я заставить ведомые вывести номер версии у мастера?

EDIT -

Позвольте мне добавить еще некоторую информацию.

  • Ведущие и ведомые устройства для удаленной сборки работают под управлением Windows.
  • У нас был центральный мастер CruiseControl, который запускал удаленные проекты одновременно, поэтому они работали одновременно и хотели бы иметь одно и то же с дженкинсами, если это возможно.

ответ

9

У Дженкинса есть концепция build agents, которая, возможно, лучше подходит для вашего сценария - есть мастер, который запускает сборку и ведомые, которые ее выполняют. Затем сборку можно ограничить только некоторыми категориями подчиненных (например, если это зависит от конкретного программного обеспечения, не присутствующего на всех агентах). Все данные управляются централизованно мастером, и я считаю, что вы пытаетесь достичь.

+0

+1 yep Я думал о конфигурации в стиле круиз-контроля. Благодарю. –

5

В Jenkins невозможно вызвать сборку на подчиненном устройстве, то есть там, где запуск сборки не контролируется тем, кто ее запускает. Он контролируется настройками самой работы. Каждое задание имеет параметр «Ограничить, где это задание может работать».

В вашем случае у вас, вероятно, будет два задания: A и B. A будет ограничено для запуска на «master», а B будет настроен на запуск на «slavename». Тогда все, что осталось сделать, это для A, чтобы вызвать B.

Но у вас были дополнительные ограничения: вы хотите, чтобы A и B проверяли ту же версию из контроля версий, и вы хотите, чтобы A и B выполнялись параллельно. Есть много способов сделать это, но проще всего определить задание с несколькими конфигурациями.

Невозможно превратить существующую работу в свободном стиле в задание с несколькими конфигурациями, поэтому вам нужно будет сделать новое задание.

  • Выберите Новое задание
  • Выберите Построить новый проект мульти-конфигурации. Добавьте имя.
  • В разделе «Матрица конфигурации» откройте «Добавить ось».
  • Выберите Рабы
  • Проверка хозяина и раба
  • Добавить информацию SCM и строить шаг (ы)

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

+2

* В Jenkins невозможно запустить сборку на подчиненном устройстве, то есть там, где запуск сборки не контролируется тем, кто его запускает * - это не на 100% правильно. Вы можете указать метку узла как параметр с помощью [Node Label Parameter plugin] (https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin), а затем использовать значение этого параметра в * Ограничить, где эта работа может работать * поле. –

+0

Я настраиваю тестовую среду с тремя виртуальными машинами, a, b и c. A - мастер, b и c - подчиненные. Я создал задание с несколькими конфигурациями, и в рамках матрицы конфигурации я выбираю только узел b, потому что я только хочу, чтобы он выполнялся на этой виртуальной машине. Однако, когда я запускаю сборку, она запускает ее от мастера. Почему это? Я ожидаю, что он запустит его на выбранном мной узле. –

+0

@ ЭндиАризмунди, ты уверен? Перейдите к заданию, выберите последнюю сборку. Он покажет маленькие шары, соответствующие вашим дочерним строкам (возможно, только один, если у вас есть только одна дочерняя сборка, тогда он будет говорить «по умолчанию» рядом с ним). Шары будут синими, красными или серыми - в зависимости от состояния. Нажмите на один из неседых шаров. Это статус вашего ребенка. Предполагается, что ребенок будет работать на подчиненном 'b'. С другой стороны, работа на высшем уровне может выполняться где угодно (если не привязана к узлу с матрицей Tig Parent plgin). –

0

С/jenkins/computer url вы можете добавлять, удалять и переконфигурировать «узлы», которые являются локальными или удаленными «агентами сборки».

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

+0

Прошу прощения, но похоже, что вы не говорите здесь ничего нового из того, что уже было представлено в предыдущих ответах. –

0

Я думал о Дженкинсе слишком сильно, как CruiseControl, где задание задано на удаленной машине. Таким образом, в Jenkins удаленные проекты определяются на ведущем и делегируются удаленной машине через агента.

Я использовал агент Java Web Start, установленный как служба Windows на удаленных компьютерах. Чтобы определенные задания выполнялись на определенных удаленных машинах, я определял каждый удаленный узел с уникальной меткой в ​​своей подчиненной конфигурации. Чтобы связать определенные задания с конкретными ведомыми, я использовал метку подчиненного устройства в каждой конфигурации задания («Ограничить, где этот проект может быть запущен»).

Чтобы запустить задания с одним основным заданием, я создал бесплатное задание стиля, которое настроено только на «Построение других проектов», и предоставило список или названия проектов, разделенных запятыми. Это задание параллельно создает параллельные задания.

Я по-прежнему ищу способ отправить номер главной сборки в нисходящие задания, чтобы они всегда синхронизировались. (Это используется для версий DLL и т. Д.)