2017-09-26 130 views
0

我想要实现的是在工作区目录中的groovy中创建一个临时文件,但作为示例,/tmp/foo就足够了。如何在groovy/Jenkins中使用createTempFile在非默认目录中创建文件?

所以,这里是完美的工作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(); 
     } 
    } 
} 
然而

,在詹金斯管道的上下文中使用时,它根本不起作用:

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$2.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代码中,它完美地工作。在常规中它会抛出java.io.IOException: No such file or directory

顺便说一句,/tmp/foo目录存在,方法被添加到脚本批准屏幕上。

+0

问题不在常规,但在詹金斯沙箱。你可以在沙箱中运行吗? – daggett

回答

2

IOException我怀疑你从node {}块中调用mktemp,并期望在该节点上创建临时文件。管道脚本完全在Jenkins主站上运行。与文件系统交互的流水线步骤(例如writeFile)知道node {}块,并将被发送到节点以在那里执行,但是任何纯Java方法对远程节点一无所知,并且将与主文件系统交互。

+0

是的,你是对的。感谢提示。 – ArturFH

相关问题