[maven] Jenkins CI 파이프 라인 스크립트는 groovy.lang.GroovyObject 메소드를 사용할 수 없습니다.

Java 프로젝트를 컴파일하기 위해 Jenkins 2를 사용하고 있으며 pom.xml에서 버전을 읽고 싶습니다.이 예제를 따르고 있습니다.

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

예제는 다음을 제안합니다.

문제가있는 기능이 동그라미로 표시된 전체 Jenkins 파이프 라인

파일 시스템에 액세스하는 데 보안 문제가있는 것 같지만 그 문제가 무엇인지 (또는 이유) 파악할 수 없습니다.

예제와 약간 다른 작업을 수행하고 있습니다.

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

‘버전’메서드를 실행할 때 발생하는 오류 :

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



답변

빠른 수정

비슷한 문제가 있었고 다음을 수행하여 해결했습니다.

  1. jenkins> jenkins 관리> In-process 스크립트 승인으로 이동합니다.
  2. 승인해야하는 보류중인 명령이있었습니다.

Jenkins 2.61의 프로세스 승인 링크
대안 1 : 샌드 박스 비활성화

기사 에서 자세히 설명하는 것처럼 groovy 스크립트는 기본적으로 샌드 박스 모드에서 실행됩니다. 이는 관리자의 승인없이 그루비 메서드의 하위 집합을 실행할 수 있음을 의미합니다. 샌드 박스 모드가 아닌 스크립트를 실행할 수도 있습니다. 즉, 관리자가 전체 스크립트를 한 번에 승인해야 함을 의미합니다. 이로 인해 사용자가 당시에 각 라인을 승인 할 수 없습니다.

스크립트 바로 아래의 프로젝트 구성에서이 확인란을 선택 취소하면 샌드 박스없이 스크립트를 실행할 수 있습니다.
여기에 이미지 설명 입력

대안 2 : 스크립트 보안 비활성화

기사에서 설명하는 것처럼 스크립트 보안을 완전히 비활성화 할 수도 있습니다. 먼저 허용 스크립트 보안 플러그인을 설치하고 그 후 jenkins.xml 파일을 변경 한 후 다음 인수를 추가하십시오.

-Dpermissive-script-security.enabled = true

따라서 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>

이것을 구현하는 경우 무엇을하고 있는지 확인하십시오!


답변

작업 구성에서 Groovy 용 샌드 박스를 비활성화해야합니다.

현재는 groovy 스크립트가 scm에서 오는 다중 브랜치 프로젝트에서는 불가능합니다. 자세한 내용은 https://issues.jenkins-ci.org/browse/JENKINS-28178을 참조 하세요.


답변

userInput의 사용자 입력 매개 변수 수를 3에서 1로 줄 였을 때이 문제가 발생했습니다. 이로 인해 userInput의 변수 출력 유형이 배열에서 기본 형식으로 변경되었습니다.

예:

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

에:

myvar = userInput


답변

SCM에 저장된 Groovy 스크립트의 샌드 박싱을 피하려면 스크립트를 Groovy 명령 으로 실행하는 것이 좋습니다 ( 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로 전송되어 system Groovy Script. Use Groovy Sandbox선택 되어 있지 않으면 샌드 박싱이 억제됩니다 .


답변