2017-09-26 12 views
0

私が達成しようとしているのは、ワークスペースディレクトリのgroovyに一時ファイルを作成することですが、例として/tmp/fooで十分です。ジェンキンスパイプラインのコンテキストで使用する場合、それは単に動作しません、しかしgroovy/JenkinsでcreateTempFileを使ってデフォルト以外のディレクトリにファイルを作成するには?

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(); 
     } 
    } 
} 

だから、ここ完全にJavaコードを働いている

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を投げます。

BTW、/tmp/fooディレクトリが存在する場合は、スクリプトの承認画面にメソッドが追加されます。

+0

groovyではなく、jenkinsサンドボックスでの問題です。あなたはサンドボックスで実行できませんか? – daggett

答えて

2

IOExceptionからnode {}ブロック内でmktempを呼び出し、そのノードに一時ファイルを作成すると思われます。パイプラインスクリプトは、Jenkinsマスター上で完全に実行されます。ファイルシステムと対話するパイプラインステップ(例えばwriteFile)はnode {}ブロックを認識し、そこで実行されるノードに送信されますが、純粋なJavaメソッドはリモートノードについて何も知らず、マスターのファイルシステムとやり取りします。

+0

はい、そうです。ヒントありがとう。 – ArturFH

関連する問題