私は、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
}
「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
クイックフィックス
私は同様の問題を抱えていたし、次のようにして解決した。
この 記事 で詳しく説明されているように、Groovyスクリプトはデフォルトでサンドボックスモードで実行されます。これは、Groovyメソッドのサブセットが管理者の承認なしに実行できることを意味します。サンドボックスモードではないスクリプトを実行することもできます。これは、スクリプト全体を一度に管理者が承認する必要があることを意味します。これにより、ユーザーが一度に各行を承認できなくなります。
サンドボックスなしでスクリプトを実行するには、スクリプトのすぐ下のプロジェクト設定でこのチェックボックスをオフにします。
代替案2:スクリプトセキュリティを無効にする
この 記事 で説明されているように、スクリプトセキュリティを完全に無効にすることも可能です。最初に permissiveスクリプトセキュリティプラグイン をインストールし、その後あなたの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 を参照してください。
SCMに格納されたGroovyスクリプトのサンドボックス化を回避するには、Groovyスクリプトファイルではなく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)
そのような場合、groovyスクリプトはワークスペースからJenkins Masterに転送され、そこでsystem Groovy Script
として実行されます。サンドボックス化は、Use Groovy Sandboxがチェックされていない限り、抑制されます。
UserInputのユーザー入力パラメーターの数を3から1に減らしたときに、これに遭遇しました。これにより、userInputの可変出力タイプが配列からプリミティブに変更されました。
例:
myvar1 = userInput['param1']
myvar2 = userInput['param2']
に:
myvar = userInput