如何在Jenkinsfile中进行字符串到整数转换?

时间:2017-04-26 00:38:23

标签: jenkins jenkins-pipeline

我的Jenkins文件中有以下内容:

pipeline {
    agent none
    environment {
        timeout_mins = 1
    }
    options {
        timeout(time: "${env.timeout_mins}", unit: 'MINUTES')
    }
    stages {
        stage("test print") {
            steps {
                echo "timeout_mins: ${env.timeout_mins}"
                sh "sleep 120"
            }
        }
    }
}

我想在多个地方重用诸如timeout_mins之类的环境参数,但是对于某些插件,需要在某些地方将其转换为整数。我通过上面的例子得到的错误如下:

org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty的处理环境 java.lang.IllegalArgumentException:无法为TimeoutStep实例化{time = null,unit = MINUTES}(时间:int,单位?:TimeUnit [NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS]):java.lang。 ClassCastException:org.jenkinsci.plugins.workflow.steps.TimeoutStep.time需要int但是收到类java.lang.String     at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:264)     在org.jenkinsci.plugins.workflow.steps.StepDescriptor.newInstance(StepDescriptor.java:194)     在org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:181)     在org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:126)     在org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:108)     在org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)     在org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)     在org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)     在com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:18)     在

有没有办法在Jenkinsfile中将String转换为int?

我试过了 time: env.timeout_mins,但会产生空值。

time: ${env.timeout_mins},收益率: WorkflowScript:7:方法调用参数@第7行,第23列。            超时(时间:$ {env.timeout_mins},单位:'分钟')

time: ${env.timeout_mins}.toInteger(),与上述相同

time: ${env.timeout_mins.toInteger()},与上述相同

我可以尝试其他任何事情吗?

3 个答案:

答案 0 :(得分:2)

这不是转换失败,只是你不能在选项块中引用环境变量。

这也失败了(nullpointer异常):

~]#  rpm -qlp \
     http://mirror.centos.org/centos-7/7/os/x86_64/Packages/centos-release-7-3.1611.el7.centos.x86_64.rpm 2>/dev/null | grep repo
/etc/yum.repos.d/CentOS-Base.repo
/etc/yum.repos.d/CentOS-CR.repo
/etc/yum.repos.d/CentOS-Debuginfo.repo
/etc/yum.repos.d/CentOS-Media.repo
/etc/yum.repos.d/CentOS-Sources.repo
/etc/yum.repos.d/CentOS-Vault.repo
/etc/yum.repos.d/CentOS-fasttrack.repo

这有效:

pipeline {
    agent none
    environment {
        timeout_mins = 'MINUTES'
    }
    options {
        timeout(time: 1, unit: env.timeout_mins)
    }
    stages {
        stage("test print") {
            steps {
                echo "timeout_mins: ${env.timeout_mins}"
                sh "sleep 120"
            }
        }
    }
}

答案 1 :(得分:1)

正如@burnettk所说,这是对options块的限制。这不是最优雅的方法,但是您可以使用超时作为步骤,例如

pipeline {
    agent none
    environment {
        timeout_mins = 1
    }
    stages {
        stage("test print") {
            steps {
                timeout(time: env.timeout_mins.toInteger(), unit: 'MINUTES') {
                    echo "timeout_mins: ${env.timeout_mins}"
                    sh "sleep 120"
                }
            }
        }
    }
}

答案 2 :(得分:0)

对于那些试图使用更优雅的解决方案的人,您可以存储一个参数,将其转换为整数并将其用作选项设置。这对我来说很好用。

def TIME_OUT = params.TEST_DURATION.toInteger() + 900

pipeline {
    options {
        //get duration in seconds
        timeout(time: TIME_OUT, unit: 'SECONDS') 
    }