2017-06-23 9 views
0

ich eine Pipeline gemeinsam genutzte Bibliothek erstellt haben, einen Arbeitsbereich Hash zu erstellen, so dass wir Weglängen Probleme auf unseren Fenstern vermeiden baut:Zugriff auf Variablen innerhalb jenkins Pipeline Verschlusskörper

import java.security.MessageDigest 

def call(body) { 
    def config = [:] 
    body.resolveStrategy = Closure.DELEGATE_FIRST 
    body.delegate = config 

    ws(getWsHash(config.length ?: 10)) { 
     body() 
    } 
} 

def getWsHash(length) { 
    def md5Hash = MessageDigest.getInstance("MD5").digest("${env.JOB_NAME}_${env.EXECUTOR_NUMBER}".bytes).encodeHex().toString() 
    return md5Hash.substring(0,10) 
} 

, die ich so verwenden möchten:

Dies schlägt jedoch fehl, weil die scm Variable null ist. Ich habe es geschafft, es zu beheben, indem ich zu diesem ändere:

Jedoch ist das sowohl klobig und funktioniert nicht für alle Instanzen. Zum Beispiel verwenden wir auch artifactory und bei dem Versuch, diese zu nutzen:

def server = Artifactory.server('advancedcsg') 

Ich erhalte die folgende Ausnahme:

java.lang.NullPointerException: Die Methode kann nicht Server() auf null Objekt aufrufen

Wenn ich versuche, den "Trick" by doing:

def Artifactory = Artifactory 

ich th Ausnahme ist:

java.lang.UnsupportedOperationException: Verweigern org.codehaus.groovy.runtime.GStringImpl aus Sicherheitsgründen

Kann jemand Marschall helfen zu erklären, was hier vor sich geht und was ich getan habe falsch?

Antwort

0

Ich weiß nicht, Pipeline-Skripte Jenkins, aber mit Groovy Wissen und was Sie beschreiben, das Problem ist, dass Sie den Verschluss zu wsHash geben und dort setzten die Delegierten auf eine leere Karte (config), so scm wird gebeten es und zurück null natürlich.

Ich denke, wenn man die it Parameter der Knotens Schließung nennt explizit und verwendet, dass es funktionieren soll, wie:

node('windows') { windowsNode -> 
    wsHash { 
     stage('Checkout') { 
      checkout windowsNode.scm 
     } 

     stage('Build') { 
      bat '.\\src\\Build.cmd' 
     } 
    } 
} 

Der andere Fehler, den Sie erhalten, die Refusing to marshal Fehler sind höchstwahrscheinlich auf einem anderen Teil in Ihre Pipeline, wo Sie etwas wie "foo $bar baz" haben, die eine GString ist, und Sie benötigen stattdessen eine String, verwenden Sie stattdessen "foo $bar baz" as String und die dynamischen Teile werden sofort aufgelöst und in ein einfaches String Objekt umgewandelt.