Jenkins groovy 提交消息中的正则表达式模式搜索和匹配未按预期工作
Jenkins groovy regex pattern search and match in commit message not working as expected
我正在使用此管道,其中 运行来自提交消息的宁测试应该是一个选项。
我是 groovy 和正则表达式的新手,但我已经设法从提交消息中获得匹配项并且 运行 我的测试可以正常进行。唯一的问题是,commit message 里不能再写别的,否则就失败了。
我希望能够在提交消息中的几乎任何位置编写我想要的测试 运行。或者可能作为顶部的第一件事,然后是其余的消息。
提交消息可能看起来像..
jenkins:BASE_TEST, RADIO_TEST, CRYPTO_TEST
blablabla
我的脚本如下所示:
def testPattern = ~/(?:^|[\r\n]+)jenkins:([, a-zA-Z_]+)(?:$|[\r\n]+)/
for (int i = 0; i < currentBuild.changeSets.size(); i++)
{
//entries -> author, timestamp, msg etc.
def entries = currentBuild.changeSets[i].items
for (int j = 0; j < entries.length; j++)
{
def testMatcher = testPattern.matcher(entries[j].msg)
if (testMatcher.matches())
{
def testList = testMatcher.group(1).tokenize(',')
for (int k = 0; k < testList.size(); k++)
{
testList[k] = testList[k].replaceAll("\s", "")
switch (testList[k])
{
case 'RUN_ALL_TESTS':
env.SPREADING_FACTOR_TEST = true
env.RADIO_TEST = true
env.BASE_TEST = true
env.DEVELOP_TEST = true
env.CRYPTO_TEST = true
break
case 'SPREADING_FACTOR_TEST':
env.SPREADING_FACTOR_TEST = true
break
case 'RADIO_TEST':
env.RADIO_TEST = true
break
case 'BASE_TEST':
env.BASE_TEST = true
break
case 'DEVELOP_TEST':
env.DEVELOP_TEST = true
break
case 'CRYPTO_TEST':
env.CRYPTO_TEST = true
break
default:
break
}
}
}
}
}
我曾尝试以多种方式在 testPattern 中设置多行,但我可能做错了。我用了很多时间在:
https://regex101.com/r/43se9W/1
regex101 example
在 regex101 中它显然匹配没有问题,但我的 testMatcher.matches() returns 错误。因此问题是它无法匹配。
我试过查看 https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#compile(java.lang.String) 但也许我执行错了。
显然您需要使用 find() 方法而不是 matches(),呃..现在可以使用了。
我正在使用此管道,其中 运行来自提交消息的宁测试应该是一个选项。
我是 groovy 和正则表达式的新手,但我已经设法从提交消息中获得匹配项并且 运行 我的测试可以正常进行。唯一的问题是,commit message 里不能再写别的,否则就失败了。
我希望能够在提交消息中的几乎任何位置编写我想要的测试 运行。或者可能作为顶部的第一件事,然后是其余的消息。
提交消息可能看起来像..
jenkins:BASE_TEST, RADIO_TEST, CRYPTO_TEST
blablabla
我的脚本如下所示:
def testPattern = ~/(?:^|[\r\n]+)jenkins:([, a-zA-Z_]+)(?:$|[\r\n]+)/
for (int i = 0; i < currentBuild.changeSets.size(); i++)
{
//entries -> author, timestamp, msg etc.
def entries = currentBuild.changeSets[i].items
for (int j = 0; j < entries.length; j++)
{
def testMatcher = testPattern.matcher(entries[j].msg)
if (testMatcher.matches())
{
def testList = testMatcher.group(1).tokenize(',')
for (int k = 0; k < testList.size(); k++)
{
testList[k] = testList[k].replaceAll("\s", "")
switch (testList[k])
{
case 'RUN_ALL_TESTS':
env.SPREADING_FACTOR_TEST = true
env.RADIO_TEST = true
env.BASE_TEST = true
env.DEVELOP_TEST = true
env.CRYPTO_TEST = true
break
case 'SPREADING_FACTOR_TEST':
env.SPREADING_FACTOR_TEST = true
break
case 'RADIO_TEST':
env.RADIO_TEST = true
break
case 'BASE_TEST':
env.BASE_TEST = true
break
case 'DEVELOP_TEST':
env.DEVELOP_TEST = true
break
case 'CRYPTO_TEST':
env.CRYPTO_TEST = true
break
default:
break
}
}
}
}
}
我曾尝试以多种方式在 testPattern 中设置多行,但我可能做错了。我用了很多时间在: https://regex101.com/r/43se9W/1
regex101 example
在 regex101 中它显然匹配没有问题,但我的 testMatcher.matches() returns 错误。因此问题是它无法匹配。
我试过查看 https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#compile(java.lang.String) 但也许我执行错了。
显然您需要使用 find() 方法而不是 matches(),呃..现在可以使用了。