【问题标题】:Groovy Script failing in Jenkins job but runs fine from command lineGroovy 脚本在 Jenkins 作业中失败,但从命令行运行良好
【发布时间】:2018-11-13 23:41:49
【问题描述】:

为简洁起见,我将以下用于管道作业的托管 Jenkinsfile 剥离了阶段。

#!groovy
import groovy.json.JsonSlurperClassic

def json = new File("TEST_JSON.json").text
def data = new JsonSlurperClassic().parseText(json)

def string_1 = data.test

properties([
    parameters([
        string(defaultValue: string_1, description: 'STRING 1', name: 'STRING_1', trim: false), 
        string(defaultValue: string_1, description: 'STRING 2', name: 'STRING_2', trim: false), 
        [$class: 'ChoiceParameter', choiceType: 'PT_SINGLE_SELECT', description: 'MPSS Flavor', 
            filterLength: 1, filterable: true, 
            name: 'MPSS_FLAVOR', randomName: 'choice-parameter-10980926894589', 
            script: [
                $class: 'GroovyScript', 
                fallbackScript: [classpath: [], sandbox: false, script: ''], 
                script: [
                    classpath: [], sandbox: false, 
                    script: '''
                        import groovy.json.JsonSlurperClassic
                        def json = new File("TEST_JSON.json").text
                        def data = new JsonSlurperClassic().parseText(json)
                        mpss_flavors = []
                        for (option in data.options) {
                            println option
                            mpss_flavors.add(option.mpss_flavor)
                        }
                        return mpss_flavors
                    '''
                ]
            ]
        ], 
        [$class: 'CascadeChoiceParameter', choiceType: 'PT_SINGLE_SELECT', description: 'TARGET', 
            filterLength: 1, filterable: true, 
            name: 'TARGET', randomName: 'choice-parameter-10980967122105', 
            referencedParameters: 'MPSS_FLAVOR', 
            script: [
                $class: 'GroovyScript', 
                fallbackScript: [classpath: [], sandbox: false, script: ''], 
                script: [
                    classpath: [], sandbox: false, 
                    script: '''
                        import groovy.json.JsonSlurperClassic
                        def json = new File("TEST_JSON.json").text
                        def data = new JsonSlurperClassic().parseText(json)
                        targets = []
                        for (option in data.options) {
                            if (option.mpss_flavor == MPSS_FLAVOR) {
                                targets.add(option.target);
                            }
                        }
                        return targets;
                    '''
                ]
            ]
        ],
        [$class: 'CascadeChoiceParameter', choiceType: 'PT_SINGLE_SELECT', description: 'Build Command', 
            filterLength: 1, filterable: true, 
            name: 'BUILD_CMD', randomName: 'choice-parameter-11980967122105', 
            referencedParameters: 'TARGET,MPSS_FLAVOR',
            script: [
                $class: 'GroovyScript', 
                fallbackScript: [classpath: [], sandbox: false, script: 'return ["ERROR"]'], 
                script: [
                    classpath: [], sandbox: false, 
                    script: '''
                        import groovy.json.JsonSlurperClassic;
                        def json = new File("TEST_JSON.json").text;
                        def data = new JsonSlurperClassic().parseText(json);
                        build_cmds = [];
                        for (option in data.options) {
                            if ((option.mpss_flavor == MPSS_FLAVOR) && (option.target == TARGET)) {
                                build_cmds.addAll(option.build_commands);
                            }
                        }
                        return build_cmds;
                    '''
                ]
            ]
        ]
    ])
])

以下 JSON 文件包含配置

    {
    "test": "TEST STRING FROM JSON",
    "options": [
        {
            "mpss_flavor": "MPSS1",
            "target": "TARGET1",
            "build_commands": [
                "BUILD_COMMAND_1"
            ]
        },
        {
            "mpss_flavor": "MPSS2",
            "target": "TARGET2",
            "build_commands": [
                "BUILD_COMMAND_2",
                "BUILD_COMMAND_3"
            ]
        }
    ]
}

我想在更新 JOSN 文件时自动配置作业的参数(我完全清楚 JSON 更新后运行的第一个作业不会包含预期的更改,但这对我们来说没问题)。 MPSS_FLAVORTARGET 按预期显示值。但是 BUILD_CMD Choice 参数返回错误。当我在命令行中使用静态定义的MPSS_FLAVORTARGET 运行常规脚本代码时,脚本工作正常并且返回的build_cmds 符合预期。但是通过 Jenkins UI 它显示为 ERROR (Fallback Script)

我已经尝试了几次迭代,但都没有成功。我确信有一个小错误,我可以弄清楚。

我的问题是有什么方法可以查看用于选择参数以隔离问题的脚本的打印日志。

更新 相同的代码适用于 Job 中定义的 Jenkins 文件。问题似乎特定于托管 Jenkins 文件

【问题讨论】:

    标签: jenkins groovy


    【解决方案1】:

    只需使用 try-catch 包装脚本

    try{
       ...your parameter script here
    }catch(Throwable t){
        return [t.toString()]
    }
    

    在这种情况下,您将看到错误作为参数值

    【讨论】:

    • Daggett,我尝试了您的建议,但仍然看到空字符串。请参阅更新以进行进一步的实验
    • 如果您没有看到任何错误 - 文件+代码中的问题。会不会是那个文件是 utf-32 格式的?或包含一些特殊的标头(例如 utf-8 BOM)
    猜你喜欢
    • 2017-07-23
    • 2013-04-09
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多