Дженкинс сложный сборочный процесс, это возможно?
Я хотел бы иметь поток сборки Дженкинса, который выглядит следующим образом.
- После запуска сборки все ведомые устройства выполняют одно и то же задание параллельно (задание настройки).
- Если какие-либо рабы терпят неудачу в этой работе, они не должны продолжать.
- Для всех рабов, которые пройдут эту работу, они должны получить работу из пула работ, которые необходимо выполнить. И как только раб завершает работу, он должен вернуться, чтобы завершить другую работу в пуле.
Я начал работать с Дженкинсом всего несколько недель назад, и теперь у меня все настроено так, как будто каждое задание выбирается подчиненным, которому нужно сначала запустить задание установки. Это действительно замедляет время сборки, потому что у меня около 30 заданий, а настройка занимает ~2 минуты.
Я использую Jenkins в качестве платформы для автоматического тестирования, и все задания в пуле заданий могут выполняться независимо друг от друга. У меня сейчас 5 рабов и ~30 рабочих мест.
2 ответа
Следующее должно сделать трюк:
def jobPool = new ArrayDeque()
jobPool.add({
echo "Doing stuff on ${env.NODE_NAME}"
});
jobPool.add({
echo "Doing other stuff on ${env.NODE_NAME}, a little slower"
sleep 4
});
jobPool.add({
echo "Doing more stuff on ${env.NODE_NAME}, even slower"
sleep 10
});
jobPool.add({
echo "Doing stuff quick on ${env.NODE_NAME}"
});
jobPool.add({
echo "Doing stuff quicker on ${env.NODE_NAME}"
});
def par = [:]
for (x in ["master", "urban"]) {
def nodeName = x; // needed due to variable scoping
par[nodeName] = {
node (nodeName) {
try {
echo "Doing setup on ${env.NODE_NAME}!"
// Do you're setup
echo "Done with setup"
} catch (Exception e) {
echo "Will not use this node as it failed setup!"
return;
}
while (true) {
// echo "${jobPool.size()}"
def subTask = jobPool.poll()
//echo "${jobPool.size()} ${subTask}"
if (subTask == null) {
break;
}
// Might wan't try catch around the next line if you wan't to continue if a job fails
subTask()
}
}
}
}
parallel par
if (!jobPool.isEmpty()) {
error "Not all tasks was done!"
}
Просто добавьте свои "задания из пула заданий" в jobPool
изменить и изменить часть установки.
Кажется, вы хотите отдельные этапы в одной и той же работе. Это значительно упрощается в конвейерах jenkins 2. Здесь есть несколько фотографий: https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin
[groovy] код в итоге выглядит так:
node {
stage 'Checkout'
svn 'https://svn.mycorp/trunk/'
stage 'Build'
sh 'make all'
stage 'Test'
sh 'make test'
}