web-dev-qa-db-ja.com

Jenkins CI Pipeline Scriptsでは、groovy.lang.GroovyObjectメソッドの使用は許可されていません

私は、JavaプロジェクトのコンパイルにJenkins 2を使用しています。pom.xmlからバージョンを読みたいのですが、この例に従っていました。

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

例は示唆します:

Full Jenkins Pipeline with problematic function circled

ファイルシステムへのアクセスにはセキュリティ上の問題があるようですが、その問題が何をもたらしているのか(またはその理由)はわかりません。

私は例とは少し違うことをしているだけです:

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

74

クイックフィックス

私は同様の問題を抱えていたし、次のようにして解決した。

  1. Jenkins> Manage jenkins>インプロセススクリプト承認に移動します。
  2. 保留中の命令があり、それを承認しなければなりませんでした。

In process approval link in Jenkins 2.61代替案1:サンドボックスを無効にする

この 記事 で詳しく説明されているように、Groovyスクリプトはデフォルトでサンドボックスモードで実行されます。これは、Groovyメソッドのサブセットが管理者の承認なしに実行できることを意味します。サンドボックスモードではないスクリプトを実行することもできます。これは、スクリプト全体を一度に管理者が承認する必要があることを意味します。これにより、ユーザーが一度に各行を承認できなくなります。

サンドボックスなしでスクリプトを実行するには、スクリプトのすぐ下のプロジェクト設定でこのチェックボックスをオフにします。 enter image description here

代替案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>

これを実装する場合は、自分が何をしているのかを必ず知ってください。

194
Maarten Kieft

ジョブ設定でGroovyのサンドボックスを無効にする必要があります。

現在、groovyスクリプトがscmから来ているマルチブランチプロジェクトではこれは不可能です。詳細については、 https://issues.jenkins-ci.org/browse/JENKINS-28178 を参照してください。

10
Andre

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がチェックされていない限り、抑制されます

5
Stepan Vavra

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

例:

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

に:

myvar = userInput
1
Mark