我正在尝试从 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 不同。
有一个 Pipeline Utility Steps 插件,提供了
writeJSON
step。这是有原因的 - File
与内置代理上的文件系统一起工作(这是执行所有 groovy 代码的地方),但我会在这里冒险说你的管道正在代理上运行。有自己的文件系统。