J'utilise Jenkins 2 pour compiler des projets Java, je veux lire la version à partir 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 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 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: Plugin Pipeline 2.1 Jenkins 2.2
maven
jenkins
continuous-integration
jenkins-pipeline
Daniel Hernández
la source
la source
Scripts not permitted to use method
, mais c'est arrivé parce que j'ai écrit à lascm 'checkout'
placecheckou scm
. Juste au cas où quelqu'un tomberait dessus, surveillez la mauvaise syntaxe :). Faire comme Maarten Kieft m'a permis de voir un message d'erreur plus clair sur la mauvaise commande :)Réponses:
Solution rapide
J'ai eu un problème similaire et je l'ai résolu en procédant comme suit
Alternative 1: désactiver le bac à sable
Comme cet article l' explique en détail, les scripts groovy sont exécutés par défaut en mode sandbox. 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 pas 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 à la fois.
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:
Alternative 2: désactiver la sécurité des scripts
Comme cet article l' explique, il est également possible de désactiver complètement la sécurité des scripts. Installez d'abord le plugin de sécurité de script permissif, puis modifiez votre fichier jenkins.xml, ajoutez cet argument:
Ainsi, jenkins.xml ressemblera à quelque chose comme ceci:
Assurez-vous de savoir ce que vous faites si vous implémentez cela!
la source
@NonCPS
pour l'Matcher
usage suffirait. Il n'est pas nécessaire dans ce cas de désactiver la sécurité pour tout le pipeline, et en particulier pour toute l'installation de Jenkins. Évaluez chaque appel bloqué individuellement et décidez si vous devez vraiment les approuver.@NonCPS
n'aide pas.Matcher
, car n'implémenteMatcher
pas l'Serializable
interface. Cela pourrait valoir la peine de poser une nouvelle question. Je souhaite que la documentation mentionnée dans la question initiale soit conservée et qu'elle ne soit pas erronée au départ.NonCPS
une fonction qui utilisecurrentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
. NonCPS n'aide pas du tout avec les problèmes de sécurité, d'après ce que j'ai lu.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 script groovy provient du scm. Pour plus d'informations, voir https://issues.jenkins-ci.org/browse/JENKINS-28178
la source
J'ai rencontré cela lorsque j'ai réduit le nombre de paramètres d'entrée utilisateur dans userInput de 3 à 1. Cela a changé le type de sortie variable de userInput d'un tableau à une primitive.
Exemple:
à:
la source
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object
. La méthode attendait 2 paramètres et recevait 3.Pour contourner le sandboxing des scripts Groovy stockés par SCM, je recommande d'exécuter le script en tant que Groovy Command (au lieu du fichier Groovy Script ):
dans ce cas, le script groovy est transféré de l'espace de travail vers le maître Jenkins où il peut être exécuté en tant que fichier
system Groovy Script
. Le sandboxing est supprimé tant que la case Use Groovy Sandbox n'est pas cochée .la source