我正在尝试检查来自 git 的commit-msg
是否包含特定的票号,其项目键为Jira
在 Jenkins 管道中使用 groovy
def string_array = ['CO', 'DEVOPSDESK', 'SEC', 'SRE', 'SRE00IN', 'SRE00EU', 'SRE00US', 'REL']
def string_msg = 'CO-10389, CO-10302 new commit'
为了提取数字,我使用以下逻辑。
findAll( /d+/ )*.toInteger()
不确定如何使用项目密钥提取确切的票号。 提前谢谢。
您可以使用Groovy的find运算符-=~
,结合findAll()
方法来提取所有匹配的元素。为此,您可以创建一个与CO-d+
ORDEOPSDESK-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"]
正则表达式可以组装得更简单一些:
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