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


104

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)

これらのバージョンを使用しています:プラグインパイプライン2.1 Jenkins 2.2


について同様のエラーScripts not permitted to use methodがありましたが、のscm 'checkout'代わりに書いたために発生しましたcheckou scm。誰かがこれに陥った場合に備えて、構文の誤りに注意してください:)。Maarten Kieftが言ったように実行すると、不正なコマンドに関するより明確なエラーメッセージが表示されました:)
GabLeRoux

回答:


261

クイックフィックス

私は同様の問題があり、私はそれを次のように解決しました

  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>

これを実装する場合は、何をしているのかを確認してください。


1
スクリプト全体を承認する方が良いかどうかは、チーム構造に依存します。完全なアクセス権を持ついくつかの開発者にとっては、それは非常に便利です。ただし、複数のチームで設定すると、管理者はすべてのパイプラインスクリプトのすべての変更を承認する必要があります。
Roger Lehmann

2
代替3(本当に最初の提案であるべきです)は、問題のあるホワイトリストにないコード変更することです。この場合、単純な使用@NonCPSのためのMatcher使用量は十分であろう。この場合、パイプライン全体、特にJenkinsインストール全体のセキュリティを無効にする必要はありません。ブロックされた各通話を個別に評価し、本当に承認する必要があるかどうかを判断します。
mkobit 2018

1
@mkobitは機能しません。@NonCPS助けにはならない。
warvariuc

@warvariucうーん、インターフェイスを実装していないMatcherため、自分自身を返す場合がMatcherありSerializableます。新しい質問をする価値があるかもしれません。元の質問で参照されているドキュメントが維持され、そもそも間違っていないことを願っています。
mkobit

2
@mkobitをNonCPS 使用した関数で装飾しましたcurrentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()。NonCPSは、私が読んだものから、セキュリティの問題にはまったく役立ちません。
warvariuc


6

userInputのユーザー入力パラメーターの数を3から1に減らしたとき、これに遭遇しました。これにより、userInputの可変出力タイプが配列からプリミティブに変更されました。

例:

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

に:

myvar = userInput

これはまさに私が経験した症状の修正です。エラーメッセージはでしたorg.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object。この方法は、2つのパラメータ及び3を受信した期待
タイラーW

4

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マスターに転送され、そこでとして実行できますsystem Groovy ScriptUse Groovy Sandboxチェックされていない限り、サンドボックス化は抑制されます


5
これは不格好で危険なようで、戻ってきてあなたを噛むことになるでしょう。
Simon Forsberg、2017

4
セキュリティは特にユーザーの機密データを保護する場合に重要ですが、開発プロセス中に複雑になるなどの代償も伴います。セキュリティツールを半分だけ実装すると、さらに悪化します。Jenkinsスクリプトサンドボックスは、半分実装されたセキュリティツールの良い例であり、その結果、機能を完全に無効にする必要がある場合があります。
Stepan Vavra 2017

3
私の場合、古いJenkinsからのアップグレード後に、私のGroovyスクリプトが機能しなくなりました。それを機能させる唯一の方法は、スクリプトを300回(推定のみ)実行し、実行ごとにJenkins UIをクリックして許可することです。すべてのメソッドは200行のスクリプトで呼び出します。さらに、UIでは、何らかの方法でそれらを生成できた場合に備えて、許可されたすべてのメソッド呼び出しの完全なリストを貼り付けることはできません。さらに、UIはメソッド呼び出しの一部を表示しなくなり、しばらくすると続行できなくなりました。
Stepan Vavra 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.