Java 프로젝트를 컴파일하기 위해 Jenkins 2를 사용하고 있으며 pom.xml에서 버전을 읽고 싶습니다.이 예제를 따르고 있습니다.
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
예제는 다음을 제안합니다.
파일 시스템에 액세스하는 데 보안 문제가있는 것 같지만 그 문제가 무엇인지 (또는 이유) 파악할 수 없습니다.
예제와 약간 다른 작업을 수행하고 있습니다.
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
답변
빠른 수정
비슷한 문제가 있었고 다음을 수행하여 해결했습니다.
- jenkins> jenkins 관리> In-process 스크립트 승인으로 이동합니다.
- 승인해야하는 보류중인 명령이있었습니다.
이 기사 에서 자세히 설명하는 것처럼 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 가 선택 되어 있지 않으면 샌드 박싱이 억제됩니다 .