Ich betreibe Jenkins in einer lokalen vertrauenswürdigen Umgebung, in der ich versuche, diese Pipeline auszuführen. Dieses Jenkinsfile wird in git eingecheckt.
#!groovy
node('master') {
def ver = pomVersion()
echo "Building version $ver"
}
def pomVersion(){
def pomtext = readFile('pom.xml')
def pomx = new XmlParser().parseText(pomtext)
pomx.version.text()
}
Beim ersten Ausführen des Builds musste ich die Änderungen manuell genehmigen (Jenkins-> Mange Jenkins-> In-Process-Skriptgenehmigung). Jetzt bekomme ich diese Ausnahme und es gibt nichts zu genehmigen. Ich möchte nur eine XML-Datei parsen. Können diese Sicherheitsprüfungen für Pipeline-Builds vollständig umgangen werden?
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified field groovy.util.Node version
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.Java:367)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.Java:363)
at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.Java:241)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.Java:238)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.Java:23)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.Java:17)
at WorkflowScript.pomVersion(WorkflowScript:10)
at WorkflowScript.run(WorkflowScript:3)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.Java:62)
at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.Java:30)
at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.Java:54)
at Sun.reflect.GeneratedMethodAccessor479.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.Java:72)
at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.Java:21)
at com.cloudbees.groovy.cps.Next.step(Next.Java:58)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.Java:154)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.Java:18)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.Java:32)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.Java:29)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.Java:108)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.Java:29)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.Java:164)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.Java:276)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$000(CpsThreadGroup.Java:78)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.Java:185)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.Java:183)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.Java:47)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.Java:112)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.Java:28)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:511)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
at Java.lang.Thread.run(Thread.Java:745)
Finished: FAILURE
Derzeit ist es nicht möglich. Es gibt ein offenes Ticket für dieses Problem https://issues.jenkins-ci.org/browse/JENKINS-28178
Versuchen Sie folgendes Jenkins-Plugin: https://wiki.jenkins-ci.org/display/JENKINS/Permissive+Script+Security+Plugin Deaktiviert die Sandbox. Funktioniert bei mir.
Sie können das Problem lösen, indem Sie folgende Schritte ausführen:
fügen Sie den permissive-script-security.enabled
-Befehlszeilenparameter zum Jenkins-Master mit dem folgenden Wert hinzu:
true
, wenn Sie die Genehmigung von Skripts deaktivieren möchten, aber möglicherweise gefährliche Signaturen protokolliert werden:
-Dpermissive-script-security.enabled=true
no_security
, wenn Sie die Genehmigung von Skripts deaktivieren und auch die Protokollierung potenziell gefährlicher Signaturen deaktivieren möchten:
-Dpermissive-script-security.enabled=no_security
Wie oben beantwortet: In den neueren Jenkins-Versionen wurde Script Security verschärft. Für den speziellen Anwendungsfall des Lesens einer Version von Maven's pom.xml
könnte man readMavenPom
aus dem Pipeline Utility Steps Plugin verwenden:
pom = readMavenPom file: 'pom.xml'
pom.version
Mit einigen anderen Lösungen in dieser StackOverflow-Frage auch.