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:

Pipeline Jenkins complet avec une fonction problématique encerclée

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

47
demandé sur mkobit 2016-07-09 01:40:48

3 réponses

Quickfix

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

  1. accédez à jenkins > Gérer jenkins > approbation de Script en cours de processus
  2. Il y avait une commande en attente, que je devais approuver.

Lien d'approbation en cours de processus dans Jenkins 2.61 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: entrez la description de l'image ici

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!

143
répondu Maarten Kieft 2018-05-04 18:21:36

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

5
répondu Andre 2016-07-22 08:57:39

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

2
répondu Stepan Vavra 2017-07-24 14:01:02