如何使用 groovy/Jenkins 中的 createTempFile 在非默认目录中创建文件?
How to use createTempFile in groovy/Jenkins to create a file in non-default directory?
我想要实现的是在工作区目录的 groovy 中创建一个临时文件,但作为示例 /tmp/foo
就足够了。
所以,这里是完美的 java 代码:
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
class foo {
public static void main(String[] args) {
try {
String s="/tmp/foo";
Path p=Paths.get(s);
Path tmp=Files.createTempFile(p,"pref",".suf");
System.out.println(tmp.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
然而,当在 Jenkins 管道的上下文中使用时,它根本不起作用:
def mktemp() {
//String s=pwd(tmp:true)
String s="/tmp/foo"
Path p=Paths.get(s)
Path tmp=Files.createTempFile(p,"pref",".suf")
return tmp;
}
结果是数组元素类型不匹配消息,在管道日志中没有任何帮助:
java.lang.IllegalArgumentException: array element type mismatch
at java.lang.reflect.Array.set(Native Method)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.parametersForVarargs(GroovyCallSiteSelector.java:104)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.matches(GroovyCallSiteSelector.java:51)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.findMatchingMethod(GroovyCallSiteSelector.java:197)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.staticMethod(GroovyCallSiteSelector.java:191)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onStaticCall(SandboxInterceptor.java:153)
at org.kohsuke.groovy.sandbox.impl.Checker.call(Checker.java:184)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedStaticCall(Checker.java:188)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:95)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
at WorkflowScript.mktemp(WorkflowScript:16)
java.io.File.createTempFile() 也好不了多少。在普通 java 代码中,它工作得很好。在 groovy 它抛出 java.io.IOException: No such file or directory
.
顺便说一句,/tmp/foo
目录存在,脚本批准屏幕上添加了方法。
来自 IOException
我怀疑您是从 node {}
块中调用 mktemp
并希望在该节点上创建临时文件。管道脚本 运行 完全在 Jenkins 主机上。与文件系统交互的管道步骤(例如 writeFile
)知道 node {}
块并将被发送到要在那里执行的节点,但是任何纯 Java 方法都不知道远程节点并将与 master 的文件系统交互。
我想要实现的是在工作区目录的 groovy 中创建一个临时文件,但作为示例 /tmp/foo
就足够了。
所以,这里是完美的 java 代码:
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
class foo {
public static void main(String[] args) {
try {
String s="/tmp/foo";
Path p=Paths.get(s);
Path tmp=Files.createTempFile(p,"pref",".suf");
System.out.println(tmp.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
然而,当在 Jenkins 管道的上下文中使用时,它根本不起作用:
def mktemp() {
//String s=pwd(tmp:true)
String s="/tmp/foo"
Path p=Paths.get(s)
Path tmp=Files.createTempFile(p,"pref",".suf")
return tmp;
}
结果是数组元素类型不匹配消息,在管道日志中没有任何帮助:
java.lang.IllegalArgumentException: array element type mismatch
at java.lang.reflect.Array.set(Native Method)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.parametersForVarargs(GroovyCallSiteSelector.java:104)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.matches(GroovyCallSiteSelector.java:51)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.findMatchingMethod(GroovyCallSiteSelector.java:197)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovyCallSiteSelector.staticMethod(GroovyCallSiteSelector.java:191)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onStaticCall(SandboxInterceptor.java:153)
at org.kohsuke.groovy.sandbox.impl.Checker.call(Checker.java:184)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedStaticCall(Checker.java:188)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:95)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
at WorkflowScript.mktemp(WorkflowScript:16)
java.io.File.createTempFile() 也好不了多少。在普通 java 代码中,它工作得很好。在 groovy 它抛出 java.io.IOException: No such file or directory
.
顺便说一句,/tmp/foo
目录存在,脚本批准屏幕上添加了方法。
来自 IOException
我怀疑您是从 node {}
块中调用 mktemp
并希望在该节点上创建临时文件。管道脚本 运行 完全在 Jenkins 主机上。与文件系统交互的管道步骤(例如 writeFile
)知道 node {}
块并将被发送到要在那里执行的节点,但是任何纯 Java 方法都不知道远程节点并将与 master 的文件系统交互。