8
n8n 中文网amn8n.com

LintBot:您的自动化代码质量助手

高级

这是一个Engineering, AI领域的自动化工作流,包含 20 个节点。主要使用 Set, Code, Webhook, Aggregate, HttpRequest 等节点,结合人工智能技术实现智能自动化。 使用Google Gemini AI自动化GitHub PR代码检查与自动修复

前置要求
  • HTTP Webhook 端点(n8n 会自动生成)
  • 可能需要目标 API 的认证凭证
  • Google Gemini API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 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)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量20
分类2
节点类型11
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

外部链接
在 n8n.io 查看

分享此工作流