我有以下测试代码来尝试打开和修改文件的内容:
private def updateTagInfoInFile(final String file) {
final String tmpFile = "tmp.txt"
sh "ls -al /data/workspace/Utilities/Playground"
sh "whoami; pwd; ls -al"
new File("/data/workspace/Utilities/Playground/copy-artifact/$file").eachLine{line->
if (line.startsWith("Tag")) {
// Count the number of spaces between "Tag: <tag>" to preserve the formatting
final Integer numSpaces = line.length() - line.replaceAll(" ", "").length()
line = "Tag:"+" ".multiply(numSpaces)+"newTag"
}
sh "echo $line >> $tmpFile"
}
sh "mv $tmpFile $file"
}
updateTagInfoInFile("someFile.txt")
但我收到以下错误:
+ ls -al /data/workspace/Utilities/Playground
total 0
drwxrwxr-x 4 ubuntu ubuntu 52 Mar 29 16:46 .
drwxrwxr-x 5 ubuntu ubuntu 136 Mar 29 16:38 ..
drwxrwxr-x 2 ubuntu ubuntu 45 Mar 29 16:38 copy-artifact
drwxrwxr-x 3 ubuntu ubuntu 30 Mar 29 17:29 copy-artifact@tmp
+ whoami
ubuntu
+ pwd
/data/workspace/Utilities/Playground/copy-artifact
+ ls -al
total 4
drwxrwxr-x 2 ubuntu ubuntu 45 Mar 29 16:38 .
drwxrwxr-x 4 ubuntu ubuntu 52 Mar 29 16:46 ..
-rw-rw-r-- 1 ubuntu ubuntu 2368 Mar 29 16:24 someFile.txt
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: b41cce20-1d11-416e-8e89-e5aec9147ea5
java.io.FileNotFoundException: /data/workspace/Utilities/Playground/copy-artifact/someFile.txt (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(Unknown Source)
at java.base/java.io.FileInputStream.<init>(Unknown Source)
at groovy.util.CharsetToolkit.<init>(CharsetToolkit.java:78)
at org.codehaus.groovy.runtime.ResourceGroovyMethods.newReader(ResourceGroovyMethods.java:1599)
...
该文件显然存在,那为什么我会收到错误呢?
这是一个常见的陷阱,我过去也遇到过。该类
File
在 Jenkins 主服务器上执行操作,而不一定在构建代理上执行操作(除非代理是master
)。以下代码行(肯定会抛出Exception
):可能应该替换为:
但是,我并不完全确定该代码是否能完美地取代您当前正在寻找的功能,并且我相信我改编自几年前看到的一个答案,该答案是由比我更精通 Pipeline 的人提供的。这里可能仍然存在问题,如果有必要,我们可以在评论中讨论。
编辑完整解决方案