使用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,提问作者منى
相关产品推荐
相关产品推荐

