it-swarm.com.de

Jenkins CI Pipeline Scripts dürfen die Methode groovy.lang.GroovyObject nicht verwenden

Ich verwende Jenkins 2 zum Kompilieren von Java Projects, ich möchte die Version aus einer pom.xml lesen, ich habe folgendes Beispiel befolgt:

https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md

Das Beispiel schlägt vor:

Full Jenkins Pipeline with problematic function circled

Es scheint, dass es ein Sicherheitsproblem beim Zugriff auf das Dateisystem gibt, aber ich kann nicht herausfinden, was das Problem verursacht (oder warum):

Ich mache nur ein bisschen anders als im Beispiel:

def version() {
    String path = pwd();
    def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
    return matcher ? matcher[0][1] : null
}

Der Fehler beim Ausführen der 'version'-Methode:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod Java.lang.String Java.lang.Object (org.codehaus.groovy.runtime.GStringImpl call org.codehaus.groovy.runtime.GStringImpl)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectMethod(StaticWhitelist.Java:165)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.Java:117)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.Java:103)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.Java:149)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.Java:146)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.Java:15)
    at WorkflowScript.run(WorkflowScript:71)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.Java:55)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.Java:106)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.Java:79)
    at Sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:601)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.Java:72)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.Java:100)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.Java:79)
    at Sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:601)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.Java:72)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.Java:57)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.Java:106)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.Java:79)
    at Sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)

Ich benutze diese Versionen: Plugin Pipeline 2.1 Jenkins 2.2

79

Quickfix

Ich hatte ein ähnliches Problem und habe es folgendermaßen gelöst

  1. Navigieren Sie zu Jenkins> Jenkins verwalten> In-Process-Skriptgenehmigung
  2. Es gab einen ausstehenden Befehl, den ich genehmigen musste.

In process approval link in Jenkins 2.61 Alternative 1: Sandbox deaktivieren

Wie in diesem Artikel ausführlich erklärt wird, werden Groovy-Skripte standardmäßig im Sandbox-Modus ausgeführt. Dies bedeutet, dass eine Teilmenge der Groovy-Methoden ohne Genehmigung des Administrators ausgeführt werden darf. Es ist auch möglich, Skripte nicht im Sandbox-Modus auszuführen, was bedeutet, dass das gesamte Skript sofort von einem Administrator genehmigt werden muss. Dadurch wird verhindert, dass Benutzer jede Zeile gleichzeitig genehmigen.

Das Ausführen von Skripten ohne Sandbox kann durch Deaktivieren dieses Kontrollkästchens in Ihrer Projektkonfiguration direkt unter Ihrem Skript erfolgen: enter image description here

Alternative 2: Skriptsicherheit deaktivieren

Wie in diesem Artikel erklärt, ist es auch möglich, die Skriptsicherheit vollständig zu deaktivieren. Installiere zuerst das permissive script security plugin und ändere danach deine jenkins.xml-Datei mit folgendem Argument:

-Dpermissive-script-security.enabled = true

Die jenkins.xml sieht also ungefähr so ​​aus:

<executable>..bin\Java</executable>
<arguments>-Dpermissive-script-security.enabled=true -Xrs -Xmx4096m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=80 --webroot="%BASE%\war"</arguments>

Stellen Sie sicher, dass Sie wissen, was Sie tun, wenn Sie dies implementieren !

207
Maarten Kieft

Sie müssen die Sandbox für Groovy in Ihrer Jobkonfiguration deaktivieren.

Derzeit ist dies nicht für Multibranch-Projekte möglich, bei denen das Groovy-Skript vom SCM stammt. Weitere Informationen finden Sie unter https://issues.jenkins-ci.org/browse/JENKINS-28178

10
Andre

Um das Sandboxing von SCM-gespeicherten Groovy-Skripten zu umgehen, empfehle ich, das Skript als Groovy-Befehl (anstelle von Groovy-Skriptdatei) auszuführen:

import hudson.FilePath
final GROOVY_SCRIPT = "workspace/relative/path/to/the/checked/out/groovy/script.groovy"

evaluate(new FilePath(build.workspace, GROOVY_SCRIPT).read().text)

in diesem Fall wird das Groovy-Skript vom Arbeitsbereich zum Jenkins-Master übertragen, wo es als system Groovy Script ausgeführt werden kann. Das Sandboxing wird unterdrückt, solange Groovy Sandbox verwenden nicht aktiviert ist .

4
Stepan Vavra

Ich bin darauf gestoßen, als ich die Anzahl der Benutzereingabeparameter in userInput von 3 auf 1 verringert habe. Dadurch wurde der variable Ausgabetyp von userInput von einem Array in ein Grundelement geändert.

Beispiel:

myvar1 = userInput['param1']
myvar2 = userInput['param2']

zu:

myvar = userInput
1
Mark