在Jenkins Pipeline插件中获取工作区目录的绝对路径

95

我目前正在评估Jenkins Pipeline插件(以前称为工作流插件)。

阅读文档后,我发现当前无法使用env.WORKSPACE获取工作区路径:

当前无法在工作流脚本中使用以下变量:

NODE_LABELS

WORKSPACE

SCM特定的变量,例如SVN_REVISION。

是否有其他方法可以获取当前工作区的绝对路径? 我需要运行一些测试,这些测试又会得到某些参数(指向某个可执行文件的绝对路径)。

我已经尝试在@NonCPS部分内使用new File("") .absolutePath(),但看起来非CPS部分总是在主服务器上执行。

是否有人知道如何获取此路径而不运行将路径存储到某个文件中,然后再读取该文件的批处理脚本?

4个回答

79

自从Pipeline Nodes and Processes Plugin(Pipeline插件的一个组件,默认安装)的版本2.5以后,WORKSPACE环境变量再次可用。该版本于2016-09-23发布,因此应该在所有最新的Jenkins实例上都可用。

示例

node('label'){
    // now you are on slave labeled with 'label'
    def workspace = WORKSPACE
    // ${workspace} will now contain an absolute path to job workspace on slave

    workspace = env.WORKSPACE
    // ${workspace} will still contain an absolute path to job workspace on slave

    // When using a GString at least later Jenkins versions could only handle the env.WORKSPACE variant:
    echo "Current workspace is ${env.WORKSPACE}"

    // the current Jenkins instances will support the short syntax, too:
    echo "Current workspace is $WORKSPACE"

}

对于那些在工作中使用bat并需要访问Workspace的人,有一个小提示:这是行不通的。正如在此提到的那样,$WORKSPACE https://issues.jenkins-ci.org/browse/JENKINS-33511 只适用于PowerShell。参考答案 - https://dev59.com/lloU5IYBdhLWcg3wFEA6#57089239 - Ismail
1
请查看我的答案,了解如何在Jenkins 2.222.3、Build Pipeline插件1.5.8、Pipeline: Nodes and Processes 2.35中将WORKSPACE作为管道本身的属性访问:(https://dev59.com/qFoU5IYBdhLWcg3w7aGP#62216903) - Tom Fink

61

注意: 仅当从属节点与主节点有相同的目录结构时,此解决方案才有效。由于JENKINS-33511的原因,pwd()将返回主节点上的工作区目录。

我曾经使用管道插件的pwd()功能来完成它。因此,如果您需要在从属节点上获取工作区,可以像这样操作:

node('label'){
    //now you are on slave labeled with 'label'
    def workspace = pwd()
    //${workspace} will now contain an absolute path to job workspace on slave 
}

3
该死,我可能需要一副眼镜。完全没注意到有 pwd() 这个函数可用。这正是我正在寻找的。谢谢! - Joerg S
然而,根据在this ticket中的讨论,pwd()将返回主节点的工作目录,而不是您所在的节点。 - Daniel C. Sobral
2
我刚刚证实的一个事实是,pwd()在从属节点上不起作用,除非它们恰好具有与主节点相同的目录结构。 - Daniel C. Sobral
1
似乎链接的Jenkins工单已经解决了? - giorgiosironi

22

“WORKSPACE”环境变量适用于最新版本的Jenkins Pipeline。你可以在你的Jenkins文件中使用这个变量: "${env.WORKSPACE}"

以下是样例用法:

def files = findFiles glob: '**/reports/*.json'
for (def i=0; i<files.length; i++) {
jsonFilePath = "${files[i].path}"       
jsonPath = "${env.WORKSPACE}" + "/" + jsonFilePath
echo jsonPath

希望这能有所帮助!!


1
请注意,被接受的答案也提到了WORKSPACE变量现在可用:https://dev59.com/qFoU5IYBdhLWcg3w7aGP#43137597 - Joerg S
2
我查看了那个答案,但它没有代码示例。因此,在实施之前,我仍然需要进行一些研究。我不介意被点踩,但我希望我的答案可以通过复制语法立即帮助某人。 - anuj0901
3
我同意,带有代码示例的答案应该成为被采纳的答案,而不是仅有文本的答案。感谢您提供额外的内容。 - Miguel Mesquita Alfaiate

1

对我来说,WORKSPACE 是管道本身的有效属性。因此,当我将 this 作为参数 context 从管道脚本本身传递给 Groovy 方法时,我能够使用 "... ${context.WORKSPACE} ..." 访问正确的值。

(在 Jenkins 2.222.3、Build Pipeline Plugin 1.5.8、Pipeline: Nodes and Processes 2.35 上)


1
谢谢你的留言。您认为优先考虑context.WORKSPACEenv.WORKSPACE更有益吗?关于“context”对象是否有相关文档可供参考? - Joerg S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接