Задача Jenkins для удаленных хостов

В сценарии развертывания мне нужно создать и запустить задачу jenkins для списка хостов, т.е. создать что-то вроде параметризованной задачи (где ip-адрес является параметром) или задачу на Multijob Plugin с осью HOST, но запускается только двумя параллельно на нескольких хостах.

Одним из вариантов может быть запуск ansible со списком хостов, но я хотел бы видеть статус для каждого хоста отдельно и при необходимости перезапускать задание jenkins.
< br /> Основной вариант - использовать плагин Job DSL или Pipeline Plugin, но здесь мне нужна помощь, чтобы понять, какие классы / методы кода dsl groovy следует использовать для этого.
Кто-нибудь может с этим помочь?


person yvs    schedule 23.09.2016    source источник
comment
Разве вы не можете использовать проект Matrix с помощью ось для IP-адресов?   -  person vlp    schedule 09.10.2016
comment
@vlp Может быть, но как запустить только 2 параллельно вместо всех?   -  person yvs    schedule 11.10.2016
comment
Я никогда его не использовал, но Throttle Concurrent Builds Plugin может сработать. Он должен поддерживать сборки матриц дросселирования (это упоминается в журнале изменений). Удачи!   -  person vlp    schedule 11.10.2016


Ответы (2)


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

def hosts_pairs = HOSTS.split().collate(2)

for (pair in host_pairs) {
  def branches = [:]
  for (h in pair) {
    def host = h  // fresh variable per iteration; it will be mutated
    branches[host] = {
      stage(host) {
        node(host) {
          // do the actual job here, e.g. 
          // execute a shell script
          sh "echo hello world"
        }
      }
    }
  }
  parallel branches
}  
person jil    schedule 08.10.2016
comment
не могли бы вы прояснить, пожалуйста, один момент, AFA, я не владею Groovy свободно: должен ли он быть свернутым, а не сопоставленным? - person yvs; 11.10.2016
comment
Нет, подборка правильная. Он разделит список на подсписки заданного размера. Например. здесь, если у вас есть строка HOSTS="foo bar baz qux", после split() у вас будет плоский список ["foo", "bar", "baz", "qux"], а после collate(2) у вас будет список списков [["foo", "bar"], ["baz", "quz"]]. - person jil; 11.10.2016

Комбинация проекта матрицы и Возможен плагин Throttle Concurrent Builds.

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

Значения оси доступны во время каждой дочерней сборки в соответствующей переменной среды (например, targetHost).

Ниже приведен пример config.xml с простым этапом сборки ping & wait:

<?xml version='1.0' encoding='UTF-8'?>
<matrix-project plugin="[email protected]">
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties>
    <hudson.plugins.throttleconcurrents.ThrottleJobProperty plugin="[email protected]">
      <maxConcurrentPerNode>2</maxConcurrentPerNode>
      <maxConcurrentTotal>2</maxConcurrentTotal>
      <categories class="java.util.concurrent.CopyOnWriteArrayList"/>
      <throttleEnabled>true</throttleEnabled>
      <throttleOption>project</throttleOption>
      <limitOneJobWithMatchingParams>false</limitOneJobWithMatchingParams>
      <matrixOptions>
        <throttleMatrixBuilds>true</throttleMatrixBuilds>
        <throttleMatrixConfigurations>true</throttleMatrixConfigurations>
      </matrixOptions>
      <paramsToUseForLimit></paramsToUseForLimit>
    </hudson.plugins.throttleconcurrents.ThrottleJobProperty>
  </properties>
  <scm class="hudson.scm.NullSCM"/>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers/>
  <concurrentBuild>true</concurrentBuild>
  <axes>
    <hudson.matrix.TextAxis>
      <name>targetHost</name>
      <values>
        <string>127.0.0.1</string>
        <string>127.0.0.2</string>
        <string>127.0.0.3</string>
        <string>127.0.0.4</string>
        <string>127.0.0.5</string>
      </values>
    </hudson.matrix.TextAxis>
  </axes>
  <builders>
    <hudson.tasks.Shell>
      <command>sleep 7
ping -c 7 $targetHost
sleep 7</command>
    </hudson.tasks.Shell>
  </builders>
  <publishers/>
  <buildWrappers/>
  <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl">
    <runSequentially>false</runSequentially>
  </executionStrategy>
</matrix-project>

Удачи!

person vlp    schedule 11.10.2016