3

Простой случай, когда у вас есть только одно задание в зависимости от завершения набора других заданий, легко: либо используйте multijob, либо используйте плагин потока сборки с parallel { ... }. Случае я пытаюсь решить это более общий характер, например:Как я могу запустить работу Дженкинса после завершения набора других заданий?

JobA depends on JobX and JobZ 
JobB depends on JobY and JobZ 
SuperJob depends on JobA and JobB 

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

Похоже, что ни плагин сборки потока, ни плагин присоединения, ни плагин DSL работы не имеют хорошего механизма для этого. Я могу, конечно, просто начать все мои задания и попросить их опросить Дженкинса, но это было бы довольно уродливо.

Другим тупиком является «Триггер задания вверх». Я хочу инициировать определенную сборку задания, а не просто запуск работы над потоком.

обновление

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

left1 (1m) right1 (55m) 
    |   | 
left2 (50m) right2 (2m) 
    |____________| 
     | 
     zip 

С multijob плагин, вы получаете:

Phase 1: 
    left1, right1 // done in 55m 
Phase 2: 
    left2, right2 // done in 50m 
Phase 3: 
    zip // total time 105m 

Если бы я имел возможность вызвать следующую работу именно тогда, когда все предварительные условия выполняются, тогда общее время сборки составит всего 57 метров.

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

update 1 1/2 В комментариях ниже было предложено группировать левые задачи и правильные задачи в одну подзадачу. Да, это можно сделать в этом примере, но это очень сложно сделать в целом и автоматически. Например, предположим, что существует дополнительная зависимость: right2 зависит от left1. При заданном времени сборки оптимальное время сборки не должно меняться, так как left1 длится до начала right2, но без этих знаний вы не можете больше lump left1 и left2 в той же группе, не рискуя не иметь права1 доступный.

обновление 2

Похоже, что нет в готовом виде ответить здесь. Кажется, мне придется самому составить собственный скрипт системы. См. Мой собственный ответ на вопрос.

обновление 3

Мы закончили разветвление multijob плагин и писать новую логику внутри. Надеюсь, мы сможем опубликовать его как новый плагин после некоторой очистки ...

+1

Пожалуйста, укажите решение, если вы найдете один. –

+0

Filed https://issues.jenkins-ci.org/browse/JENKINS-30580, но я боюсь, что мне придется самостоятельно закодировать некоторые опросы ... Можно было бы, например, сразу запустить все задания и то им придется ждать. Возможно, для опроса можно использовать «Веселых исполнителей», а затем запустить их, как только опрос завершится, все предварительные условия выполнены. –

+0

https://gist.github.com/cg-soft/0ac60a9720662a417cfa - мое решение, см. Также ниже. –

ответ

0

Build other projects как Post Build Actions в конфигурации одного из ваших родительских заданий, которые будут запускать второе родительское задание при успешной сборке задания. Когда второе родительское задание также будет завершено, вызовите дочернее задание тем же методом.

+0

Извините, но нет :) Это потребует от меня линеаризации сборки. Мне нужен такой же параллелизм, как позволяет граф зависимости. У некоторых моих работ 50 родителей, я не буду выполнять 50 родителей один за другим. –

+0

В этом случае вам потребуется запрограммировать его индивидуально, так как в Jenkins нет такого плагина, который может решить вашу цель как таковую. –

+0

Итак, вы говорите, но, возможно, кто-то уже создал что-то для собственного использования и может захотеть расстаться с ним, или, может быть, есть неясная конструкция, о которой я не знаю. Это то, о чем я спрашиваю. Насколько я могу судить, похоже, мне нужно написать собственное решение для опроса, но я бы предпочел, чтобы избежать этого. –

0

Multijob plugin может использоваться для создания иерархии рабочих мест.

Сначала выберите проект Multijob в новом элементе, а затем в конфигурации вы можете добавить столько заданий, сколько захотите. Вы также должны указать фазу для каждого задания.

+0

Я уже упоминал об этом в тексте вопроса: в первом фазе вы строите все без каких-либо зависимостей. На втором этапе вы создаете все, что требуется только для фазы 1, в фазе 3 вы строите все, что требует только фазы 1 и 2 и т. Д. Я отредактирую вопрос, объясняющий, почему этот алгоритм «наихудший случай - это нормальный случай» и почему он недостаточен , –

3

Поскольку вы добавили тег Дженкинс-рабочий процесс, я думаю, что с помощью Jenkins Workflow Plugin нормально для вас, так что, возможно, это Workflow сценарий соответствует вашим потребностям:

node { 
    parallel left: { 
     build 'left1' 
     build 'left2' 
    }, right: { 
     build 'right1' 
     build 'right2' 
    }, 
    failFast: true 

    build 'zip' 
} 

Этот рабочий процесс будет вызывать zip как только как отделка параллельных ветвей.

+0

Я думаю, что вам нужно использовать задания left1/left2/right1/right2 во втором примере, так как в вашем решении вы дважды запускаете JobZ. Но это приводит к второй точке, а именно, что разбиение графика зависимости на непересекающиеся части не всегда возможно, как показано в первом примере. Расширение второго примера, предположим, что left2 зависит от права1 в дополнение к существующим зависимостям, также приведет к поражению любой попытки разбиения. –

+0

Тогда я думаю, что это еще проще, просто используйте параллель и создайте окончательную работу сразу после этого (см. Исходный скрипт, обновленный в моем ответе). – amuniz

+0

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

1

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

Этой сущность реализует свое решение, в то числе надлежащей обработки отмен работы: https://gist.github.com/cg-soft/0ac60a9720662a417cfa

+0

Я не очень доволен этим решением, так как у него есть свой набор проблем - в частности, о том, как отображать прогресс и как безопасно справляться с отменой, но я не вижу ничего лучшего, кроме, может быть, перехода на TeamCity :) –

+0

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

+0

Я собираюсь «ответить» на свой ответ. В крупном масштабе опубликованный скрипт вызовет крушение Дженкинса. Я не знаю, как отладить это. Казалось бы, мои вызовы создают много объектов, быстро вытесняя их из памяти. –