詹金斯管道中的不同工作目录



这是一个简单的 Jenkins 管道作业,它突出显示了shscript看到的不同工作目录。

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步骤使用工作区作为工作目录,而 groovyscript步骤使用 Jenkins 进程启动的目录。

:如何使我的 Jenkins 脚本化管道步骤(script(默认使用工作区作为工作目录?


我想在最清楚地意识到这一点之后是有道理的,groovy 是一个 java 的东西,我们从 java 启动 Jenkins war 文件,并且启动会强加一定的工作目录。我想知道这种 Jenkins 行为设计的起源。当我将一些sh命令移植到更实质性的时髦语法中时,一堆文件未找到错误让我有点不稳定,因为我想避免所有双重嵌套转义的疯狂,一个人可能会陷入 shell 中,尤其是当在路径中调用空格时,什么都没有。

您不得在 Jenkins 管道中使用execute()。使用管道DSL的步骤而不是任意的Groovy代码。

正如你所注意到的,这个这样的"本机"代码是在 Jenkins 主服务器上执行的,与当前作业没有任何关系。

不幸的是,这可能不是一个可能的操作。我必须重新设计脚本代码以显式使用workspace变量,而不是依赖于 Java 使用的当前工作目录。

更改 Java 中的当前工作目录?

最新更新