jenkins管道中的不同工作目录

时间:2018-09-21 21:33:52

标签: jenkins jenkins-pipeline

这是一个简单的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步骤使用工作区作为工作目录,而groovy script步骤使用Jenkins进程启动的目录。 / p>

问题:默认情况下,如何使Jenkins脚本化管道步骤(script)使用工作区作为工作目录?


我想在最清楚地意识到这一点之后,它是有道理的,groovy是Java的东西,我们从Java启动了Jenkins war文件,并且启动强加了某个工作目录。我想知道詹金斯行为的这种设计的起源。当我将一些sh命令移植到更实质性的Groovy语法中时,我因一堆文件未找到的错误而变得有点不知所措,因为我想避免所有双重嵌套转义疯狂的行为,因为它们可能会落入外壳,尤其是在路径中调用空格之类的东西时。

2 个答案:

答案 0 :(得分:1)

您不得在Jenkins管道中使用execute()。使用pipeline DSL's steps而不是任意的Groovy代码。

您已经注意到,这种“本机”代码是在Jenkins主服务器上执行的,与当前作业没有任何关系。

答案 1 :(得分:0)

很遗憾,这可能无法执行。我将不得不重新设计脚本代码以显式使用workspace变量,而不是依赖Java使用的当前工作目录。

Changing the current working directory in Java?