Jenkins CI パイプライン スクリプトでは、メソッド groovy.lang.GroovyObject の使用は許可されていません。質問する

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
}

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

使用しているバージョン: プラグイン パイプライン 2.1 Jenkins 2.2

ベストアンサー1

クイックフィックスソリューション:

私も同様の問題を抱えていましたが、次の方法で解決しました

  1. Jenkins > Jenkinsの管理 > プロセス内スクリプト承認に移動します。
  2. 保留中のコマンドがあり、それを承認する必要がありました。

Jenkins 2.61 のプロセス承認リンク


代替案1: サンドボックスを無効にする

このように記事詳しく説明すると、Groovy スクリプトはデフォルトでサンドボックス モードで実行されます。つまり、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>

これを実装する場合は、何をしているのかを必ず理解してください。

おすすめ記事