Как выполнить часть этапа конвейера Дженкинса вне контейнера Докера?

#docker #jenkins #dockerfile #jenkins-pipeline #jenkins-groovy

Вопрос:

У нас есть контейнерный конвейер Дженкинса, и для одного из этапов, какой-то части этапа, мы хотим, чтобы он выполнялся в контейнере, а некоторые-в мастере Дженкинса(в нашем случае это Windows). —

 pipeline {
    agent {
        docker {
            label "<node-name>"
            image "<docker-image-path>"
        }
    }
    stages {
        stage('Testing') {
            steps {
                script {
                    //This below part will be executed on container
                    println "This below part will be executed on container"
                    sh '''pwd
                        hostname -i     
                    '''

                    // Now want to execute below code on master which is Windows
                    println "Now want to execute below code on master which is Windows"
                    node('master') {
                        bat 'dir'
                    }
                }
            }
        }
    }
}
 

Часть, которая должна быть выполнена в контейнере, успешно выполнена, но код для выполнения в Windows Jenkins master завершается ошибкой с —

 Cannot run program "docker" (in directory "C:JenkinsworkspaceTestDocker"): CreateProcess error=2, The system cannot find the file specified
 

Редактировать

И когда я установил докер на машину с Windows, вышеприведенная ошибка не выбрасывается, а застревает там навсегда.

Не могли бы вы, пожалуйста, помочь мне, как я могу выполнить код на узле или контейнере по требованию?

Комментарии:

1. Ваш агент верхнего уровня определен как docker. Это намеренно? При использовании нескольких агентов AFAIK вам необходимо определить агент верхнего уровня как «нет», иначе Дженкинс все равно попытается использовать агент docker в Windows master. Существует множество возможностей. Чистым решением было бы создать этапы для каждого соответствующего агента, например «Тест в докере», «Тест в Windows» и определить агента на уровне этапа.

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

3. Я понимаю. Однако, похоже, переопределение узла работает неправильно. Обычно вы заключаете выполнение внутри узла («цель»), а не внутри блока «сценарий». stage("Testing") { node('linux') { sh "make" } node('windows') { bat "dir" } }