如何避免Jenkins管道上的嵌套节点

时间:2019-02-21 14:26:48

标签: jenkins groovy pipeline

我有以下管道脚本(某种伪代码):

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无法应付嵌套节点。一旦执行到达从属节点,我将无法再停止它。它似乎并没有摆脱困境。它不会将范围更改回主范围。但是,即使这样,它也将忽略“停止”的成立。

任何想法我该如何以不同的方式实现?

0 个答案:

没有答案