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



我需要接受所有类型的全局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值确实存在
  • 第二个回波是输入的实际样子
  • 第三个回波应该发出CCD_ 3,而我得到了异常

有什么想法吗?我已经花了几个小时了:-(

您可能需要检查:groovy:有一个字段名,需要设置值和don';我不想使用交换机

第一种变体

如果您有: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}”

在普通的groovy中,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')

这将把作业的名称(MyJob(打印到控制台,假设您已经将MyParameter参数设置为JOB_NAME。两个断言都将通过。

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

在尝试了所有这些解决方案后,发现这适用于我的问题(听起来与所问的问题非常相似-但不完全确定(:

${env[REPOSITORY_NAME]}

最新更新