2026-10-14 · 原文发布日
站会阻塞项自动转 Jira 工单并跟进
TeamRetro 站会结束时触发,用 n8n Data Table 记录阻塞项与工单的对应关系,自动区分新增、遗留和已解决三类:新增项交给 OpenAI 判断可执行性并生成分类和工单标题,可执行的建 Jira 工单并把链接发到 Slack;遗留项每隔几次站会到 Jira 催办评论,解决后自动销项并留言。
原文要点
原模板在TeamRetro站会完成时触发,用TeamRetro deliveryId忽略重复webhook投递;从n8n Data Table按会议系列加载开放的阻塞项到工单映射,把每条更新分成新增、遗留、已解决。遗留项更新映射并按每隔几次站会到Jira加催办评论;已解决删除映射并在Jira留言;新增项交给OpenAI判断是否可执行并生成分类与Jira可用标题,可执行才建Jira工单、存issueKey与updateId映射,再把链接发到Slack。设置项含jiraUrl、teamChannel、staleAfter、blockerTopic。
这次做成什么
把站会里口头阻塞收敛成可追踪闭环:同一会系只认一张映射表,新增由AI先过筛再建Jira,遗留按节奏催办,解决自动销项。全程用隔离Jira项目、测试Slack频道与合成webhook演练,不接真实团队数据。
准备什么
- 可配置integration webhook的TeamRetro工作区,并能复制Standup Completed的signing secret
- 可创建Data Table与生产webhook的n8n实例,凭据与表结构不要写进导出JSON
- OpenAI Chat Completions凭据,具体模型与参数以原模板为准,本站不指定
- 隔离Jira项目的建单与评论权限、可选issue type,以及测试Slack频道
具体怎么做
建映射表并固定五列
创建名为standup_blockers的n8n Data Table,列严格用updateId、issueKey、meetingSeriesId、personId、text;工作流引用这张表,后续靠updateId与meetingSeriesId判断同一阻塞是否跨站会延续。
接TeamRetro完成事件并去重
在TeamRetro添加Standup Completed的integration webhook,目标用工作流生产webhook URL,把signing secret粘进TeamRetro Trigger节点;触发后先按deliveryId去重,重复投递直接丢弃,避免一次站会建两张工单。
按映射把更新分三类
载入该meetingSeriesId的开放映射,结合发帖人personId与文本匹配:没有映射是新增;已有映射且仍在阻塞是遗留;本轮消失或标记解决是已解决。blockerTopic用来定位站会里哪一问算作阻塞来源。
新增过AI再决定是否建单
仅新增项把文本交给OpenAI做可执行性判断,要求返回actionable、category、title;actionable为真才在所选Jira项目与issue type建单,写入issueKey与updateId映射,再把工单链接发到teamChannel;不可执行只记录不打扰。
遗留催办与解决销项
遗留项把映射更新到最新updateId与text,并用计数按staleAfter控制的间隔在Jira加催办评论;已解决项删除映射并在对应Jira工单留言说明已清除,形成闭环。
可直接复制的材料
OpenAI阻塞项过筛提示词
本站独立编写提示词,可粘贴;模型名、temperature等参数原文未给,请在原模板核对,不要自行假设。
你是工程站会的阻塞项分诊助手。输入是一条团队成员在站会中填写的阻塞描述。只输出一个JSON对象,不要输出任何解释文字。字段定义:actionable为布尔,仅当描述包含可由本团队推进的具体下一步时为true;category为短中文类别,从 依赖方、环境权限、代码缺陷、需求不清、资源冲突、其他 中选一个;title为不超过40字、可直接作为Jira工单标题的中文祈使句;reason为不超过60字的中文理由。若描述只是情绪抱怨、缺少对象与动作、或需要外部客户先提供信息,则actionable必须为false。阻塞描述:{{$json.blockerText}}Settings与字段映射示例
本站练习配置;jiraUrl、频道、项目与issue type需替换为隔离环境,staleAfter表示每隔几次站会催办一次。
{
"jiraUrl": "https://practice.atlassian.net",
"teamChannel": "#standup-blockers-test",
"staleAfter": 2,
"blockerTopic": "blocker",
"dataTable": "standup_blockers",
"columns": ["updateId", "issueKey", "meetingSeriesId", "personId", "text"],
"jiraProject": "TEST",
"jiraIssueType": "Task"
}合成Data Table与webhook测试数据
上半是五列CSV,下半是本站虚构webhook payload;字段名需按TeamRetro实际投递核对,勿放真实密钥。
updateId,issueKey,meetingSeriesId,personId,text
u-1001,TEST-11,series-a,p-01,等待设计系统按钮规范
u-1002,TEST-12,series-a,p-02,测试环境缺少导出权限
---WEBHOOK---
{"deliveryId":"d-9f-01","event":"Standup Completed","meetingSeriesId":"series-a","updates":[{"updateId":"u-1002","personId":"p-02","text":"测试环境缺少导出权限,今天仍无法跑回归"},{"updateId":"u-1003","personId":"p-03","text":"支付网关沙盒回调超时,需要后端排查重试"}]}输入与输出示例
本站虚构演示,未真实调用OpenAI、Jira或Slack,输出字段与上文合成输入一一对应。
输入
series-a本轮站会payload含deliveryId为d-9f-01;映射表已有u-1002对应TEST-12的开放映射且本轮文本仍是缺少导出权限,同时新增u-1003描述支付网关沙盒回调超时需要后端排查重试。对应输出
u-1002判为carried over:映射text更新为今天仍无法跑回归,因距上次催办已满staleAfter为2次,在TEST-12添加评论“阻塞仍存在:测试环境缺少导出权限”。u-1003判为new,OpenAI返回{"actionable":true,"category":"代码缺陷","title":"排查支付网关沙盒回调超时重试","reason":"有明确对象与下一步"},建TEST-13,写入映射u-1003与TEST-13,并发Slack到#standup-blockers-test。做完检查这些
- 同一deliveryId重复投递时流程只处理一次,不会重复建单或重复评论
- standup_blockers五列齐全且名称一致,新增、遗留、已解决能走到三条不同分支
- actionable为false时不创建Jira、不写issueKey映射,也不发Slack链接
- 遗留项达到staleAfter间隔才在Jira催办,已解决项删除映射并留下清除留言
容易卡住的地方
- 必须粘贴TeamRetro的signing secret且用生产webhook URL,签名校验失败会让触发直接不可用
- Data Table列名拼写不一致会导致映射读不到,新增会被反复当成全新阻塞
- OpenAI可能把情绪化抱怨误判可执行,提示词要强制只输出JSON并限制actionable条件
- 手动执行不会收到真实Standup Completed事件,需用合成payload模拟并先小流量验证
- issue type与项目权限不足会在建单或评论时报错,先用隔离项目验证再接入正式会系
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Turn TeamRetro standup blockers into Jira issues with OpenAI and Slack
- 原作者
- TeamRetro
- 原始发布日期
- 2026-10-14T15:36:01.745Z
- 来源
- https://n8n.io/workflows/20961