#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" } }