Вот простая конвейерная работа Jenkins, которая выделяет различные рабочие каталоги, видимые sh
против script
.
pipeline {
agent any
stages {
stage('Stage1') {
steps {
sh """
pwd
"""
script {
echo "cwd--pwd: "+ "pwd".execute().text
}
}
}
}
}
Вот как был запущен экземпляр Jenkins
/Users/MyJenkinsUser/dirJenkinsLaunched$ java -jar /Applications/Jenkins/jenkins.war --httpPort=8080
Вот вывод на консоль задания ...
Started by user MyJenkinsUser
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /Users/MyJenkinsUser/.jenkins/jobs/TestPipeline/workspace
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Stage1)
[Pipeline] sh
[workspace] Running shell script
+ pwd
/Users/MyJenkinsUser/.jenkins/jobs/TestPipeline/workspace
[Pipeline] script
[Pipeline] {
[Pipeline] echo
cwd--pwd: /Users/MyJenkinsUser/dirJenkinsLaunched
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Мне любопытно, что это будут разные рабочие каталоги, команда оболочки sh
step использует рабочее пространство в качестве рабочего каталога, а groovy script
step использует каталог, в котором запущен процесс Jenkins.
Вопрос : как сделать так, чтобы мои шаги сценария конвейера Jenkins (script
) по умолчанию использовали рабочее пространство в качестве рабочего каталога?
Полагаю, что после того, как это станет ясно, имеет смысл, что groovy - это java, и мы запускаем файл войны Дженкинса из java, и этот запуск накладывает определенный рабочий каталог.Интересно происхождение этого дизайна для поведения Дженкинса.Это сделало меня немного странным с кучей ошибок, связанных с отсутствием файлов, так как я портировал некоторые команды sh
в более содержательный синтаксис groovy, потому что я хотел избежать всего сумасшествия двойного вложения, в которое можно попасть в оболочку, особеннокогда пробелы вызываются в путях, а что нет.