Как избежать вложенных узлов в конвейере Jenkins - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть следующий конвейерный сценарий (своего рода псевдокод):

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.

Но очень важно то, что сборку можно остановить с помощью ввода пользователя.Вот почему я использую параллель.

Теперь проблема.Дженкинс, который я использую, не может справиться с вложенными узлами.Как только выполнение достигнет подчиненного узла, я больше не смогу его останавливать.Похоже, не выбраться оттуда.Это не меняет область видимости обратно на мастера.Но даже в этом случае он не учитывает истинность «стопа».

Есть идеи, как я могу реализовать это по-другому?

...