Jenkins参数与脚本内部定义的变量行为不同

41次阅读
没有评论

问题描述

在Jenkins作业中设置了一个参数payload,并将其值设置为test\ntest。用户的Jenkins脚本如下所示:

def hardset = "test\ntest"
echo "param:"
def cleanParam = jenkinsParam.replaceAll("[\\n\\t ]","Yes");
echo cleanParam
echo "----------"
echo "hardset:"
def cleanHardset = hardset.replaceAll("[\\n\\t ]","Yes");
echo cleanHardset

输出结果如下(为了简化,删除了Jenkins流水线的输出):

test\ntest
param:test\ntest
----------
hardset:testYestest

用户想知道为什么读取Jenkins参数和在脚本中设置参数有所不同。

实际上,用户试图替换来自Lambda负载的麻烦的\n,但这给他的计划带来了麻烦。

用户尝试在脚本中使用def hardsetParam = jenkinsParam来设置参数,但不幸的是,这似乎也不起作用。

回答中提到,用户可以尝试使用echo hardset来查看其行为是否与回答中所述相似。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据回答中提到的情况,jenkinsParam存储的是转义特殊字符后的输出。实际上,jenkinsParam的值是"test\\ntest",而不是用户所期望的"test\ntest"

为了替换存储在jenkinsParam中的payload(即第二种情况的行为),需要将字符串中的完整\\n替换为另一个字符。以下是一个示例:

output = jenkinsParam.replaceAll('\\\\n', 'yes')
print output

在上面的示例中,我们使用replaceAll函数将字符串中的\\n替换为yes。这将输出testyestest

请注意,由于Groovy中的字符串转义规则,我们需要使用\\\\n来匹配\\n

方案2

请注意以下操作注意版本差异及修改前做好备份。
另一种方法是使用正则表达式替换字符串中的\n。以下是一个示例:

output = jenkinsParam.replaceAll(/\\n/, 'yes')
print output

在上面的示例中,我们使用正则表达式/\\n/将字符串中的\n替换为yes。这将输出testyestest

请注意,正则表达式中的\需要使用\\进行转义。

以上是两种替换\n的方法,你可以根据自己的需求选择其中一种。

希望这些解决方案能帮助到你!

正文完