2016-06-07 3 views
1

У меня есть задание Jenkins для сценария отката db, который использует параметр выбора для каждой среды (с помощью NodeLabel Parameter Plugin).Jenkins - Остановить одновременную работу с тем же параметром

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

«Выполнение параллельных сборок при необходимости» включено.

E.g. Если работа выполняется для LIVE, разрешите кому-то снова запустить задание TEST (это работает). Однако, если LIVE уже запущен, и кто-то снова запускает работу для LIVE, а затем не запускается.

Этот плагин, по-моему, соответствует моим потребностям, но не показан в списке доступных плагинов в «Управление Дженкинсом».

https://wiki.jenkins-ci.org/display/JENKINS/Concurrent+Run+Blocker+Plugin

Есть ли другие способы обойти это?

ответ

1

Там это решение с существующими плагинами Дженкинс:

  • Создать Фристайл проект по имени, как Стартер для одновременного строит исключительно на узлах.
  • ☑ Эта сборка спараметрирован

    • Узел   [NodeLabel Parameter Plugin]
      • Имя: NODE
    • Выбор параметра
      • Имя: JOB
      • Выбор: ... the jobs' names you'd like to start with this ...
  • Строительные

 

#!/bin/bash +x -e 
# Bash 4 needed for associative arrays 

# From http://stackoverflow.com/questions/37678188/jenkins-stop-concurrent-job-with-same-parameter 

echo ' Build --> Conditional step (single) --> Execute Shell' 
echo " Checking whether job '$JOB' runs on node '$NODE'" 

echo ' Creating array' 
declare -A computers 

# ------------------------------------------------------------------------ 
# Declare your nodes and their executors here as mentioned, for instance, 
# in the API URI 'http://<jenkins>/computer/(master)/executors/0/api/xml': 
computers=(  #       ^^^^^^   ^
    [master]="0 1 2 3" 
    [slave]="0 1" 
) 
# Note: Executor indices DO NOT conform to the numbers in Jenkins' 
#  Build Executor Status UI. 
# ------------------------------------------------------------------------ 

echo " Checking executors of node '$NODE'" 
for computer in ${!computers[@]} ; do 
    for executorIdx in ${computers[$computer]} ; do 

    if [[ $computer == $NODE ]] ; then 

     if [[ "$computer" == "master" ]] ; then 
     node="(${computer})" 
     else 
     node=$computer 
     fi 
     url="${JENKINS_URL}/computer/${node}/executors/${executorIdx}/api/xml?tree=currentExecutable\[url\]" 
     echo " $url" 

     xml=$(curl -s $url) 
     #echo $computer, $executorIdx, $xml 

     if [[ "$xml" == *"/job/${JOB}"* ]] ; then 
     echo " Job '$JOB' is already building on '$computer' executor index '$executorIdx'" 
     echo ' Exiting with 1' 
     exit 1 
     fi 
    fi 
    done 
done 

echo ' Exiting with 0' 

 

  • Builder: Set the build result
    • Результат: Aborted

 

  • Условный шаг (один)
    • Run ?: Current build status
    • Builder: Trigger/call build on other projects
      • Сложение Триггеры:
        • Проекты построить: $JOB   [игнорировать сообщение об ошибке]
        • параметр Node Ярлык
          • Имя: NODE   [или как вы называете его в ходу работы (ы)]
          • Узел $NODE
+0

Благодарим вас за плагин условной сборки для моего внимания, это именно то, что мне нужно. – adjuzy

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