我正在尝试使用Jenkins管道中的groovy检查git中的commit-msg
是否包含特定的凭单编号,其项目密钥为Jira
def string_array = ['CO', 'DEVOPSDESK', 'SEC', 'SRE', 'SRE00IN', 'SRE00EU', 'SRE00US', 'REL']
def string_msg = 'CO-10389, CO-10302 new commit'
要提取数字,我正在使用以下逻辑。
findAll( /\d+/ )*.toInteger()
不确定如何使用项目密钥提取确切的凭单号码。 预先感谢。
答案 0 :(得分:1)
您可以将Groovy的find运算符-=~
与findAll()
方法结合使用以提取所有匹配的元素。为此,您可以创建与CO-\d+
或DEOPSDESK-\d+
OR ...匹配的模式,依此类推。您可以将项目ID保留在列表中,然后动态创建正则表达式模式。
请考虑以下示例:
def projectKeys = ['CO', 'DEVOPSDESK', 'SEC', 'SRE', 'SRE00IN', 'SRE00EU', 'SRE00US', 'REL']
def commitMessage = 'CO-10389, CO-10302 new commit'
// Generate a pattern "CO-\d+|DEVOPSDEKS-\d+|SEC-\d+|...
def pattern = projectKeys.collect { /${it}-\d+/ }.join("|")
// Uses =~ (find) operator and extracts matching elements
def jiraIds = (commitMessage =~ pattern).findAll()
assert jiraIds == ["CO-10389","CO-10302"]
// Another example
assert ("SEC-1,REL-2001 some text here" =~ pattern).findAll() == ["SEC-1","REL-2001"]
答案 1 :(得分:0)
正则表达式可以更简单地组装:
def projectKeys = ['CO', 'DEVOPSDESK', 'SEC', 'SRE', 'SRE00IN', 'SRE00EU', 'SRE00US', 'REL']
def commitMessage = 'CO-10389, REL-10302 new commit'
String regex = /(${projectKeys.join('|')})-\d+/
assert ['CO-10389', 'REL-10302'] == (commitMessage =~ regex).findAll()*.first()
您还可以选择另一个比匹配更精细的选项:
def res = []
commitMessage.eachMatch( regex ){ res << it[ 0 ] }
assert ['CO-10389', 'REL-10302'] == res