SecureGroovyScript.script ожидают класса java.lang.String, но получили SecureGroovyScript - PullRequest
0 голосов
/ 25 июня 2019

Я пишу jenkinsfile, который позволяет динамические параметры, используя SecureGroovyScript и CascadeChoiceParameter.Вот мой код


properties([
    parameters([
        choice(choices: "\nDev" + "\nQA" + "\nStage" +"\nProd",description: 'Please select an environment',name: 'Env'), 
        [$class: 'CascadeChoiceParameter', 
            choiceType: 'PT_SINGLE_SELECT', 
            description: 'Select the Server from the Dropdown List', 
            filterLength: 25, 
            filterable: true, 
            name: 'Server', 
            referencedParameters: 'Env', 
            script: [
                $class: 'GroovyScript', 
                fallbackScript: [
                    sandbox: false, 
                    script: 
                        'return[\'Could not get Environment from Env Param\']'
                ], 
                script: [
                    sandbox: false, 
                    script: new SecureGroovyScript(''' if (Env.equals("Dev"))
                    {
                        return["Dev1","Dev2","Dev3","Dev4"]
                    }
                    else if(Env.equals("QA")){
                        return["QA1","QA2","QA3"]
                    }
                    else if(Env.equals("Stage")){
                        return["Stg1","Stg2","Stg3"]
                    }
                    else if(Env.equals("Prod")){
                        return["Prod1","Prod2"]
                    }''',false,[])
                ]
            ]
        ]
    ])
])

Когда я выполняю код, он продолжал показывать следующую ошибку

java.lang.ClassCastException: org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript.script expects class java.lang.String but received class org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript
    at org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:421)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:341)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:282)
Caused: java.lang.IllegalArgumentException: Could not instantiate {sandbox=false, script=org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript@69525ebd} for SecureGroovyScript(script: String, sandbox: boolean, classpath: ClasspathEntry(path: String)[])
    at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:287)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:403)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:341)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:282)

Я сомневался, что проблема возникла из создания экземпляра SecureGroovyScript, который распознает входной скриптнеправильноЕсть ли способ обойти это?

--- ОБНОВЛЕНИЕ --- Спасибо, @metalisticpain за ваш совет.У меня есть еще несколько дополнительных комментариев.чего я хочу добиться - это прочитать файл с динамически выбранного пути.вот что я пытался, но все равно не получилось

                    script: 
                    '''
                    if (!Env.isEmpty()){
                        GString path = "converge-cloud-params/${Env}-flavors.txt"
                        File file = new File(path)
                        result = file.readLines()
                        return result
                    }
                    '''

1 Ответ

1 голос
/ 27 июня 2019

Я бы попробовал просто сделать то, что он говорит, вместо

                script: new SecureGroovyScript(''' if (Env.equals("Dev"))
                {
                    return["Dev1","Dev2","Dev3","Dev4"]
                }
                else if(Env.equals("QA")){
                    return["QA1","QA2","QA3"]
                }
                else if(Env.equals("Stage")){
                    return["Stg1","Stg2","Stg3"]
                }
                else if(Env.equals("Prod")){
                    return["Prod1","Prod2"]
                }''',false,[])

do

                script: (''' if (Env.equals("Dev"))
                {
                    return["Dev1","Dev2","Dev3","Dev4"]
                }
                else if(Env.equals("QA")){
                    return["QA1","QA2","QA3"]
                }
                else if(Env.equals("Stage")){
                    return["Stg1","Stg2","Stg3"]
                }
                else if(Env.equals("Prod")){
                    return["Prod1","Prod2"]
                }''',false,[])

Удалите новый SecureGroovyScript, потому что он, вероятно, ожидает строку и обработает ее для вас.

для динамического содержимого, попробуйте

        script: ("""
                if (!Env.isEmpty()){
                    return readFile file:'converge-cloud-params/${Env}-flavors.txt'
                }
                """

, см. https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#readfile-read-file-from-workspace для справки.

...