LintBot:您的自动化代码质量助手
高级
这是一个Engineering, AI领域的自动化工作流,包含 20 个节点。主要使用 Set, Code, Webhook, Aggregate, HttpRequest 等节点,结合人工智能技术实现智能自动化。 使用Google Gemini AI自动化GitHub PR代码检查与自动修复
前置要求
- •HTTP Webhook 端点(n8n 会自动生成)
- •可能需要目标 API 的认证凭证
- •Google Gemini API Key
使用的节点 (20)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "mfAxsn2XqfEzDtYr",
"meta": {
"instanceId": "24ca526572eca60ee26bbee4ba7087b1023a6874af4ebeed61b2d126e50e531b",
"templateCredsSetupCompleted": true
},
"name": "LintBot:您的自动化代码质量助手",
"tags": [],
"nodes": [
{
"id": "8dedfb4b-d477-4fa5-9a9b-68b74450d1fe",
"name": "监听来自 Github Workflow 的触发",
"type": "n8n-nodes-base.webhook",
"position": [
-1040,
-540
],
"webhookId": "1da5a6e1-9453-4a65-bbac-a1fed633f6ad",
"parameters": {
"path": "1da5a6e1-9453-4a65-bbac-a1fed633f6ad",
"options": {
"responseHeaders": {
"entries": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"responseMode": "responseNode"
},
"typeVersion": 1
},
{
"id": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1780,
-580
],
"parameters": {
"text": "=<files>\n{{ JSON.stringify($json.data) }}\n</files>",
"options": {
"systemMessage": "=You are an expert at code linting. Your job is to receive a JSON-formatted request with various file paths and the code inside each file.\n\nYou will:\n\n1. Look for and fix any linting issues in the files.\n2. First, check if a branch exists and if, create a new branch using the name {{ $('Get PR GitHub Branch').item.json.head.ref }}-linting-fix. If so, use the existing branch.\n3. Commit the new files with fixes to the branch.\n4. Create a PR from that branch with the name: \"Linting fixes for PR:{{ $('Listen for Trigger from Github Workflow').item.json.pull_request_number }}\""
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "0e043c94-5b69-41f5-9f27-9dd5ea45a628",
"name": "响应 Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
2200,
-660
],
"parameters": {
"options": {},
"respondWith": "allIncomingItems"
},
"typeVersion": 1.2
},
{
"id": "68047540-a8ea-4836-9d5b-3b81515f98fc",
"name": "获取 PR 文件",
"type": "n8n-nodes-base.httpRequest",
"position": [
360,
-540
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/pulls/{{ $('Listen for Trigger from Github Workflow').item.json.pull_request_number }}/files",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "29b9cace-ceaa-446c-a547-ac25c4331d5a",
"name": "获取文件内容",
"type": "n8n-nodes-base.httpRequest",
"position": [
580,
-540
],
"parameters": {
"url": "={{ $json.contents_url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "a8920578-706a-4ed6-8c58-9be88f16420c",
"name": "将 Base64 转换为文本文件",
"type": "n8n-nodes-base.convertToFile",
"position": [
780,
-540
],
"parameters": {
"options": {},
"operation": "toBinary",
"sourceProperty": "content"
},
"typeVersion": 1.1
},
{
"id": "1fccb56b-ca82-4c9b-9ede-f669a97067f6",
"name": "从文件提取",
"type": "n8n-nodes-base.extractFromFile",
"position": [
980,
-560
],
"parameters": {
"options": {},
"operation": "text"
},
"typeVersion": 1
},
{
"id": "543be972-e489-4ca0-8a43-d77442081016",
"name": "创建代码/文件路径对象",
"type": "n8n-nodes-base.set",
"position": [
1200,
-560
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "d18801c8-8c93-4c66-add8-0a5915ac3a6f",
"name": "code",
"type": "string",
"value": "={{ $json.data }}"
},
{
"id": "6da8a116-f59e-481c-a815-acda60e19398",
"name": "filePath",
"type": "string",
"value": "={{ $('Get File Contents').item.json.path }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ac2ac571-5a1c-4f06-b45f-296fc43557c8",
"name": "收集所有更改的文件",
"type": "n8n-nodes-base.aggregate",
"position": [
1440,
-560
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "9062c98b-6937-4411-9a21-6f047084ab78",
"name": "获取 PR GitHub 分支",
"type": "n8n-nodes-base.httpRequest",
"position": [
-580,
-520
],
"parameters": {
"url": "={{ $json.gitHubApiBaseEndpointUri }}/pulls/{{ $('Listen for Trigger from Github Workflow').item.json.pull_request_number }}",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "8c9f3d57-b73d-46a1-a7f8-b8ea49fbdbd0",
"name": "创建 GitHub Blob",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1660,
-120
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/blobs",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "content",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', ``, 'string') }}"
},
{
"name": "encoding",
"value": "utf-8"
}
]
},
"toolDescription": "Creates a GitHub blob for a file",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "3bba3645-f54e-46aa-866f-426404581221",
"name": "创建 GitHub Tree",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1880,
-120
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/trees",
"method": "POST",
"options": {},
"jsonBody": "={\n \"base_tree\": \"{{ $('Get Latest Main Branch Tree Hash').item.json.tree.sha }}\",\n \"tree\": {{ $fromAI('json_array_of_files','','string') }}\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"toolDescription": "Creates a GitHub tree object with one file",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "26213bce-5117-475c-98a1-926140cdeec4",
"name": "创建 GitHub Commit",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2080,
-140
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/commits",
"method": "POST",
"options": {},
"jsonBody": "={\n \"message\": \"{{ $fromAI('message', '', 'string').replace(/\\n/g, '\\\\n') }}\",\n \"tree\": \"{{ $fromAI('treeHash', '', 'string') }}\",\n \"parents\": [\n \"{{ $('Get Latest Main Branch Commit SHA').item.json.object.sha }}\"\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"toolDescription": "Creates a commit from the new tree. ",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "cb6918d1-4345-4f77-8667-c4ae6c790db5",
"name": "创建 Pull Request",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2580,
-520
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/pulls",
"method": "POST",
"options": {},
"jsonBody": "={\n \"title\": \"{{ $fromAI('title','','string') }}\",\n \"head\": \"refs/heads/{{ $fromAI('head','','string') }}\",\n \"base\": \"main\",\n \"body\": \"{{ $fromAI('body','','string') }}\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"toolDescription": "Creates a Pull Request",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "8b9240b2-e23a-4f49-851a-1810d24f1bf3",
"name": "创建分支",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2480,
-300
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/refs",
"method": "POST",
"options": {},
"jsonBody": "= {\n \"ref\": \"refs/heads/{{ $fromAI('branch_ref','','string') }}\",\n \"sha\": \"{{ $fromAI('commit_sha','','string') }}\"\n }",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"toolDescription": "Creates a branch to point to the new commit",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "ea314631-174f-4d03-a947-0710b2870ed1",
"name": "获取最新主分支提交 SHA",
"type": "n8n-nodes-base.httpRequest",
"position": [
-340,
-540
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/ref/heads/main",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "36633281-8335-4381-9393-cb1f64390bee",
"name": "获取最新主分支树哈希",
"type": "n8n-nodes-base.httpRequest",
"position": [
140,
-540
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/commits/{{ $json.object.sha }}",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "435d5b12-3a71-4dbf-9d5d-97b30b249414",
"name": "获取分支",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
2280,
-200
],
"parameters": {
"url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/branches/{{ $fromAI('branch_name','','string') }}",
"options": {},
"authentication": "predefinedCredentialType",
"toolDescription": "Get a branch from the GitHub repo",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "MI5Ul9UqEbdI0RRe",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "b26415fa-b898-4d79-a7da-8f66451f0747",
"name": "Google Gemini聊天模型",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1500,
-340
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash"
},
"credentials": {
"googlePalmApi": {
"id": "ARYVKWu9TZzwQ3fB",
"name": "Google Gemini(PaLM) Api account"
}
},
"typeVersion": 1
},
{
"id": "9ec4b763-a3c8-4d5b-a50c-64842038a4ba",
"name": "设置公共字段",
"type": "n8n-nodes-base.code",
"position": [
-820,
-540
],
"parameters": {
"jsCode": "const commonFields = {\n 'gitHubRepoName': 'my-membership',\n 'gitHubOrgName': 'carved-rock-fitness-gym'\n}\ncommonFields['gitHubApiBaseEndpointUri'] = `https://api.github.com/repos/${commonFields.gitHubOrgName}/${commonFields.gitHubRepoName}`\n\nreturn commonFields"
},
"typeVersion": 2
}
],
"active": false,
"pinData": {
"Listen for Trigger from Github Workflow": [
{
"json": {
"pull_request_number": 204
}
}
]
},
"settings": {
"executionOrder": "v1"
},
"versionId": "17951810-1716-46ae-90bb-d698a6062483",
"connections": {
"AI Agent": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Get Branch": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get PR Files": {
"main": [
[
{
"node": "Get File Contents",
"type": "main",
"index": 0
}
]
]
},
"Create Branch": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "Create Code/FilePath Object",
"type": "main",
"index": 0
}
]
]
},
"Get File Contents": {
"main": [
[
{
"node": "Convert Base64 to Text File",
"type": "main",
"index": 0
}
]
]
},
"Set Common Fields": {
"main": [
[
{
"node": "Get PR GitHub Branch",
"type": "main",
"index": 0
}
]
]
},
"Create GitHub Blob": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create GitHub Tree": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create Pull Request": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create GitHub Commit": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get PR GitHub Branch": {
"main": [
[
{
"node": "Get Latest Main Branch Commit SHA",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Collect All Files Changed": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Convert Base64 to Text File": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
},
"Create Code/FilePath Object": {
"main": [
[
{
"node": "Collect All Files Changed",
"type": "main",
"index": 0
}
]
]
},
"Get Latest Main Branch Tree Hash": {
"main": [
[
{
"node": "Get PR Files",
"type": "main",
"index": 0
}
]
]
},
"Get Latest Main Branch Commit SHA": {
"main": [
[
{
"node": "Get Latest Main Branch Tree Hash",
"type": "main",
"index": 0
}
]
]
},
"Listen for Trigger from Github Workflow": {
"main": [
[
{
"node": "Set Common Fields",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 工程, 人工智能
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
构建集成Azure搜索、Entra ID和Jira的AI IT支持助手
构建集成Azure搜索、Entra ID和Jira的AI IT支持助手
Set
Code
Webhook
+11
30 节点Adam Bertram
客户支持
[模板] AI宠物店 v8
🐶 AI宠物店助手 - 集成GPT-4o、Google日历和WhatsApp/Instagram/Facebook
If
N8n
Set
+38
244 节点Amanda Benks
销售
AI 代理餐厅 [模板]
🤖 WhatsApp、Instagram 和 Messenger 的 AI 餐厅助手
If
N8n
Set
+37
239 节点Amanda Benks
其他
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
其他
转录评估器
使用DeepGram和GPT-4o的音频对话分析与可视化
Set
Code
Html
+15
54 节点RealSimple Solutions
人工智能
宠物店 4
🐶 宠物店预约 AI 代理
If
Set
Code
+41
187 节点Bruno Dias
人工智能