Jenkins CI Pipeline Scripts 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:
Il semble qu'il y ait un problème de sécurité pour accéder au système de fichiers, mais je ne peux pas comprendre ce qu'il donne (ou pourquoi) ce problème:
Je fais juste un peu différent de la exemple:
def version() {
String path = pwd();
def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
return matcher ? matcher[0][1] : null
}
L'erreur que je reçois lors de l'exécution de 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 ces versions: Pipeline De Greffons 2.1 Jenkins 2.2
3 réponses
Quickfix
J'ai eu un problème similaire et je l'ai résolu en faisant ce qui suit
- accédez à jenkins > Gérer jenkins > approbation de Script en cours de processus
- Il y avait une commande en attente, que je devais approuver.
Variante 1: Désactiver la sandbox
Comme cet article l'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 sont autorisés à 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 à la fois. Cela empêche les utilisateurs d'approuver chaque ligne à ce moment-là.
L'exécution de scripts sans sandbox peut être effectuée en décochant cette case dans la configuration de votre projet juste en dessous de votre script:
Option 2: Désactiver la sécurité du script
Comme cet article l'explique aussi possibilité de désactiver complètement la sécurité des scripts. Installez d'abord le plugin permissive script security et ensuite changez votre jenkins.fichier xml ajouter cet argument:
-Dpermissive-script-sécurité.enabled=true
Donc vous jenkins.xml ressemblera à 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 implémentez cela!
Vous devez désactiver le bac à sable pour Groovy dans votre configuration de travail.
Actuellement, cela n'est pas possible pour les projets multibranches où le script groovy provient du scm. Pour plus d'informations, voir https://issues.jenkins-ci.org/browse/JENKINS-28178
Pour contourner le sandboxing des scripts Groovy stockés SCM, je recommande d'exécuter le script en tant que Commande Groovy (au lieu de Fichier de 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 script groovy est transféré de l'espace de travail au maître Jenkins où il peut être exécuté en tant que system Groovy Script
. Le sandboxing est supprimé tant que Use Groovy Sandbox n'est pas coché.