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

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

В примере предлагается:

Full Jenkins Pipeline with problematic function circled

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

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

def version () {
    Строка path = pwd ();
    def matcher = readFile ("$ {path} /pom.xml") = ~ ' (. +) '
    вернуть сопоставитель? совпадение [0] [1]: ноль
}

Ошибка, которую я получаю при запуске метода 'версия':

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)

Я использую эти версии: Плагин Pipeline 2.1 Дженкинс 2.2

Ответы (6)

Решение Quickfix:

У меня была аналогичная проблема, и я решил ее, выполнив следующие действия

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

In process approval link in Jenkins 2.61



Вариант 1: отключить песочницу

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

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

Альтернатива 2: Отключить безопасность сценария

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

-Dpermissive-script-security.enabled = true

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

..bin\java
-Dpermissive-script-security.enabled=true -Xrs -Xmx4096m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=80 --webroot="%BASE%\war"

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

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

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

Чтобы получить версию проекта maven, я обычно использую двоичный файл mvn в блоке sh следующим образом. Разрешения администратора не требуются.

stage("Compile") {
    steps {
       sh """
         mvn help:evaluate -Dexpression=project.version -q -DforceStdout > version.txt
       """
    }
}

Чтобы обойти изолирование скриптов Groovy, хранящихся в SCM, я рекомендую запускать скрипт как 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-скрипт переносится из рабочей области в Jenkins Master, где он может быть выполнен как системный Groovy-скрипт. Песочница подавляется, пока Использовать Groovy Sandbox не отмечен .

После ответа @ JavaTechnicalздесь версия проекта Maven может быть присвоена переменной:

stage ("getPomProjectVersion") {
    steps {
       ...
       def pomProjectVersion = sh сценарий: 'mvn help: оценить -Dexpression = project.version -q -DforceStdout', returnStdout: true
       ...
    }
}

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

Пример:

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

на:

myvar = userInput

2022 WebDevInsider