2017-09-26 8 views
0

Ce que j'essaie de réaliser est de créer un fichier temporaire dans groovy dans le répertoire d'espace de travail, mais à titre d'exemple /tmp/foo sera assez bon.Comment utiliser createTempFile dans groovy/Jenkins pour créer un fichier dans un répertoire autre que celui par défaut?

Donc, ici fonctionne parfaitement code 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(); 
     } 
    } 
} 

Cependant, lorsqu'il est utilisé dans le contexte de pipeline Jenkins, il ne fonctionne tout simplement pas:

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

Le résultat est incompatibilité de type d'élément de tableau message avec rien d'utile dans le journal de pipeline:

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) 

Le fichier java.io.File.createTempFile() n'est pas meilleur. En code java simple, cela fonctionne parfaitement. Dans groovy il jette java.io.IOException: No such file or directory.

BTW, /tmp/foo existe, les méthodes sont ajoutées sur l'écran d'approbation de script.

+0

problème pas dans groovy, mais dans sandbox jenkins. pouvez-vous l'exécuter pas dans le bac à sable? – daggett

Répondre

2

À partir du IOException Je suppose que vous appelez mktemp à partir d'un bloc node {} et que vous prévoyez de créer le fichier temporaire sur ce noeud. Les scripts de pipeline sont exécutés entièrement sur le maître Jenkins. Les étapes de pipeline qui interagissent avec le système de fichiers (par exemple writeFile) connaissent les blocs node {} et seront envoyées au nœud pour y être exécutées, mais les méthodes Java pures ne connaissent rien aux nœuds distants et vont interagir avec le système de fichiers du maître.

+0

Oui, vous avez raison. Merci pour l'indice. – ArturFH