79

我目前正在对 Jenkins Pipeline 插件(以前称为 Workflow 插件)进行一些评估。阅读文档后,我发现我目前无法使用以下方法检索工作区路径 env.WORKSPACE

以下变量当前在工作流脚本中不可用:

NODE_LABELS

工作空间

SCM 特定变量,例如 SVN_REVISION

还有其他方法可以获取当前工作区的绝对路径吗?我需要这个运行一些测试,然后得到一些参数(一些可执行文件的绝对路径)。我已经尝试new File("").absolutePath()在一个@NonCPS部分中使用,但看起来非 CPS 的东西总是在主服务器上执行。

有没有人知道如何在运行一些批处理脚本的情况下获取此路径,该脚本将路径存储到某个文件中,以后可以再次读取该文件?

4

4 回答 4

61

Pipeline Nodes and Processes Plugin(Pipeline 插件的一个组件,默认安装)的 2.5 版本以来,WORKSPACE环境变量再次可用。此版本于 2016 年 9 月 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"

}
于 2017-03-31T09:47:43.053 回答
58

注意:此解决方案仅在从属具有与主控相同的目录结构时才有效。pwd()由于JENKINS-33511 ,将返回主服务器上的工作区目录。

我曾经使用pwd()管道插件的功能来做到这一点。所以,如果你需要在 slave 上获得一个工作空间,你可以这样做:

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 
}
于 2016-04-29T11:31:11.813 回答
21

“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

希望有帮助!!

于 2018-09-19T21:00:09.603 回答
1

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

(在 Jenkins 2.222.3 上,构建管道插件 1.5.8,管道:节点和进程 2.35)

于 2020-06-05T13:50:09.950 回答