Jenkins CI Pipeline Scripts no permite utilizar el método groovy.lang.GroovyObject


Estoy usando Jenkins 2 para compilar Proyectos Java, quiero leer la versión desde un pom.xml, estaba siguiendo este ejemplo:

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

El ejemplo sugiere:

Tubería completa de Jenkins con función problemática en un círculo

Parece que hay algún problema de seguridad para acceder al Sistema de Archivos, pero no puedo averiguar lo que está dando (o por qué) ese problema:

Solo estoy haciendo un poco diferente de la 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' 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)

Estoy usando estas versiones: Plugin Pipeline 2.1 Jenkins 2.2

Author: mkobit, 2016-07-09

3 answers

Quickfix

Tuve un problema similar y lo resolví haciendo lo siguiente

  1. Vaya a jenkins > Administrar jenkins > Aprobación de Script en proceso
  2. Había una orden pendiente, que tenía que aprobar.

Enlace de aprobación en proceso en Jenkins 2.61 Alternativa 1: Desactivar sandbox

Como este artículo explica en profundidad, los scripts groovy se ejecutan en modo sandbox de forma predeterminada. Esto significa que se permite ejecutar un subconjunto de métodos groovy sin aprobación del administrador. También es posible ejecutar scripts no en modo sandbox, lo que implica que todo el script debe ser aprobado por un administrador a la vez. Esto impide que los usuarios aprueben cada línea en el momento.

Ejecutar scripts sin sandbox se puede hacer desmarcando esta casilla de verificación en la configuración del proyecto justo debajo del script: introduzca la descripción de la imagen aquí

Alternativa 2: Desactivar la seguridad del script

Como este artículo lo explica también es posible desactivar completamente la seguridad del script. Primero instale el plugin de seguridad de script permisivo y después cambie su jenkins.archivo xml agregue este argumento:

-Dpermissive-script-security.enabled=true

Así que Jenkins.xml se verá algo como esto:

<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úrate de saber lo que estás haciendo si implementas esto!

 143
Author: Maarten Kieft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-04 18:21:36

Debe desactivar el sandbox de Groovy en la configuración de su trabajo.

Actualmente esto no es posible para proyectos multibranch donde el script groovy proviene del scm. Para más información ver https://issues.jenkins-ci.org/browse/JENKINS-28178

 5
Author: Andre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-22 08:57:39

Para evitar el sandboxing de scripts Groovy almacenados en SCM, recomiendo ejecutar el script como Comando Groovy (en lugar de Archivo 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)

En tal caso, el script groovy se transfiere desde el espacio de trabajo al Maestro Jenkins donde se puede ejecutar como un system Groovy Script. El sandboxing se suprime siempre y cuando el Use Groovy Sandbox no esté marcado.

 2
Author: Stepan Vavra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-24 14:01:02