Подтвердить что ты не робот

Jenkins CI Pipeline Scripts не разрешено использовать метод groovy.lang.GroovyObject

Я использую Jenkins 2 для компиляции Java-проектов, я хочу прочитать версию из pom.xml, я следовал этому примеру:

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

Пример подсказывает:

Full Jenkins Pipeline with problematic function circled

Кажется, что есть некоторая проблема безопасности при доступе к файловой системе, но я не могу понять, что она дает (или почему) эту проблему:

Я просто немного отличаюсь от примера:

def version() {
    String path = pwd();
    def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
    return matcher ? matcher[0][1] : null
}

Ошибка, которую я получаю при запуске метода '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)

Я использую эти версии: Plugin Pipeline 2.1 Jenkins 2.2

4b9b3361

Ответ 1

Быстрая починка

У меня была похожая проблема, и я решил ее следующим образом

  1. Перейдите к jenkins> Управление jenkins> Утверждение сценария в процессе
  2. Была ожидающая команда, которую я должен был одобрить.

In process approval link in Jenkins 2.61 Альтернатива 1: отключить песочницу

Как подробно объясняется в этой статье, скрипты Groovy по умолчанию запускаются в режиме песочницы. Это означает, что подмножество groovy-методов разрешено запускать без одобрения администратора. Также возможно запускать сценарии не в режиме песочницы, что означает, что весь сценарий должен быть утвержден администратором сразу. Это препятствует тому, чтобы пользователи одобрили каждую строку в то время.

Запуск сценариев без песочницы можно снять, сняв этот флажок в конфигурации вашего проекта под вашим сценарием: enter image description here

Альтернатива 2: отключить защиту скрипта

Как объясняется в этой статье, также возможно полностью отключить безопасность скриптов. Сначала установите плагин безопасности разрешающего скрипта, а затем измените файл jenkins.xml и добавьте следующий аргумент:

-Dpermissive-скрипт-security.enabled = истина

Итак, ваш jenkins.xml будет выглядеть примерно так:

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

Убедитесь, что вы знаете, что делаете, если реализуете это!

Ответ 2

Вы должны отключить песочницу для Groovy в своей конфигурации работы.

В настоящее время это невозможно для многоотраслевых проектов, в которых скрипт groovy исходит от scm. Для получения дополнительной информации см. Https://issues.jenkins-ci.org/browse/JENKINS-28178.

Ответ 3

Чтобы обойти скриншоты SCM-хранимых сценариев Groovy, я рекомендую запустить script как Groovy Command (вместо Groovy script file):

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)

в таком случае, Groovy script переносится из рабочего пространства в Jenkins Master, где он может быть выполнен как system Groovy Script. Песочница отключена, если флажок Использовать Groovy Песок > не установлен.

Ответ 4

Я столкнулся с этим, когда уменьшил количество пользовательских параметров ввода в userInput с 3 до 1. Это изменило тип вывода переменной userInput из массива на примитив.

Пример:

myvar1 = userInput['param1']
myvar2 = userInput['param2']

чтобы:

myvar = userInput