2016-08-02 15 views
1

Ich habe einen Jenkins Pipeline Job, die diesen Code hat:Jenkins 2.0 Pipeline und Job DSL

import hudson.model.* 
import hudson.util.* 
import hudson.scm.* 
import hudson.scm.SubversionChangeLogSet.LogEntry 

stage 'Build' 
node('master'){ 
    svn 'http://mysvn/url' 
    def build = Thread.currentThread()?.executable 
    def changeSet= build.getChangeSet() 
    . 
    . 
} 

Der Code ist mit ungeprüfter 'Sandbox' (wie auf dem Bild dargestellt). enter image description here und ich bekomme diese Fehlermeldung: ‚?‘

groovy.lang.MissingPropertyException: No such property: executable for class: java.lang.Thread 

Ich bin nicht mit der Syntax für Thread.currentThread()?.executable vertraut was hält die Betreiber bedeutet.

Ich google es und erfuhr über jenkins Job-dsl Plugin und habe nichts über diesen Betreiber gefunden.

Ich habe auch versucht die Script Console Plugin an: http://localhost:8080/script und ich nicht aus dem gleichen Grund.

Unterstützt Pipeline Plugin den Jenkins DSL-JOB? Soll ich etwas importieren, damit es funktioniert?

Antwort

0

Es ist ein grooviger Operator, '?' ist es, NullpointerExceptions zu verhindern. Es tut nur Folgendes, wenn das erste nicht null ist.

Die Sandbox-Funktion ist für bestimmte Anrufe zu verhindern, so jemand Skripte ohne Admin-Zustimmung hinzufügen kann, aber sehr begrenzt ...

0
def build = Thread.currentThread()?.executable 

Zum einen kann der obige Satz wie folgt erklärt werden,

Thread.currentThread() wird den laufenden Faden, im Normalfall bekommt, wird es eine Instanz von Jenkins Executor Klasse sein, gibt es innerhalb dieser Klasse ein Attribut,

/** 
* {@link hudson.model.Queue.Executable} being executed right now, or null if the executor is idle. 
*/ 
@GuardedBy("lock") 
private Queue.Executable executable; 

Jenkins AbstractBuild implementieren diese Schnittstelle, so dass Sie tatsächlich AbstractBuild Instanz zurück erhalten.

Allerdings ist dieser Satz nicht für Pipelinebezogene Jobs arbeiten, da Pipeline-Projekt eine andere Struktur im Vergleich zu alten Jenkins Jobs haben. Es erstreckt sich nicht AbstractBuild Klasse.

Aus diesem Grund funktioniert Ihr Skript nicht.

Über Ihre Anforderung, da es keine AbstrctBuild Klasse gibt, so dass viele Methoden tatsächlich nicht verwendet werden können, wie die, die Sie verwendet haben.

Keine Ahnung, ob es eine clevere Möglichkeit gibt, den Changset im Pipeline-Job zu bekommen, oder vielleicht müssen Sie Ihren Job neu strukturieren, um das Pipeline-Plugin anzupassen.

Br,

Tim

+0

Vielen Dank für Ihre Erklärung. Kann der Jenkins-Job dsl in der Pipeline verwendet werden? Es scheint, als ob Jenkins Pipeline von diesem Modul abhängig ist, kann ich diese API verwenden? –

+0

was meinst du den Job dsl in Pipeline verwenden? Irgendein Beispiel? – Tim

+0

'Schritte { Maven ("test -Dproject.name = $ {Projekt}/$ {branch}") }' –

2

Here ist das zugehörige Ticket und die Antwort von CloudBees .. Ping von dort zurück:

def changeLogSets = currentBuild.rawBuild.changeSets 
for (int i = 0; i < changeLogSets.size(); i++) { 
    def entries = changeLogSets[i].items 
    for (int j = 0; j < entries.length; j++) { 
     def entry = entries[j] 
     echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}" 
     def files = new ArrayList(entry.affectedFiles) 
     for (int k = 0; k < files.size(); k++) { 
      def file = files[k] 
      echo " ${file.editType.name} ${file.path}" 
     } 
    } 
} 
+0

Ich werde es versuchen, und lassen Sie wissen :) Dank für Ihre Hilfe –

Verwandte Themen