143 votes

Les scripts du pipeline Jenkins CI ne sont pas autorisés à utiliser la méthode groovy.lang.GroovyObject

J'utilise Jenkins 2 pour compiler des projets Java, je veux lire la version d'un pom.xml, je suivais cet exemple :

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

L'exemple suggère :

Full Jenkins Pipeline with problematic function circled

Il semble qu'il y ait un problème de sécurité pour accéder au système de fichiers, mais je n'arrive pas à comprendre ce qui donne (ou pourquoi) ce problème :

Je fais juste un peu différent de l'exemple :

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

L'erreur que j'obtiens lorsque je lance la méthode "version" :

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)

J'utilise les versions suivantes : Plugin Pipeline 2.1 Jenkins 2.2

341voto

BlackHawkDesign Points 452

Quickfix

J'ai eu un problème similaire et je l'ai résolu en faisant ce qui suit

  1. Naviguer vers jenkins > Manage jenkins > In-process script Approbation
  2. Il y avait une commande en attente, que je devais approuver.

In process approval link in Jenkins 2.61 Alternative 1 : Désactiver le bac à sable

Comme cette article explique en profondeur, les scripts groovy sont exécutés en mode sandbox par défaut. Cela signifie qu'un sous-ensemble de méthodes groovy est autorisé à s'exécuter sans l'approbation de l'administrateur. Il est également possible d'exécuter des scripts non en mode sandbox, ce qui implique que l'ensemble du script doit être approuvé par un administrateur en une seule fois. Cela empêche les utilisateurs d'approuver chaque ligne à la fois.

L'exécution de scripts sans sandbox peut se faire en décochant cette case dans la configuration de votre projet juste en dessous de votre script : enter image description here

Alternative 2 : Désactiver la sécurité de script.

Comme cette article explique qu'il est également possible de désactiver complètement la sécurité des script. Il faut d'abord installer le plugin de sécurité script permissif et après cela, modifiez votre fichier jenkins.xml en ajoutant cet argument :

-Dpermissive-script-security.enabled=true

Ainsi, votre jenkins.xml ressemblera à quelque chose comme ceci :

<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>

Assurez-vous de savoir ce que vous faites si vous mettez en œuvre cette mesure !

13voto

Andre Points 174

Vous devez désactiver le bac à sable pour Groovy dans la configuration de votre travail.

Actuellement, cela n'est pas possible pour les projets multibranches où le groovy script provient du scm. Pour plus d'informations, voir https://issues.jenkins-ci.org/browse/JENKINS-28178

3voto

Stepan Vavra Points 2482

Pour contourner le sandboxing des scripts Groovy stockés dans SCM, je recommande d'exécuter le script en tant que Commande Groovy (au lieu de Fichier script Groovy ) :

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)

dans ce cas, le groovy script est transféré de l'espace de travail vers le Jenkins Master où il peut être exécuté en tant que system Groovy Script . La mise en bac à sable est supprimée tant que l'option Utiliser Groovy Sandbox n'est pas vérifié .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X