2016-07-04 4 views
7

Мы рассматриваем возможность использования плагина Jenkins Pipeline для довольно сложного проекта, состоящего из нескольких поставок, которые необходимо собрать с использованием различных инструментов (на разных машинах) перед объединением. Тем не менее, кажется, достаточно легко сделать полную сборку с одним Jenkinsfile, и мне нравится автоматическое открытие ветвей git, которые поставляются с Pipeline.Запуск частей трубопровода в качестве отдельного задания

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

Для имитации этого, некоторые идеи пришли на ум:

  • Используйте различные Jenkinsfile с для поставок и load их в верхнем уровне Jenkinsfile; похоже, что задание Multibranch Pipeline не позволяет настроить Jenkinsfile для использования (https://issues.jenkins-ci.org/browse/JENKINS-35415), поэтому создание заданий для отдельных поставок по-прежнему остается открытым.
  • Предоставьте конфигурационный параметр для задания «верхнего уровня» и введите if s для всех поставок в Jenkinsfile, чтобы иметь возможность выбирать, что должно быть создано. Тем не менее, это будет смешивать разные типы сборки в одном конвейере и, по крайней мере, испортить оценку времени сборки.

Являются ли эти жизнеспособные варианты, или есть лучший?

+1

Этот вопрос очень похож на http://stackoverflow.com/questions/38129745/jenkins-build-pipeline-restart-at-stage, хотя этот вопрос касается перезапуска. Тем не менее, ответы на этот вопрос также касаются этого вопроса. – olenz

ответ

5

Что вы могли бы сделать, это написать скрипт, который имеет конвейерный имеет «если» -guards вокруг отдельных этапов, как это:

stage "s1" 
if (theStage in ["s1","all"]) { 
    sleep 2 
} 

stage "s2" 
if (theStage in ["s2", "all"]) { 
    sleep 2 
} 

stage "s3" 
if (theStage in ["s3", "all"]) { 
    sleep 2 
} 

Затем вы можете сделать «основную» работу, которая использует этот сценарий и запускает все этапы сразу, устанавливая параметр «TheStage» на «all». Эта работа будет собирать статистику, когда все этапы запускаются сразу и дают вам полезное время оценки.

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

Обратите внимание, что я поместил сцену в основной скрипт и поместил только условный код в условный, как предложил Мартин Ба. Это гарантирует, что визуализация работы является более надежным

+0

Это * * хорошая идея: [«Динамические этапы: в общем, если вы хотите визуализировать динамически изменяющиеся этапы, сделайте это условным, чтобы выполнить содержание сцены, а не условно, чтобы включить сцену»] (https: // wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin) –

+0

Хороший совет. Я добавлю это к моему ответу. – olenz

0

В качестве расширения предыдущего ответа, я хотел бы предложить что-то вроде этого:

def stageIf(String name, Closure body) { 
if (params.firstStage <= name && params.lastStage >= name) { 
    stage(name, body) 
} else { 
    stage(name) { 
     echo "Stage skipped: $name" 
    } 
} 
} 

node('linux') { 
properties([ 
     parameters([ 
       choiceParam(
         name: 'firstStage', 
         choices: '1.Build\n' + 
           '2.Docker\n' + 
           '3.Deploy', 
         description: 'First stage to start', 
         defaultValue: '1.Build', 
       ), 
       choiceParam(
         name: 'lastStage', 
         choices: '3.Deploy\n' + 
           '2.Docker\n' + 
           '1.Build', 
         description: 'Last stage to start', 
         defaultValue: '3.Deploy', 
       ), 
     ]) 
]) 

stageIf('1.Build') { 
    // ... 
} 
stageIf('3.Deploy') { 
    // ... 
} 
} 

не так совершенно, как я хочу, но по крайней мере, его рабочему.

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