使用Scriptrunner创建Jira问题并关联已有Epic失效求助
问题分析与修复方案
你的代码里关联Epic失效主要有3个核心错误,同时还有几处小问题,下面逐一说明并修正:
错误点1:Epic链接字段查找错误
你用epicIssueKey(也就是'test')去查找自定义字段,但Epic链接是系统自带的自定义字段,默认字段名是"Epic Link",你应该根据这个字段名查找,而不是用Epic的issue key。
错误点2:设置Epic链接的方式错误
在IssueInputParameters的闭包里,你调用了issue.setCustomFieldValue(),但这里根本不存在issue对象。正确的做法是用IssueInputParameters提供的setCustomFieldValue()方法,并且需要传入目标Epic的Issue对象(或Epic的ID),而不是只传字段本身。
错误点3:状态设置的变量错误
你写了setStatusId(statusId),但statusId变量从未定义,应该用前面获取的status.id。另外注意:创建issue时的状态受项目工作流限制,不是所有状态都能直接设置,建议先确认工作流是否允许创建时设置该状态。
修正后的完整代码
import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.context.IssueContextImpl import com.atlassian.jira.issue.fields.config.manager.PrioritySchemeManager def date = new Date() // 配置参数 final projectKey = 'SEC' final statusKey = 'AN QUE' final issueTypeName = 'Task' final reporterKey = 'MV108788' final summary = 'test' + date final priorityName = 'Low' final description = 'this is a description' final epicIssueKey = 'TEST-123' // 替换成实际的Epic issue key def issueService = ComponentAccessor.issueService def constantsManager = ComponentAccessor.constantsManager def loggedInUser = ComponentAccessor.jiraAuthenticationContext.loggedInUser def prioritySchemeManager = ComponentAccessor.getComponent(PrioritySchemeManager) def customFieldManager = ComponentAccessor.customFieldManager def issueManager = ComponentAccessor.issueManager // 1. 获取Epic链接字段(默认字段名是"Epic Link") def epicLinkCustomField = customFieldManager.getCustomFieldObjects().findByName("Epic Link") assert epicLinkCustomField : "未找到Epic Link字段" // 2. 获取目标Epic的Issue对象 def epicIssue = issueManager.getIssueObject(epicIssueKey) assert epicIssue : "未找到key为$epicIssueKey的Epic" // 3. 获取状态 def status = constantsManager.getStatusByName(statusKey) assert status : "未找到状态$statusKey" // 4. 获取项目 def project = ComponentAccessor.projectManager.getProjectObjByKey(projectKey) assert project : "未找到项目$projectKey" // 5. 获取问题类型 def issueType = constantsManager.allIssueTypeObjects.findByName(issueTypeName) assert issueType : "未找到问题类型$issueTypeName" // 6. 获取报告人 def reporter = ComponentAccessor.userManager.getUserByKey(reporterKey) ?: loggedInUser // 7. 获取优先级ID def issueContext = new IssueContextImpl(project, issueType) def priority = constantsManager.priorities.findByName(priorityName) ?: prioritySchemeManager.getDefaultOption(issueContext) def priorityId = priority?.id // 构建Issue输入参数 def issueInputParameters = issueService.newIssueInputParameters().with { // 修复状态设置的变量错误 if (status) setStatusId(status.id) setProjectId(project.id) setDescription(description) setIssueTypeId(issueType.id) setReporterId(reporter.name) setSummary(summary) if (priorityId) setPriorityId(priorityId) // 正确设置Epic链接:传入字段和Epic对象 setCustomFieldValue(epicLinkCustomField, epicIssue) return it } // 验证并创建Issue def validationResult = issueService.validateCreate(loggedInUser, issueInputParameters) assert validationResult.valid : validationResult.errorCollection def result = issueService.create(loggedInUser, validationResult) assert result.valid : result.errorCollection
额外说明
- 务必将
epicIssueKey替换成你实际要关联的Epic的issue key(比如TEST-123) - 如果你的Epic链接字段名不是默认的"Epic Link",需要改成你系统中对应的字段名
- 若状态设置仍失效,建议检查项目工作流配置,确认该问题类型在创建环节是否允许设置目标状态
内容的提问来源于stack exchange,提问作者Mikeshift
相关产品推荐
相关产品推荐

