ScriptRunner for Bitbucket合并检查:关联Jira含阻塞任务时阻止合并的配置问题
解决方案:基于Scriptrunner for Bitbucket的Jira阻塞任务合并检查
一、问题根源说明
Scriptrunner for Bitbucket Server 7.x版本已不再支持直接导入Jira的ComponentAccessor类,必须通过AppLinks调用Jira REST API的方式实现跨系统访问,这是你之前出现类无法解析错误的核心原因。
二、核心步骤实现
1. 提取合并分支关联的Jira Issue ID
Bitbucket的PR标题或提交信息中通常包含Jira Issue Key(格式如PROJ-123),可通过Scriptrunner上下文对象提取:
// 匹配Jira Issue Key的正则(大写字母+连字符+数字) def extractJiraKeys(String text) { def pattern = ~/([A-Z]+-\d+)/ def matcher = pattern.matcher(text) return matcher.findAll().unique() } // 从PR上下文获取关联的Jira Key def pullRequest = context.pullRequest def jiraKeys = [] // 优先从PR标题提取 jiraKeys.addAll(extractJiraKeys(pullRequest.title)) // 标题无匹配则遍历提交信息提取 pullRequest.commits.each { commit -> jiraKeys.addAll(extractJiraKeys(commit.message)) } jiraKeys = jiraKeys.unique() if (jiraKeys.isEmpty()) { // 无关联Jira时的逻辑:返回true允许合并,如需强制关联则返回false并设置提示 return true }
2. 通过AppLinks检查Jira阻塞任务
使用Scriptrunner的AppLinkHttpClient调用Jira API,查询Issue的阻塞关联关系:
import com.adaptavist.sr.bitbucket.applinks.AppLinkHttpClient import com.atlassian.applinks.api.ApplicationLink import com.atlassian.applinks.api.ApplicationLinkService import com.atlassian.sal.api.component.ComponentLocator // 获取已配置的Jira AppLink def applicationLinkService = ComponentLocator.getComponent(ApplicationLinkService) ApplicationLink jiraAppLink = applicationLinkService.getPrimaryApplicationLink(com.atlassian.jira.bc.project.ProjectService.class) if (!jiraAppLink) { return false // 未配置Jira AppLink时阻止合并,可按需调整 } // 初始化AppLink客户端 def httpClient = new AppLinkHttpClient(jiraAppLink) def hasBlockingIssues = false // 遍历每个关联的Jira Issue检查阻塞状态 jiraKeys.each { key -> def response = httpClient.get("/rest/api/3/issue/${key}/link") if (response.statusCode == 200) { def links = new groovy.json.JsonSlurper().parseText(response.body) // 查找类型为"Blocks"的关联(需确认你的Jira实例中阻塞链接的实际名称) def blockingLinks = links.findAll { link -> link.type.name == "Blocks" && link.outwardIssue } if (!blockingLinks.isEmpty()) { hasBlockingIssues = true } } else { // API调用失败时默认阻止合并,可按需改为日志记录放行 hasBlockingIssues = true } } // 返回检查结果:存在阻塞任务则阻止合并 if (hasBlockingIssues) { context.setErrorMessage("关联的Jira Issue存在未解决的阻塞任务,无法合并") return false } return true
3. 配置合并检查
- 进入Bitbucket项目设置 > 合并检查
- 添加Scriptrunner合并检查,选择「自定义脚本」类型
- 将上述完整脚本粘贴后保存配置
三、注意事项
- 确保Bitbucket与Jira已正确配置AppLinks,且脚本使用的账号拥有访问Jira Issue链接的权限
- Jira的阻塞链接类型名称可能不是默认的"Blocks",需在Jira设置 > 问题 > 链接类型中确认实际名称
- 可根据团队需求调整无关联Jira时的处理逻辑(比如强制要求PR必须关联Jira才能合并)
内容的提问来源于stack exchange,提问作者piper2200s
相关产品推荐
相关产品推荐

