У меня есть следующий конвейерный сценарий (своего рода псевдокод):
echo 'Testing scheduled to start at <some_predefined_time>'
node('master'){
parallel (
test:{
while(run){
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
if (now > some_predefined_time) {
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
if (!doneForCurrentCycle) {
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
dir ('some_dir'){ checkout //from integrity}
stash includes: '/some_dir/**/*', name: 'integrity_checkout'
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
step([$class: 'CopyArtifact',
filter: '**/*.zip',
fingerprintArtifacts: true,
flatten: true,
projectName: SUT_JOB_NAME,
selector: [$class: 'SpecificBuildSelector', buildNumber: SUT_BUILD_NUMBER], target: 'Build'])
stash includes: '/Build/**/*', name: 'build_files'
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
node('test_slave'){
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
unstash 'integrity_checkout'
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
unstash 'build_files'
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
bat ("calling_some_script")
archiveArtifacts
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
echo "Waiting for the next available time slot"
}
doneForCurrentCycle=true
/**********************************/
if (stop){
currentBuild.result = 'SUCCESS'
return
}
/**********************************/
}
}
if (now < some_predefined_time) doneForCurrentCycle=false
}
currentBuild.result = 'SUCCESS'
},stop:{
input message: 'Stop testing for build ' + build + '?', ok: 'Stop testing'
stop=true
},
failFast: true
)
}
Моя цель - иметь возможность запустить какой-либо сценарий на каком-либо подчиненном узле, но только в предварительно определенном временном окне.Для этого конвейерный скрипт должен оставаться в цикле.Ожидание не может произойти на подчиненном устройстве, поскольку оно будет занимать его без причины.Как только время настанет, он вызовет команду bat.
Но очень важно то, что сборку можно остановить с помощью ввода пользователя.Вот почему я использую параллель.
Теперь проблема.Дженкинс, который я использую, не может справиться с вложенными узлами.Как только выполнение достигнет подчиненного узла, я больше не смогу его останавливать.Похоже, не выбраться оттуда.Это не меняет область видимости обратно на мастера.Но даже в этом случае он не учитывает истинность «стопа».
Есть идеи, как я могу реализовать это по-другому?