从 jenkinsfile 运行 groovy 脚本时出现异常“脚本不允许使用 staticMethod ”

sta*_*low 4 groovy jenkins jenkins-pipeline

我正在尝试从远程服务器上运行的 jenkinsfile 执行“myGroovyScript.groovy”。Groovy 脚本保存在服务器的路径中(未在 scm 中检查)。但我遇到了例外。

我的 Jenkinsfile 如下:

attempt=1;
maxAttempt = 90;
uiNodesReady = false;
uiFrontDoorReady = false;
waitTimeMS = 10000;
node('abcd'){

        def buildInput;

      echo 'Deploying build'
     if(!params.buildName) {
         buildInput = input(
                          id: 'userInput', message: 'What is the build name?', parameters: [
                          [$class: 'TextParameterDefinition', defaultValue: 'BuildNameIsABC', description: 'Environment', name: 'buildName']
                          ])
      }
      buildToUse = params.buildName ? params.buildName : buildInput;
      echo ("Env: "+buildToUse);

      if ( "${params.buildParam}" == 'prequal' || !params.buildParam ){

        stage('Prequal') {
                echo 'Checking prequal status for my product build'
            def rootDir = '/path to myGroovyscript.groovy/'
            def script = load "${rootDir}myGroovyscript.groovy"
          def executeStatus= script.execute('abcd')
}
Run Code Online (Sandbox Code Playgroud)

我的 groovy 脚本“myGroovyScript.groovy”如下

#!/usr/bin/env groovy

def frontDoorUrl
def uiNodes

def execute(service) {
if ("abcd".equalsIgnoreCase(service)) {
    println 'Init config for service abcd'
    frontDoorUrl = "http://myFrontDoorURL"
    uiNodes = ["http://myUINodes"]
}

//ping nodes <service>
while (attempt <= maxAttempt && uiNodesReady == false) {
    println 'Attempt #' + attempt
    for (i = 0; i < uiNodes.size(); i++) {
        def result = ('curl -m 2 --write-out "%{http_code}" ' + uiNodes[i]).execute().text
        println 'UI node: ' + i + ' ::: ' + uiNodes[i] + ' status: ' + result
        if (result.contains("<StatusCode>200</StatusCode>")) {
            uiNodesReady = true
        } else {
            uiNodesReady = false
            break
        }
    }
}
}
return this
Run Code Online (Sandbox Code Playgroud)

当我运行詹金斯工作时,我遇到以下异常:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods execute java.lang.String
    at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticMethod(StaticWhitelist.java:189)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:102)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:148)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:152)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:16)
    at Script1.execute(Script1.groovy:53)
    at WorkflowScript.run(WorkflowScript:119)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixName(FunctionCallBlock.java:77)
    at sun.reflect.GeneratedMethodAccessor442.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
Run Code Online (Sandbox Code Playgroud)

Vit*_*nko 7

您必须在“进程内脚本批准”部分中手动批准该方法。但我想它无论如何都不会工作,因为在 Jenkins 管道中你应该使用sh步骤来执行 shell 脚本。所以与其

def result = ('curl -m 2 --write-out "%{http_code}" ' + uiNodes[i]).execute().text
Run Code Online (Sandbox Code Playgroud)

使用

def result = sh(script: 'curl -m 2 --write-out "%{http_code}" ' + uiNodes[i], returnStdout: true)
Run Code Online (Sandbox Code Playgroud)