Jenkins Pipeline使用正则表达式时如何检测是否存在匹配结果?
错误根因
你使用Groovy的=~正则匹配运算符返回的是Matcher对象,当没有匹配到任何符合规则的内容时,该对象为空集合,直接访问下标[0]就会触发下标越界异常。
解决方案
在访问匹配分组前先判断是否存在匹配结果,Groovy中可以直接将Matcher对象作为布尔判断条件,空Matcher会返回false,参考修改后的代码:
pipeline { agent { node { label 'myApplicationNode' } } environment { GIT_MESSAGE = "${bat(script: "git log --no-walk --format=format:%%s ${GIT_COMMIT}", returnStdout: true)}".readLines().drop(2).join(" ") } stages { stage('get_commit_msg'){ steps { script { def gitmsg=env.GIT_MESSAGE def chngnr = gitmsg =~/([0-9]{1,8})/ // 新增匹配结果判断 if (chngnr) { env.ChangeNr = chngnr[0][1] } else { // 无匹配时可按业务需求处理,示例为设置默认空值 env.ChangeNr = "" // 若要求必须匹配到结果才能继续执行,可主动终止流水线: // error "未从提交信息中提取到符合要求的变更编号" } } } } } }
可选简化写法
如果只需要做简单的默认值赋值,可以用三目运算符简化代码:
env.ChangeNr = chngnr.size() > 0 ? chngnr[0][1] : ""
内容的提问来源于stack exchange,提问作者havmaage
相关产品推荐
相关产品推荐

