我正在创建一个jenkins文件,我需要将一个文件名的一部分存储在一个变量中,以检查它是否有一个单词。例如,如果名称是:project-x.y.z-TEST.ext我想知道它是否以-TEST结尾。从bash中,这将返回TEST字(如果它在名称中):
$(echo ${$(ls - b *.ext | head -1)##*-} | cut -f 1 -d '.')
但是我无法将它存储在我的jenkinsfile中的变量中(或者不知道如何)。还有其他方法可以在jenkins文件中检查这个吗?
答案 0 :(得分:1)
在字符串上执行正则表达式并将捕获存储在变量中的语法是:
var = string =~ /regex/
例如,使用您想要将捕获存储在变量中的字符串project-x.y.z-TEST.ext
的示例,我们可以这样做:
var = 'project-x.y.z-TEST.ext' =~ /-([A-Z]+)\.ext/
这将返回true
以进行成功的正则表达式检查,然后捕获TEST
。然后将字符串TEST
分配给变量var
。
如果文件名字符串已分配给变量filename
,我们会改为:
var = filename =~ /-([A-Z]+)\.ext/
但是,由于您所述的原始问题仅仅是检查文件名是否包含字符串,因此您可能真正想要检查文件名中的字符串并存储布尔结果。这不是存储字符串的那一部分,而是在以后执行相等的条件检查。在这种情况下,您真正需要的只是:
test = filename =~ /-TEST\.ext/
并且test会存储true
以供将来使用。
这里需要注意三个重要事项:
您需要针对特定用例微调正则表达式及其关联的捕获。根据您的预期匹配和检查,使其更贪婪或更具限制性。我只使用了一个给出的一般例子。
变量var
和test
需要在您上次使用后立即分配到null
。它是不可序列化的,因此如果Jenkins管道在上次使用后仍然存在,则会导致错误。例如:
var = filename =~ /-([A-Z]+)\.ext/
print "Using ${var} for the first time."
print "Using ${var} for the last time."
var = null
对于声明性语法管道,这些代码示例需要嵌套在script {}
块中。