12

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

Один из вариантов может заключаться в том, чтобы запускать доступный со списком хостов, но я хотел бы видеть статус для каждого хоста отдельно и повторно запускать работу jenkins, если это необходимо.

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

+0

Не можете ли вы использовать [Матричный проект] (https://wiki.jenkins-ci.org/display/JENKINS/Building+a+matrix+project) с осью для IP-адресов? – vlp

+0

@vlp Возможно, да, но как запустить только 2 параллельно, а не все? – yvs

+0

Я никогда не использовал его, но [Throttle Concurrent Builds Plugin] (https://wiki.jenkins-ci.org/display/JENKINS/Throttle+Concurrent+Builds+Plugin) может работать. Он должен поддерживать дросселирование матричных сборок (упоминается в списке изменений). Удачи! – vlp

ответ

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 
} 
+0

не могли бы вы прояснить, пожалуйста, одно очко, AFA, я не уверен в отличном состоянии: должен ли он коллапс вместо сортировки? – yvs

+1

Нет, сортировка правильная. Он разделит список на под-списки заданного размера. Например. здесь, если у вас есть строка 'HOSTS =" foo bar baz qux "', после 'split()' у вас будет плоский список '[" foo "," bar "," baz "," qux "]' и после ' collate (2) 'у вас будет список списков' [["foo", "bar"], ["baz", "quz"]] '. – jil

2

Сочетание Matrix project и Throttle Concurrent Builds Plugin возможно.

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

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

Ниже приведен пример config.xml с простым пингом & ожидания шага сборки:

<?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> 

Успехов!

Смежные вопросы