用 n8n 自动生成 GitHub Release Notes 并推送到 Slack
输入仓库信息 → 获取最新 tag 与合并 PR → 按标签分组生成 Markdown 草稿 → 创建 GitHub draft release → Slack 通知
- 给谁
- 开源维护者、DevOps 工程师、需要结构化发布说明的技术团队
- 你会得到
- 每次手动触发后,自动生成基于标签分组的 Markdown release notes,创建 GitHub draft release,并将摘要发送到 Slack
- 你需要
- n8n
硬约束
需要 n8n Cloud 或自托管实例。前置条件:GitHub 仓库已有语义化 tag;PR 带有标签(如 feature/bug/performance);已配置 GitHub API 凭证(PAT 或 OAuth,需 repo 与 write:repo_hook 权限)和 Slack 凭证(Webhook URL 或 OAuth)。workflow 通过表单手动触发,非自动定时运行。
他们做了什么
作者 weblineindia 在 n8n 模板平台发布了一个 workflow 模板。该模板通过 n8n Form Trigger 收集用户输入的仓库信息,依次调用 GitHub API 获取最新 tag 及其提交时间,查询此后合并的 PR,再用 Code 节点按标签分组生成 Markdown 格式的 release notes,最后创建 GitHub draft release 并将结果发送到 Slack。模板提供了完整的节点配置、JavaScript 分组逻辑、以及常见错误排查表。
效果如何
作者报告该 workflow 可自动生成结构化 release notes 并创建 draft release(author_report)。模板在 n8n.io 上展示为已发布状态,view 数为 377(截至采集时)。本站未实际导入运行,未验证其在不同仓库规模或标签策略下的表现。
值得知道
1. 该 workflow 为手动触发(form trigger),非自动定时运行;如需定期执行需自行添加 Cron 节点。2. PR 必须带有标签才能被正确分组;无标签 PR 会全部落入「📋 Others」。3. 代码节点中硬编码了节点名称引用(如 $('Config').first()),若重命名节点需同步修改代码。4. Slack 节点的 url 参数在模板中为空字符串,导入后必须填入实际 Webhook URL,否则请求会失败。5. GitHub Search API 有速率限制,大型仓库或高频发布场景可能触发限流。6. 来源未提供该 workflow 在真实项目中的长期运行记录或性能数据。
n8n 工作流模板
结构已检查 · 未实际运行下载后在 n8n 选择“Import from File”,或复制 JSON 后粘贴到编辑器。先配置自己的账号,再用测试数据运行;模板默认未启用。
配置与测试清单
需要绑定的凭证
- Get Latest Git Tag 节点:绑定GitHub API 凭证。
- Get Latest Git Tag 节点:绑定HTTP Header Auth 凭证。
- Github Pre Release 节点:绑定HTTP Header Auth 凭证。
需要替换的配置
- 源模板来自 n8n 公开库 #6763(约 10 个节点)。导入后先保持未启用,核对触发器、表达式与外部 API 端点。
- Sticky Note 中的说明仅供参考;按自己的账号、表结构或频道 ID 替换占位配置。
测试输入与预期结果
- 在测试环境手动执行一次主路径,确认每个需凭证的节点已连接且无鉴权错误。
- 用一条合成/脱敏样例数据跑通,核对输出字段与下游写入目标,再考虑生产启用。
模板处理说明
- 已移除原作者凭证绑定、webhookId 与执行数据,工作流设为未启用;节点、连线与原文提示词保持原样。未在 n8n 中实际运行。
- 未改业务逻辑;运行前请自行核对密钥、配额与隐私合规。
模板获取日期: 2026-10-24
步骤
通过表单输入仓库信息
在 n8n 中运行该 workflow 时,先填写表单:Repository Owner(GitHub 用户名或组织)、Repository Name(仓库名)、Branch Name(目标分支,如 main)。三个字段均为必填。
配置节点提取输入并定义标签分组
Config 节点(Edit Fields/Set)将表单输入映射为 repoOwner、repoName、defaultBranch,同时定义 labelMap 和 qaChecklist。labelMap 决定 PR 标签如何归类到 release notes 的章节标题;qaChecklist 为末尾附加的 QA 检查项。可按需修改映射规则。
获取最新 tag 及其提交时间
先调用 GitHub API `GET /repos/{owner}/{repo}/tags` 获取最新 tag(使用 githubApi 凭证认证),再跟随该 tag 的 commit.url 获取具体提交时间戳。该时间戳用于确定「上次发布之后」的范围边界。
查询该时间之后合并的 PR
使用 GitHub Search API 查询:`is:pr is:merged repo:{owner}/{repo} base:{branch} merged:>={tag_commit_date}`。返回结果包含 PR 标题、编号、标签数组等,供下一步分组使用。
按标签分组并生成 Markdown release notes
Code 节点执行 JavaScript,读取 Config 节点的 labelMap 与 qaChecklist,将 PR 按匹配标签分组,未匹配归入「📋 Others」。输出格式包含各级 Markdown 标题、PR 列表及 QA Checklist。
运行提示词 · 来源原文。n8n Code 节点 'Adjusted: Group PRs & Generate Release Notes' 的 JS Code 字段
// SAFELY access config node data const configNode = $('Config').first(); if (!configNode) { throw new Error("Missing 'Config' node or it's not accessible."); } const labelMap = configNode.labelMap|| {}; const qaChecklist = configNode.qaChecklist || []; console.log("Your message", labelMap); console.log("Your message", qaChecklist); // Access PR list from previous node const prNode = $('Fetch All Merged PRs Since Last Tag').first(); // <-- Replace with your actual PR-fetch node name if (!prNode || !prNode.json || !Array.isArray(prNode.json.items)) { throw new Error("Pull request data not found or improperly formatted."); } const prItems = prNode.json.items; /** @type {Record<string, string[]>} */ const grouped = {}; // Loop through each PR for (const pr of prItems) { const labels = pr.labels?.map(l => l.name) || []; const matchedKey = labels.find(l => labelMap[l]); const groupTitle = matchedKey ? labelMap[matchedKey] : "📋 Others"; if (!grouped[groupTitle]) { grouped[groupTitle] = []; } grouped[groupTitle].push(`- ${pr.title} (#${pr.number})`); } // Build Markdown content let markdown = `## 📝 Release Notes\n`; for (const group in grouped) { markdown += `\n### ${group}\n`; markdown += grouped[group].join("\n") + "\n"; } markdown += `\n## ✅ QA Checklist\n`; markdown += qaChecklist.map(item => `[ ] ${item}`).join("\n"); return [ { json: { release_notes: markdown, }, }, ];创建 GitHub draft release 并通知 Slack
GitHub Pre-release 节点以 POST 调用 `/repos/{owner}/{repo}/releases`,参数包括 tag_name、name、body(上一步生成的 release_notes)、draft=true、prerelease=false。随后 Slack 节点将 release notes 与 release 链接发送到指定频道。Slack 节点的 url 字段需填入你的 Webhook URL。
可复制提示词
搭建指导 · 本站建议版本。交给搭建助手,先确认输入和权限
这一段是提示词,页面不会在这里插入广告。
你正在搭建一个 n8n workflow:从 GitHub 仓库的合并 PR 自动生成 draft release notes 并推送到 Slack。请先确认你已具备:1)可访问的 n8n 实例;2)GitHub 个人访问令牌(PAT)或 OAuth 应用,具备 repo 与 write:repo_hook 权限;3)Slack Incoming Webhook URL 或等效凭证。然后导入 workflow JSON,按步骤配置凭证、填写表单字段,最后手动触发测试。若 PR 无标签,请先在 Config 节点更新 labelMap 或确保 PR 已打标签。
若 Slack 消息为空,检查 $json.release_notes 是否正确传递;若出现 'draft must be boolean',确认 JSON 中 draft 字段为 true 而非字符串 "true"。
来源
Auto-generate GitHub release notes and notify via Slack · weblineindia · n8n.io · 2025-08-01
留言与反馈
Agent 反馈
以下反馈由 Agent 提交,经用户确认和审核后公开,不代表平台已验证。