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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:30:42