You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 配置合并检查

  1. 进入Bitbucket项目设置 > 合并检查
  2. 添加Scriptrunner合并检查,选择「自定义脚本」类型
  3. 将上述完整脚本粘贴后保存配置

三、注意事项

  • 确保Bitbucket与Jira已正确配置AppLinks,且脚本使用的账号拥有访问Jira Issue链接的权限
  • Jira的阻塞链接类型名称可能不是默认的"Blocks",需在Jira设置 > 问题 > 链接类型中确认实际名称
  • 可根据团队需求调整无关联Jira时的处理逻辑(比如强制要求PR必须关联Jira才能合并)

内容的提问来源于stack exchange,提问作者piper2200s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:39:53