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

使用ScriptRunner在Jira生成问题链接遇issueLinkType错误求助

Jira自动化规则生成问题链接报错:issueLinkType不正确的解决方案

问题描述

我在Jira中配置了一个点击按钮触发的自动化规则,尝试生成问题链接,但执行时报错提示issueLinkType不正确,请问如何确定所需的正确问题链接类型?

错误截图

错误截图

现有Groovy代码

package SuperFeature
import com.atlassian.jira.bc.project.component.ProjectComponent
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.Issue
import org.apache.log4j.Logger
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.util.ImportUtils
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.index.IssueIndexManager
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.index.IssueIndexingService

def log = Logger.getLogger('atlassian-jira.log')

log.warn("MOUNA: ")

log.warn("MOUNA COMPONENT NUMBERS : "+ issue.getComponents().size())

List<String> componentList = new ArrayList<String>()

def authenticationContext = ComponentAccessor.jiraAuthenticationContext

if (issue.getComponents().size()==0){
    issue.update {
    String text= "Issue does not have any components\n"
    setCustomFieldValue('Execution Summary', text)
    }
}else if(issue.getFixVersions().size()==0){
            issue.update {
                String text= "Issue does not have any fix versions\n"
                setCustomFieldValue('Execution Summary', text)
                }
    
}
else{
        int componentSize=issue.getComponents().size()
        for(ProjectComponent component : issue.getComponents()) {
                componentList.add(component.getName())
        }
        issue.update {
            String text= "The super feature "+issue+" will be split into "+componentSize+
            " features, one for each component:\n"
            for(String component: componentList){
                text = text +"-"+ component+"\n"; 
            }
            setCustomFieldValue('Execution Summary', text)
}
// Issue issue

def issueManager = ComponentAccessor.issueManager

def issueFactory = ComponentAccessor.issueFactory

def subTaskManager = ComponentAccessor.subTaskManager

def issueLinkManager = ComponentAccessor.issueLinkManager

def userManager = ComponentAccessor.userManager

// Defining subtask

def newIssue = issueFactory.getIssue()

newIssue.setParentId(issue.getId())

log.warn("MOUNA CAMELIA issue.getId()"+ issue.getId())

def Long issueLinkType = new Long (10001)

def Long sequence = new Long (1)

newIssue.setProjectObject(issue.getProjectObject())

newIssue.setSummary("MOUNA CAMELIA")

newIssue.setAssignee(userManager.getUserByName("mouh"))

newIssue.setDescription(issue.getDescription())

                for(String component: componentList){
                    def subTask = issueManager.createIssueObject(authenticationContext.getLoggedInUser(), newIssue)
                    subTaskManager.createSubTaskIssueLink(issue, subTask, authenticationContext.getLoggedInUser())
                    issueLinkManager.createIssueLink(issue.getId(), newIssue.getId(), issueLinkType, sequence, authenticationContext.getLoggedInUser())
        }
}

解决方法

1. 获取正确的issueLinkType ID

有两种方式可以获取Jira系统中可用的问题链接类型ID:

方式一:通过Jira后台管理页面查看

  • 登录Jira管理员账号,点击右上角齿轮图标进入设置
  • 选择问题 > 问题链接类型
  • 找到你需要的链接类型(比如「包含」「被包含」「关联」等),点击该类型的「编辑」按钮
  • 查看浏览器地址栏,地址中会包含issueLinkTypeId=XXX,其中的XXX就是该链接类型的ID

方式二:在脚本中添加调试代码获取

在你的Groovy脚本中加入以下代码,执行后查看Jira日志(atlassian-jira.log)即可看到所有链接类型的名称和对应ID:

// 添加在脚本开头的import之后
import com.atlassian.jira.issue.link.IssueLinkTypeManager

// 在需要调试的位置添加
def issueLinkTypeManager = ComponentAccessor.getComponent(IssueLinkTypeManager)
def allLinkTypes = issueLinkTypeManager.getIssueLinkTypes()
allLinkTypes.each { linkType ->
    log.warn("问题链接类型:名称=${linkType.name}, ID=${linkType.id}")
}

2. 修正代码中的issueLinkType值

将代码中def Long issueLinkType = new Long (10001)这一行的数字替换为你实际获取到的正确ID即可。

注意:问题链接类型是有方向的,比如「包含」和「被包含」是两个不同的ID,要根据你的业务需求选择正确的方向。

3. 额外代码优化提示

你的代码中存在逻辑问题:

  • 在循环创建子任务时,始终复用同一个newIssue对象,会导致所有子任务的属性完全一致
  • 子任务通过subTaskManager.createSubTaskIssueLink已经和父任务建立了关联,无需再调用issueLinkManager.createIssueLink创建额外链接,这会造成重复关联或错误

建议修改循环内的代码,每次循环重新创建新的MutableIssue对象:

for(String component: componentList){
    // 每次循环重新实例化子任务对象
    def newSubTask = issueFactory.getIssue()
    newSubTask.setParentId(issue.getId())
    newSubTask.setProjectObject(issue.getProjectObject())
    newSubTask.setSummary("MOUNA CAMELIA - ${component}") // 给子任务添加组件名称区分
    newSubTask.setAssignee(userManager.getUserByName("mouh"))
    newSubTask.setDescription(issue.getDescription())
    
    def subTask = issueManager.createIssueObject(authenticationContext.getLoggedInUser(), newSubTask)
    subTaskManager.createSubTaskIssueLink(issue, subTask, authenticationContext.getLoggedInUser())
    // 若不需要额外的问题链接,删除下面这行
    // issueLinkManager.createIssueLink(issue.getId(), subTask.getId(), issueLinkType, sequence, authenticationContext.getLoggedInUser())
}

内容的提问来源于stack exchange,提问作者منى

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:47:48