这是一个简单的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
我很好奇它们会是不同的工作目录,shell命令sh
步骤使用工作区作为工作目录,而groovy script
步骤使用Jenkins进程启动的目录。 / p>
问题:默认情况下,如何使Jenkins脚本化管道步骤(script
)使用工作区作为工作目录?
我想在最清楚地意识到这一点之后,它是有道理的,groovy是Java的东西,我们从Java启动了Jenkins war文件,并且启动强加了某个工作目录。我想知道詹金斯行为的这种设计的起源。当我将一些sh
命令移植到更实质性的Groovy语法中时,我因一堆文件未找到的错误而变得有点不知所措,因为我想避免所有双重嵌套转义疯狂的行为,因为它们可能会落入外壳,尤其是在路径中调用空格之类的东西时。
答案 0 :(得分:1)
您不得在Jenkins管道中使用execute()
。使用pipeline DSL's steps而不是任意的Groovy代码。
您已经注意到,这种“本机”代码是在Jenkins主服务器上执行的,与当前作业没有任何关系。
答案 1 :(得分:0)
很遗憾,这可能无法执行。我将不得不重新设计脚本代码以显式使用workspace
变量,而不是依赖Java使用的当前工作目录。