禅道开源版 22.3.stable 的重点不在炫目的新功能,而在一个很实际的工程问题:Jira 数据 API 导入机制被优化了。根据发布摘要,新版本将 Jira 项目获取接口改为临时数据存储,并对 Jira 构建获取等导入链路做了优化,同时修复了一批已知 Bug。对正在从 Jira 迁移或做双系统同步的团队来说,这类改动通常比一个新按钮更重要。
为什么 Jira 导入机制值得单独看
Jira API 导入看起来只是“从 A 系统拉数据到 B 系统”,实际落地时会遇到几个老问题:
- Jira 项目、问题、构建等对象之间有关联,导入顺序不能乱。
- API 调用容易受分页、限流、网络波动影响。
- 一次导入失败后,如果没有中间状态,往往只能重跑整批任务。
- 大项目迁移时,直接边拉边写会把失败点藏在很深的流程里。
这次摘要里提到“将 Jira 项目获取的接口改为临时数据存储”,这个方向很明确:先把外部 API 返回的数据落到一个可控的中间层,再进入禅道内部导入流程。这样做的好处是,失败可以定位,数据可以复查,重试可以更细。
临时数据存储带来的工程收益
把 Jira 项目获取结果先存起来,不只是“缓存一下”这么简单。它改变的是导入链路的可观测性和可恢复性。
一个典型的旧链路可能是:
Jira API -> 解析 -> 写入禅道项目/产品/任务
优化后的思路更接近:
Jira API -> 临时数据 -> 校验/映射 -> 写入禅道
中间多出来的“临时数据”让团队有机会做三件事:
- 在写入前检查 Jira 返回值是否完整。
- 对项目 Key、用户、状态、构建信息做映射预处理。
- 导入失败后从临时数据继续,而不是重新打 Jira API。
这对大型 Jira 实例尤其关键。Jira 里一个项目可能挂着大量 issue、版本、构建、用户和自定义字段,直接导入很容易因为某个字段不兼容而中断。临时数据层可以把“外部系统不稳定”和“内部数据写入失败”拆开处理。
可以这样实践:先把 Jira 项目数据落地再导入
下面示例不是禅道官方接口说明,而是一个可改造的迁移前检查脚本。它模拟 22.3.stable 这类“先临时存储,再处理导入”的思路:从 Jira REST API 拉取项目列表,保存为本地 JSON 文件,然后生成一个简化的导入清单。
运行前需要修改:
JIRA_BASE_URL:你的 Jira 地址。JIRA_EMAIL:Jira 账号邮箱或用户名。JIRA_API_TOKEN:Jira API Token 或密码,取决于你的 Jira 部署方式。
#!/usr/bin/env bash
set -euo pipefail
: "${JIRA_BASE_URL:?set JIRA_BASE_URL, for example https://jira.example.com}"
: "${JIRA_EMAIL:?set JIRA_EMAIL}"
: "${JIRA_API_TOKEN:?set JIRA_API_TOKEN}"
mkdir -p .jira-import-cache
curl -sS \
-u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \
-H "Accept: application/json" \
"${JIRA_BASE_URL}/rest/api/2/project" \
-o .jira-import-cache/projects.raw.json
jq '[.[] | {
jira_id: .id,
key: .key,
name: .name,
project_type: .projectTypeKey,
lead: (.lead.displayName // null)
}]' \
.jira-import-cache/projects.raw.json \
> .jira-import-cache/projects.normalized.json
jq -r '.[] | [.key, .name, (.lead // ""), .project_type] | @tsv' \
.jira-import-cache/projects.normalized.json
执行方式:
export JIRA_BASE_URL="https://jira.example.com"
export JIRA_EMAIL="dev@example.com"
export JIRA_API_TOKEN="change-me"
bash fetch-jira-projects.sh
这个脚本的价值不在于替代禅道导入器,而是帮助团队在正式导入前回答几个问题:
- Jira 项目数量是否符合预期?
- 项目负责人字段是否能正常读取?
- 项目 Key 是否存在重复映射风险?
- 自定义项目类型是否需要在禅道侧提前建好对应规则?
如果你的迁移流程更复杂,可以把 .jira-import-cache/projects.normalized.json 放进 CI 产物或对象存储中,作为一次迁移任务的快照。
导入前建议做一张映射表
Jira 到禅道的迁移通常不是字段一一搬运。即使导入机制变稳了,团队仍然需要提前处理语义差异。
可以准备一个简单的 YAML 映射文件,把 Jira 项目、状态、用户与禅道目标对象对应起来:
jira_import:
projects:
DEMO:
zentao_product: "演示产品"
zentao_project: "演示项目"
owner: "zhangsan"
OPS:
zentao_product: "运维平台"
zentao_project: "运维平台迭代"
owner: "lisi"
status_mapping:
"To Do": "wait"
"In Progress": "doing"
"Done": "done"
user_mapping:
"alice@example.com": "alice"
"bob@example.com": "bob"
这类文件可以由迁移负责人维护,也可以在导入前由脚本读取。关键是不要把映射规则散落在临时 Excel、聊天记录和个人脚本里。导入机制优化以后,最容易拖后腿的反而是这些不稳定的人工规则。
升级时该关注什么
22.3.stable 属于稳定版更新,发布摘要明确提到 Jira 数据 API 导入机制优化和已知 Bug 修复。准备升级的团队可以按下面清单走:
- 在测试环境先跑一遍 Jira 导入,特别是项目和构建相关数据。
- 对比升级前后的导入结果数量,包括项目、任务、构建、负责人字段。
- 保留 Jira API 原始响应或临时数据快照,方便排查差异。
- 如果已有自定义导入脚本,检查它是否依赖旧的 Jira 项目获取流程。
- 大批量迁移时分批执行,不要把所有项目压进一次任务里。
这次更新的意义在于把 Jira 导入链路往更可控的方向推进。对小团队来说,它能减少迁移时的偶发失败;对大团队来说,它让导入过程更容易拆分、复查和重试。真正上线前,仍然建议用一份真实 Jira 项目数据做演练,确认字段映射和权限模型没有遗漏。