从 Jenkinsfile 中的 Groovy 代码创建文件

问题描述 投票:0回答:1

我正在尝试从 Jenkinsfile 调用的 groovy 代码创建一个 json 文件。 groovy 代码似乎可以工作(即在代码的末尾,我列出了目录中的文件,并且我看到该文件列在那里),但是当我尝试从 shell 或 python 的后续阶段访问该文件时,文件不存在。

stage {
    steps {
        script {
            if (foo.bar()) {
                echo "set_var: " + datastore.set_var(WORKSPACE, "meow")
                sh(script: "pwd ; ls -l")
            }
        }
    }
}

数据存储.groovy:

    @NonCPS
    def static set_var(workspaceDir, String text) {
        def filePath = "${workspaceDir}/datastore.json"
        def data = [:]
        def file = new File(filePath)
        if (file.exists()) {
            data = JSON_SLURPER.parse(file)
        } else {
            file.getParentFile().mkdirs()
            file.createNewFile()
        }
        data["text"] = text
        def json = JsonOutput.toJson(data)
        def files = ""
        try {
            file.write(json)
            file.getParentFile().eachFile { f -> files += f.getName() + "\n" }
        } catch (Exception e) {
            return "Error writing to file: ${file.getAbsolutePath()}: ${e}"
        }
        return "Wrote text: ${text} to file: ${file.getAbsolutePath()}; files: ${files}"
    }

当我在詹金斯中运行作业时,我看到了这个:

set_var: Wrote key: FAIL_REASON, text: meow to file: /home/ubuntu/workspace/jobname/91/datastore.json; files: datastore.json

13:39:34  [Pipeline] sh
13:39:34  + pwd
13:39:34  /home/ubuntu/workspace/jobname/91
13:39:34  + ls -l
13:39:34  total 24
13:39:34  -rw-rw-r-- 1 1000 1000   78 Jul  9 10:39 Dockerfile
13:39:34  -rw-rw-r-- 1 1000 1000  230 Jul  9 10:39 README.md
13:39:34  drwxrwxr-x 6 1000 1000 4096 Jul  9 10:39 jenkins
13:39:34  -rw-rw-r-- 1 1000 1000 1209 Jul  9 10:39 pipeline.py
13:39:34  -rw-rw-r-- 1 1000 1000   27 Jul  9 10:39 requirements.txt
13:39:34  drwxrwxr-x 4 1000 1000 4096 Jul  9 10:39 src

所以看起来 groovy 看到的 /home/ubuntu/workspace/jobname/91 目录与 shell/python 看到的 /home/ubuntu/workspace/jobname/91 不同。

jenkins groovy jenkins-pipeline
1个回答
0
投票

有一个 Pipeline Utility Steps 插件,提供了

writeJSON
step。这是有原因的 -
File
与内置代理上的文件系统一起工作(这是执行所有 groovy 代码的地方),但我会在这里冒险说你的管道正在代理上运行。有自己的文件系统。

© www.soinside.com 2019 - 2024. All rights reserved.