我有以下管道脚本(某种伪代码):
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命令。
但是非常重要的是,必须能够通过用户输入停止构建。这就是我使用并行的原因。
现在是问题所在。我使用的Jenkins无法应付嵌套节点。一旦执行到达从属节点,我将无法再停止它。它似乎并没有摆脱困境。它不会将范围更改回主范围。但是,即使这样,它也将忽略“停止”的成立。
任何想法我该如何以不同的方式实现?