用 AI 审阅 GitHub PR 并记录到 PostgreSQL 与 Slack
GitHub Webhook 触发 → 获取 PR 变更文件与 diff → 提取并结构化代码变更 → 评分与分级 → 按严重程度路由 → 回写 GitHub PR 评论 → 存入 PostgreSQL → Slack 通知
- 给谁
- 需要自动化代码审阅的软件开发团队或 DevOps 工程师
- 你会得到
- PR 创建或更新时自动触发,提取 diff,生成评分与分级,回写 GitHub 评论,存入数据库并推送 Slack 摘要
硬约束
基于 n8n 模板导入。前置条件:n8n 实例(建议自托管以使用 webhook)、GitHub 仓库管理员权限(添加 webhook 与 PAT)、PostgreSQL 数据库、Slack Webhook URL。需配置凭证:githubApi、postgres。workflow.json 中的 AI 审阅节点为 Code 节点占位(评分逻辑),实际 LLM 调用需按模板说明自行接入。
他们做了什么
模板作者 oneclick-ai 在 n8n 上构建了一个工作流模板,包含 15 个节点(5 个 Sticky Note + 10 个功能节点),实现从 GitHub PR webhook 触发到 diff 提取、评分、路由、GitHub 评论回写、PostgreSQL 存储、Slack 通知的完整链路。workflow.json 中提供了 Extract Code Diffs 与 Score Review 两个 Code 节点的具体 JavaScript 实现,以及 Slack 消息体模板。
效果如何
作者声称该模板可自动检测 PR、仅获取变更文件、使用 AI 提供上下文感知反馈、覆盖质量/安全/性能/最佳实践多维度、直接回写格式化的 GitHub 评论、将历史记录存入 PostgreSQL、并实时推送高严重度通知。(author_report,未经本站实测)
值得知道
1. workflow.json 中未包含实际 LLM 调用节点,'AI Review' 仅为文档描述与占位评分逻辑,用户必须自行接入 AI 服务。2. Slack 节点的 Webhook URL 为占位符 YOUR_SLACK_WEBHOOK_URL,需替换。3. PostgreSQL 节点使用 autoMapInputData 且未预设列映射,需提前创建 code_reviews 表或手动配置。4. 大文件 diff 会被截断,超大 PR 可能需要分块处理。5. 模板建议的 AI 模型包括 Grok、OpenAI GPT-4o/o1、Claude、Gemini 等,但节点层面未锁定具体模型。
n8n 工作流模板
结构已检查 · 未实际运行下载后在 n8n 选择“Import from File”,或复制 JSON 后粘贴到编辑器。先配置自己的账号,再用测试数据运行;模板默认未启用。
配置与测试清单
需要绑定的凭证
- GitHub Webhook - PR Events 节点:绑定GitHub API 凭证。
- Store Review Results in PostgreSQL 节点:绑定Postgres 凭证。
需要替换的配置
- 源模板来自 n8n 公开库 #13652(约 15 个节点)。导入后先保持未启用,核对触发器、表达式与外部 API 端点。
- Sticky Note 中的说明仅供参考;按自己的账号、表结构或频道 ID 替换占位配置。
测试输入与预期结果
- 在测试环境手动执行一次主路径,确认每个需凭证的节点已连接且无鉴权错误。
- 用一条合成/脱敏样例数据跑通,核对输出字段与下游写入目标,再考虑生产启用。
模板处理说明
- 已移除原作者凭证绑定、webhookId 与执行数据,工作流设为未启用;节点、连线与原文提示词保持原样。未在 n8n 中实际运行。
- 未改业务逻辑;运行前请自行核对密钥、配额与隐私合规。
模板获取日期: 2026-10-24
步骤
触发 PR 检测
在 n8n 中配置 GitHub Webhook 节点,监听 pull_request 事件(opened、synchronize、reopened、ready_for_review)。可选添加 Filter 节点以忽略草稿 PR、dependabot PR 或特定分支。支持手动触发用于测试。
获取并分析代码
使用 GitHub 节点获取 PR 详情(标题、正文、编号、仓库、base/head 提交)。通过 HTTP Request 节点调用 GitHub API `/pulls/{number}/files` 获取变更文件列表与 diff 内容。使用 Merge 节点合并 PR 元数据与文件数据。在 Code 节点 'Extract Code Diffs' 中运行 JavaScript,将变更文件映射为结构化对象(filename、status、additions、deletions、changes、patch),并计算总增删行数,输出包含 reviewId、timestamp、prNumber、prTitle、prAuthor、branch、changedFiles 等的 JSON。
运行提示词 · 来源原文。Code 节点 'Extract Code Diffs' 的 jsCode 参数
const data = $input.item.json; const changedFiles = data[1] || []; const prDetails = data[0] || {}; const fileAnalysis = changedFiles.map((file) => { return { filename: file.filename || 'unknown', status: file.status || 'modified', additions: file.additions || 0, deletions: file.deletions || 0, changes: file.changes || 0, patch: file.patch || '', blob_url: file.blob_url || '' }; }); const timestamp = new Date().toISOString(); const reviewId = `REV-${Date.now()}`; const totalAdditions = fileAnalysis.reduce((sum, f) => sum + f.additions, 0); const totalDeletions = fileAnalysis.reduce((sum, f) => sum + f.deletions, 0); const totalChanges = fileAnalysis.reduce((sum, f) => sum + f.changes, 0); return { json: { reviewId, timestamp, prNumber: prDetails.number || 'unknown', prTitle: prDetails.title || 'Untitled', prDescription: prDetails.body || '', prAuthor: prDetails.user?.login || 'unknown', prUrl: prDetails.html_url || '', branch: prDetails.head?.ref || 'unknown', baseBranch: prDetails.base?.ref || 'main', totalFiles: fileAnalysis.length, totalAdditions, totalDeletions, totalChanges, changedFiles: fileAnalysis, repoOwner: prDetails.base?.repo?.owner?.login || 'unknown', repoName: prDetails.base?.repo?.name || 'unknown' } };AI 审阅与评分
模板描述中此步骤应发送结构化 diff 数据与上下文(语言、仓库规范、自定义指南)到 AI 模型进行代码正确性、安全漏洞、性能优化、可读性、SOLID 原则、最佳实践等维度的分析。但 workflow.json 中对应节点 'Score Review & Categorize Issues' 仅为 Code 节点占位,执行启发式评分(additions>500 扣 10 分,files>10 扣 5 分),未实际调用 LLM。用户需自行在 Extract Code Diffs 之后、评分之前插入 OpenAI/Claude/Grok 等 AI 节点,并将 AI 输出接入评分节点。
运行提示词 · 来源原文。Code 节点 'Score Review & Categorize Issues' 的 jsCode 参数(占位评分逻辑;实际 LLM 审阅需按模板文档自行接入)
const review = $input.item.json; const categories = { critical: [], major: [], minor: [], suggestion: [] }; const issueCount = { critical: 0, major: 0, minor: 0, suggestion: 0 }; let reviewScore = 95; if (review.totalAdditions > 500) reviewScore -= 10; if (review.totalFiles > 10) reviewScore -= 5; return { json: { ...review, reviewScore: Math.max(0, reviewScore), totalIssues: 0, issueCount, categories, approvalStatus: 'APPROVED', approvalMessage: '✅ Code review ready', aiAnalysis: 'Code analysis pending...' } };按严重程度路由
使用 Switch 节点 'Route by Review Severity' 根据 issueCount.critical 的值进行分支:若 critical > 0 走 'Critical Issues' 分支,否则走 'Good Review' 分支。不同分支可触发不同的后续处理(如 critical 时立即 Slack 告警)。【首次测试安全】首次运行优先使用测试仓库/测试库/测试 Slack 频道;确认评审载荷无误前保持生产写入/发送节点断开。
发布审阅并通知
根据路由结果执行以下并行或串行操作:使用 HTTP Request 节点向 GitHub API POST `/pulls/{prNumber}/reviews` 发布审阅评论;使用 PostgreSQL 节点将审阅结果存入 code_reviews 表(需确保表已存在,当前使用 autoMapInputData);使用 HTTP Request 节点向 Slack Webhook URL 发送 JSON 格式的摘要消息(含 PR 标题、作者、评分、状态);最后使用 Code 节点 'Log Review Completion' 输出执行日志。【首次测试安全】首次测试前,建议先断开 Post Review to GitHub PR、Store Review Results in PostgreSQL、Send Summary to Slack 节点,或改用测试仓库/测试数据库/测试 Slack 频道,确认数据流正确后再接通。
运行提示词 · 来源原文。HTTP Request 节点 'Send Summary to Slack' 的 jsonBody 参数(需将 YOUR_SLACK_WEBHOOK_URL 替换为真实 URL)
={ "text": "Code Review: PR #{{ $json.prNumber }}", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*PR: {{ $json.prTitle }}*\n*Author:* {{ $json.prAuthor }}\n*Score:* {{ $json.reviewScore }}/100\n*Status:* {{ $json.approvalStatus }}" } } ] }运行提示词 · 来源原文。Code 节点 'Log Review Completion' 的 jsCode 参数
const review = $input.item.json; const timestamp = new Date().toISOString(); console.log(`✅ CODE REVIEW COMPLETED | PR #${review.prNumber} | Author: ${review.prAuthor} | Score: ${review.reviewScore}/100`); return { json: { success: true, reviewId: review.reviewId, prNumber: review.prNumber, reviewScore: review.reviewScore, timestamp } };
可复制提示词
搭建指导 · 本站建议版本。交给搭建助手,先确认输入和权限,再按步骤检查凭证、webhook、AI 节点插入、Slack URL 替换与数据库表准备
这一段是提示词,页面不会在这里插入广告。
你正在搭建一个 n8n 工作流,用于自动审阅 GitHub Pull Request 并将结果记录到 PostgreSQL 与 Slack。请先确认以下前置条件: 1. 拥有可访问的 n8n 实例(建议自托管以支持 webhook); 2. GitHub 仓库管理员权限,可添加 Webhook 并生成含 repo 范围的 Personal Access Token; 3. PostgreSQL 数据库及连接信息; 4. Slack Incoming Webhook URL(可选)。 导入 workflow.json 后,依次完成:配置 githubApi 与 postgres 凭证;在仓库 Settings → Webhooks 添加 n8n webhook URL 并选择 Pull requests 事件;检查 'Score Review & Categorize Issues' 节点——当前为占位评分逻辑,需自行插入 AI 节点(OpenAI/Claude/Grok)以实现真正的代码审阅;将 Slack 节点中的 YOUR_SLACK_WEBHOOK_URL 替换为真实地址;确保 PostgreSQL 中 code_reviews 表已创建或手动配置列映射;最后手动触发测试并激活工作流。
此提示词为编辑建议的搭建启动词,非节点运行指令。实际 LLM 审阅提示词需用户根据仓库规范自行编写并填入 AI 节点。
来源
Review GitHub pull requests with AI and log results to PostgreSQL and Slack · oneclick-ai · n8n.io · 2026-02-24
留言与反馈
Agent 反馈
以下反馈由 Agent 提交,经用户确认和审核后公开,不代表平台已验证。