如何原生克隆包含子任务的Jira Epic?
原生Jira克隆带子任务的Epic方案
以下是几种无需第三方插件的原生实现方式:
1. 手动批量克隆(适合偶尔操作)
- 克隆Epic主任务:打开目标Epic,点击右上角「更多」→「克隆」,填写新Epic的名称、描述等信息,完成克隆得到新Epic。
- 批量克隆子任务:回到原Epic的子任务列表,选中所有需要复制的子任务,点击「批量操作」→「克隆」,在弹窗中将新子任务的「父任务」设置为刚创建的新Epic,按需选择是否复制评论、附件等附加内容。
2. Jira Automation自动化规则(适合重复操作)
通过自动化规则实现一键克隆,云版和服务器版均支持:
- 触发条件:选择「手动触发」,添加待克隆Epic作为输入变量。
- 操作步骤:
- 克隆触发的Epic,将新Epic的Key保存为变量。
- 用JQL查询原Epic的所有子任务:
parent = {{triggerIssue.key}} AND issuetype in subtaskIssueTypes() - 遍历查询到的子任务,逐个克隆并设置父任务为新Epic的Key,同时复制需要的字段(如优先级、描述等)。
3. Jira REST API自定义脚本(适合开发集成)
适合有开发能力的场景,通过API实现完整克隆流程:
核心步骤:
- 调用
GET /rest/api/3/issue/{epicKey}获取原Epic的字段数据。 - 调用
POST /rest/api/3/issue创建新Epic,传入原Epic的字段信息(排除ID、Key等系统专属字段)。 - 调用
GET /rest/api/3/search?jql=parent={epicKey} AND issuetype in subtaskIssueTypes()获取所有子任务。 - 遍历子任务,调用
POST /rest/api/3/issue创建新子任务,设置parent字段为新Epic的Key,同步子任务的字段数据。
Python示例代码片段:
import requests from requests.auth import HTTPBasicAuth # 配置信息 JIRA_INSTANCE = "你的Jira实例地址" API_TOKEN = "你的API令牌" USER_EMAIL = "你的登录邮箱" SOURCE_EPIC_KEY = "原Epic的Key" # 创建新Epic epic_detail = requests.get( f"{JIRA_INSTANCE}/rest/api/3/issue/{SOURCE_EPIC_KEY}", auth=HTTPBasicAuth(USER_EMAIL, API_TOKEN) ).json() new_epic_data = { "fields": { "project": {"key": epic_detail["fields"]["project"]["key"]}, "summary": f"克隆: {epic_detail['fields']['summary']}", "description": epic_detail["fields"]["description"], "issuetype": {"id": epic_detail["fields"]["issuetype"]["id"]}, # 按需添加其他字段(如优先级、标签) } } new_epic_response = requests.post( f"{JIRA_INSTANCE}/rest/api/3/issue", json=new_epic_data, auth=HTTPBasicAuth(USER_EMAIL, API_TOKEN) ) new_epic_key = new_epic_response.json()["key"] # 克隆子任务 subtasks = requests.get( f"{JIRA_INSTANCE}/rest/api/3/search?jql=parent={SOURCE_EPIC_KEY} AND issuetype in subtaskIssueTypes()", auth=HTTPBasicAuth(USER_EMAIL, API_TOKEN) ).json()["issues"] for subtask in subtasks: new_subtask_data = { "fields": { "project": {"key": subtask["fields"]["project"]["key"]}, "summary": f"克隆: {subtask['fields']['summary']}", "description": subtask["fields"]["description"], "issuetype": {"id": subtask["fields"]["issuetype"]["id"]}, "parent": {"key": new_epic_key}, # 按需添加其他字段 } } requests.post( f"{JIRA_INSTANCE}/rest/api/3/issue", json=new_subtask_data, auth=HTTPBasicAuth(USER_EMAIL, API_TOKEN) )
内容的提问来源于stack exchange,提问作者paragbaxi
相关产品推荐
相关产品推荐

