Jenkins多分支管道工作区位置:shell与Groovy

时间:2017-10-16 04:02:42

标签: jenkins jenkins-pipeline

摘要:使用并行构建时,与shell相比,Groovy中的工作区路径不同。如何从DSL或Groovy获取实际工作空间?

详细信息:

我们的工作区是通过ws( '/path/to/workspace' )定义的。

我尝试使用相对路径(仅package.json)在当前目录(通常是工作空间根目录)中打开该文件。当作为shell运行时,sh 'jq -r ".version" package.json'它工作正常,我可以毫无问题地阅读package.json

然而使用Groovy:

def version = new groovy.json.JsonSlurper().parseText( new File( "package.json" ).text )[ 'version' ]

注意new File( "package.json" )然后它失败,声称$WORKSPACE/package.json不存在。尽管我们使用ws设置上面的工作区,但我发现它最终会像 / path / to / workspace / my_job-SOMERANDOMCHARS ... 那样不是{{1}中指定的目录}。

据我所知,在并行工作负载中,我们需要使工作区独一无二,因此这不是意料之外的。但是我应该如何从Groovy确定工作区?或者期望总是突破到实际在节点上运行的shell?

更新:更多背景

有关如何使用此信息的更多信息。我们的Groovy(非声明性)管道在这些方面做了一些事情:

ws

2 个答案:

答案 0 :(得分:0)

我假设你如何使用ws()。如果没有看到您的实际代码,您的描述就意味着您正在执行以下操作:

ws(/new/path/to/workspace) {
    sh "cat package.json"
}

def version = new groovy.json.JsonSlurper().parseText( new File( "package.json" ).text )[ 'version' ]

如果您正在执行此操作,则工作区将不再适用于ws {}块之外。

在运行ws()之前,您显示的路径(/ path / to / workspace / my_job-SOMERANDOMCHARS)似乎是原始工作空间路径。或者它可能是您的管道文件正在检出的位置。如果没有看到您的代码,很难猜测您尝试放置工作区文件的位置。

无论哪种方式,如果使用WORKSPACE变量,都可以获得当前工作空间。运行以下管道代码并检查输出。这应该解释这一切是如何运作的。

pipeline {
    agent any

    stages {
        stage('first'){
            steps {
                ws('/tmp/foobar') {
                    sh "pwd"
                    sh 'echo New Workspace - ${WORKSPACE}' //environment variable
                    echo 'New Workspace' + WORKSPACE //groovy variable
                }
                sh "pwd"
                sh "echo Original Workspace - ${WORKSPACE}"  //interpolated groovy variable
                echo "Original Workspace - ${WORKSPACE}"       //interpolated groovy variable
            }
        }
    }

}

编辑:我将您的示例修改为我的计算机上的运行示例以尝试重现,但它运行正常。这会在你的詹金斯上运行吗?

stage('tests') {
  parallel(
    'Unit Tests': {
       node('Linux') {
         ws('/tmp/foobar') {
           def file1 = new File("${env.WORKSPACE}/package.json")
           println 'File1 is: ' + file1
           echo "${env.WORKSPACE}"
           sh 'echo $WORKSPACE/package.json'
         }
       }
    },
    'E2E Tests': {
       node('Linux') {
         ws('/tmp/baz') {
           def file2 = new File("${env.WORKSPACE}/package.json")
           println 'File2 is: ' + file2
           echo "${env.WORKSPACE}"
           sh 'echo $WORKSPACE/package.json'
         }
       }
    }
  )
}

也许问题不是您认为的问题,或者Jenkins版本或您正在使用的插件中存在错误。如果文件句柄的println显示正确的路径,那么其他可能是问题。

答案 1 :(得分:0)

访问相对于工作区的文件的最佳方法是使用readFile,或者更简单地使用readJSON。这对我有用,我不必关心工作区的实际绝对路径。

还有其他readXXXX方法,如readYAML,readManifest,readMavenPom等。有关完整列表和示例,请参阅Pipeline Utility Steps文档。