2016-10-02 1 views
1

Ich richte einen neuen Build ein. Ausführen einer einfachen Shell-Befehl funktioniert perfekt, wie unten:Befehle schlagen fehl, wenn sie in die benutzerdefinierte Klasse in jenkinsfile verschoben werden

stage("Demo") {  
    sh "echo 'Hi There'" 
} 

ich Skripte in ihren eigenen Klassen zu „Paket“ meine Shell versucht haben, nur die Dinge ein wenig vernähen auf. Das Problem besteht darin, dass bei dem Versuch, den gleichen genauen Shell-Skript ausführt aus innerhalb einer Klasse, jenkins versagt die Builds mit:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: nicht klassifiziert Methode java.lang.Class sh java.lang.String

Dies ist ein einfaches Beispiel, das nach dem Verschieben des obigen Verfahrens in eine eigene Klasse für mich nicht:

stage('Demo stage') { 
    Tools.PrintMe("Hi There") 
} 

public class Tools { 
    public static void PrintMe(String message) { 
     sh "echo " + message 
    } 
} 

Es gibt auch keine Möglichkeit, im Skript manag bereitgestellt Whitelist diese abgelehnte Methode.

Gibt es eine Möglichkeit, dies zu umgehen? Oder gibt es eine Einschränkung, die mir nicht bewusst ist?

Antwort

3

@Crait Um einen Aufruf von vordefinierten Schritten in Ihrer eigenen Klasse durchzuführen, müssen Sie das Skriptobjekt an Ihre Klasse übergeben.

Also, versuchen Sie dies:

stage('Demo stage') { 
    Tools.PrintMe(this, "Hi There") 
} 

public class Tools { 
    public static void PrintMe(def script, String message) { 
     script.sh "echo " + message 
    } 
} 
3

Wie @sshepel oben erwähnt, Code in einem einfachen Skript ausgeführt als Code innerhalb einer Klasse nicht im gleichen Kontext ist. Ich habe es in ähnlicher Weise wie oben gelöst, indem ich einen statischen Verweis auf das Skriptobjekt erstellt habe und dann in meinen Klassen dagegen ausgeführt habe.

//Set the static reference in the script 
Script.environment = this 

public class Script { 
    public static environment 
} 

public class Tools { 
    public static void PrintMe(String message) { 
     Script.environment.sh "echo " + message 
    } 
} 

Ich habe es auf diese Weise getan, um verschmutzende Methodensignaturen mit der Übergabe des Skriptobjekts zu vermeiden. Der Nachteil ist, dass alle meine Klassen davon abhängig sind, dass "Script.environment = this" gesetzt ist.

Verwandte Themen