摘要:使用并行构建时,与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
答案 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文档。