maven - online - Los scripts de canalización de CI de Jenkins no pueden usar el método groovy.lang.GroovyObject
jenkins pipeline tutorial (4)
Debe deshabilitar el entorno limitado para Groovy en la configuración de su trabajo.
Actualmente, esto no es posible para proyectos de varias ramas donde el script maravilloso proviene del scm. Para obtener más información, consulte https://issues.jenkins-ci.org/browse/JENKINS-28178
Estoy usando Jenkins 2 para compilar proyectos Java, quiero leer la versión de un pom.xml, estaba siguiendo este ejemplo:
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
El ejemplo sugiere:
Parece que hay algún problema de seguridad para acceder al Sistema de archivos, pero no puedo entender qué está dando (o por qué) ese problema:
Solo estoy haciendo un poco diferente al ejemplo:
def version() {
String path = pwd();
def matcher = readFile("${path}/pom.xml") =~ ''<version>(.+)</version>''
return matcher ? matcher[0][1] : null
}
El error que obtengo al ejecutar el método ''versión'':
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)
Estoy usando estas versiones: Plugin Pipeline 2.1 Jenkins 2.2
Me encontré con esto cuando reduje el número de parámetros de entrada de usuario en userInput de 3 a 1. Esto cambió el tipo de salida variable de userInput de una matriz a una primitiva.
Ejemplo:
myvar1 = userInput[''param1'']
myvar2 = userInput[''param2'']
a:
myvar = userInput
Para evitar el sandboxing de los scripts Groovy almacenados en SCM, recomiendo ejecutar el script como Comando Groovy (en lugar del archivo Groovy Script ):
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)
en tal caso, el script maravilloso se transfiere del espacio de trabajo al maestro Jenkins, donde puede ejecutarse como un
system Groovy Script
.
El sandboxing se suprime siempre que
Use Groovy Sandbox
no esté
marcado
.
Arreglo rapido
Tuve un problema similar y lo resolví haciendo lo siguiente
- Navegue a jenkins> Administrar jenkins> Aprobación de script en proceso
- Había un comando pendiente, que tenía que aprobar.
Alternativa 1: deshabilitar sandbox
Como este article explica en profundidad, los scripts geniales se ejecutan en modo sandbox de forma predeterminada. Esto significa que se permite ejecutar un subconjunto de métodos geniales sin la aprobación del administrador. También es posible ejecutar scripts que no están en modo sandbox, lo que implica que todo el script debe ser aprobado por un administrador de inmediato. Esto evita que los usuarios aprueben cada línea en el momento.
Puede ejecutar scripts sin sandbox desmarcando esta casilla de verificación en la configuración de su proyecto justo debajo de su script:
Alternativa 2: deshabilitar la seguridad del script
Como explica este article , también es posible deshabilitar completamente la seguridad del script. Primero instale el complemento de seguridad de script permisivo y luego cambie su archivo jenkins.xml agregue este argumento:
-Dpermissive-script-security.enabled = true
Entonces jenkins.xml se verá así:
<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>
¡Asegúrese de saber lo que está haciendo si implementa esto!