如何从 Jenkins 文件中的函数正确返回 CRON 字符串或表达式?

问题描述 投票:0回答:1

我试图找到一种方法,根据环境(开发、测试、生产)为 Jenkins 文件中的触发器块选择 cron 表达式

我在 Stack Overflow 上找到了这个:触发器指令上的 Jenkins 管道中的条件

勾选的解决方案帮助我制定了如何设置我自己的代码。然而,每当我运行我创建的代码时,我都会收到以下错误:

hudson.remoting.ProxyException: java.lang.NullPointerException: Cannot invoke "String.split(String)" because "format" is null
    at hudson.scheduler.CronTabList.create(CronTabList.java:111)
    at hudson.scheduler.CronTabList.create(CronTabList.java:99)
    at hudson.triggers.Trigger.<init>(Trigger.java:179)
    at hudson.triggers.TimerTrigger.<init>(TimerTrigger.java:57)
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)

这是我在 Jenkins 管道脚本框中本地使用的代码:

pipeline {
    agent any
    triggers{
        cron( cronExpression = getCronParams() )
    }
...

我的管道块下方的相关函数是:

def getCronParams() {
    withFolderProperties {
        echo "Environment is ${env.ENVIRONMENT}"
        switch ("${env.ENVIRONMENT}") {
            case 'Development':
               echo "Applying Development Area Configuration..."
                return "@midnight"
            case 'Production':
                echo "Applying Production Configuration..."
                return "@midnight"
            default:
                echo "Unknown Environment, unable to handle Environment appropriately, will exit here..."
                break
        }
    }
}

注意:我使用 Jenkins 插件文件夹属性来设置环境变量。

这是使用上述代码运行的完整输出:

[Pipeline] Start of Pipeline
[Pipeline] withFolderProperties
[Pipeline] {
[Pipeline] echo
Applying Production Area Configuration...
[Pipeline] echo
0 0 * * *
[Pipeline] }
[Pipeline] // withFolderProperties
[Pipeline] End of Pipeline
hudson.remoting.ProxyException: java.lang.NullPointerException: Cannot invoke "String.split(String)" because "format" is null
    at hudson.scheduler.CronTabList.create(CronTabList.java:111)
    at hudson.scheduler.CronTabList.create(CronTabList.java:99)
    at hudson.triggers.Trigger.<init>(Trigger.java:179)
    at hudson.triggers.TimerTrigger.<init>(TimerTrigger.java:57)
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)

(如果需要,我可以提供完整的线程转储,但我相信上面的部分是问题所在。)

有人可以帮助解释为什么 CRON 字符串/表达式返回为 null 吗?我在这里缺少什么?

jenkins continuous-integration jenkins-pipeline jenkins-groovy
1个回答
0
投票

我认为该日志不是来自您发布的代码。

echo "Environment is ${env.ENVIRONMENT}"
的输出在哪里?其他字符串也不匹配...如果我不得不猜测您在某些
switch
分支中没有返回任何字符串。就像这里:

            default:
                echo "Unknown Environment, unable to handle Environment appropriately, will exit here..."
                break

最后一个命令是

echo
,它返回
null
,成为隐式返回值。

© www.soinside.com 2019 - 2024. All rights reserved.