我在字符串中有一个Jenkins全局变量-如何评估它?

时间:2018-07-13 22:56:41

标签: jenkins jenkins-pipeline jenkins-groovy

我需要接受所有类型的全局Jenkins变量作为字符串(基本上是像ansible这样的系统的参数-存储在\vars中的模板)。

def proof = "\"${params.REPOSITORY_NAME}\""
echo proof 
def before = "\"\${params.REPOSITORY_NAME}\""
echo before
def after = Eval.me(before)
echo after

结果是:

[Pipeline] echo
"asfd"
[Pipeline] echo
"${params.REPOSITORY_NAME}"

groovy.lang.MissingPropertyException: No such property: params for class: Script1
  • 第一个回声证明param值确实存在。
  • 第二个回显是输入的实际外观。
  • 第三个回声应该发出了asdf,但我得到了例外。

有什么想法吗?我很忙:-(

2 个答案:

答案 0 :(得分:1)

您可能要检查: groovy: Have a field name, need to set value and don't want to use switch

第一变体

如果您有:xyz="REPOSITORY_NAME"并且想要参数REPOSITORY_NAME的值,则可以简单地使用:

def xyz = "REPOSITORY_NAME"
echo params."$xyz" // will print the value of params.REPOSITORY_NAME

如果变量xyz必须包含完整的字符串,包括params.,则可以使用以下解决方案

@NonCPS
def split(string) {
    string.split(/\./)
}

def xyz = "params.REPOSITORY_NAME"

def splitString = split(xyz)
echo this."${splitString[0]}"."${splitString[1]}"  // will print the value of params.REPOSITORY_NAME

第二变体

如果要指定环境变量名称作为参数,可以使用:

 env.“${params.REPOSITORY_NAME}”

在普通的常规env[params.REPOSITORY_NAME]中可以使用,但是在管道中,此功能在沙盒中不能使用。

这样,您首先要检索REPOSITORY_NAME的值,然后将其用作环境变量的键。

直接使用env.REPOSITORY_NAME不同于尝试使用REPOSITORY_NAME本身作为密钥。

例如说您有一个名为MyJob的工作,其脚本如下:

assert(params.MyParameter == "JOB_NAME")
echo env."${params.MyParameter}"
assert(env."${params.MyParameter}" == 'MyJob')

这将在您将MyParameter参数设置为JOB_NAME的情况下将作业的名称(MyJob)打印到控制台。这两个断言都会通过。

如果您要检索该节点的环境,请不要忘记先打开一个node{}块。

答案 1 :(得分:0)

尝试了所有这些解决方案后,发现这可以解决我的问题(听起来与所问的问题非常相似-尽管不确定):

${env[REPOSITORY_NAME]}