LintBot: Ihr automatisierter Helfer für Code-Qualität

Experte

Dies ist ein Engineering, AI-Bereich Automatisierungsworkflow mit 20 Nodes. Hauptsächlich werden Set, Code, Webhook, Aggregate, HttpRequest und andere Nodes verwendet, kombiniert mit KI-Technologie für intelligente Automatisierung. Automatisierte GitHub-PR-Code-Prüfung und automatische Reparatur mit Google Gemini AI

Voraussetzungen
  • HTTP Webhook-Endpunkt (wird von n8n automatisch generiert)
  • Möglicherweise sind Ziel-API-Anmeldedaten erforderlich
  • Google Gemini API Key
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "id": "mfAxsn2XqfEzDtYr",
  "meta": {
    "instanceId": "24ca526572eca60ee26bbee4ba7087b1023a6874af4ebeed61b2d126e50e531b",
    "templateCredsSetupCompleted": true
  },
  "name": "LintBot: Your Automated Code Quality Assistant",
  "tags": [],
  "nodes": [
    {
      "id": "8dedfb4b-d477-4fa5-9a9b-68b74450d1fe",
      "name": "Auf Trigger aus Github Workflow warten",
      "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": "KI-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": "An Webhook antworten",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        2200,
        -660
      ],
      "parameters": {
        "options": {},
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.2
    },
    {
      "id": "68047540-a8ea-4836-9d5b-3b81515f98fc",
      "name": "PR-Dateien abrufen",
      "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": "Dateiinhalte abrufen",
      "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 in Textdatei konvertieren",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        780,
        -540
      ],
      "parameters": {
        "options": {},
        "operation": "toBinary",
        "sourceProperty": "content"
      },
      "typeVersion": 1.1
    },
    {
      "id": "1fccb56b-ca82-4c9b-9ede-f669a97067f6",
      "name": "Aus Datei extrahieren",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        980,
        -560
      ],
      "parameters": {
        "options": {},
        "operation": "text"
      },
      "typeVersion": 1
    },
    {
      "id": "543be972-e489-4ca0-8a43-d77442081016",
      "name": "Code/Dateipfad-Objekt erstellen",
      "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": "Alle geänderten Dateien sammeln",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1440,
        -560
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "9062c98b-6937-4411-9a21-6f047084ab78",
      "name": "PR-GitHub-Branch abrufen",
      "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 erstellen",
      "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 erstellen",
      "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 erstellen",
      "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 erstellen",
      "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": "Branch erstellen",
      "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": "Letzten Main-Branch-Commit-SHA abrufen",
      "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": "Letzten Main-Branch-Tree-Hash abrufen",
      "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": "Branch abrufen",
      "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 Chat-Modell",
      "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": "Gemeinsame Felder setzen",
      "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": {
    "4bec8f3a-5670-4fe5-916f-b7fab3165880": {
      "main": [
        [
          {
            "node": "0e043c94-5b69-41f5-9f27-9dd5ea45a628",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "435d5b12-3a71-4dbf-9d5d-97b30b249414": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "68047540-a8ea-4836-9d5b-3b81515f98fc": {
      "main": [
        [
          {
            "node": "29b9cace-ceaa-446c-a547-ac25c4331d5a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8b9240b2-e23a-4f49-851a-1810d24f1bf3": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "1fccb56b-ca82-4c9b-9ede-f669a97067f6": {
      "main": [
        [
          {
            "node": "543be972-e489-4ca0-8a43-d77442081016",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "29b9cace-ceaa-446c-a547-ac25c4331d5a": {
      "main": [
        [
          {
            "node": "a8920578-706a-4ed6-8c58-9be88f16420c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9ec4b763-a3c8-4d5b-a50c-64842038a4ba": {
      "main": [
        [
          {
            "node": "9062c98b-6937-4411-9a21-6f047084ab78",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8c9f3d57-b73d-46a1-a7f8-b8ea49fbdbd0": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "3bba3645-f54e-46aa-866f-426404581221": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "cb6918d1-4345-4f77-8667-c4ae6c790db5": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "26213bce-5117-475c-98a1-926140cdeec4": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "9062c98b-6937-4411-9a21-6f047084ab78": {
      "main": [
        [
          {
            "node": "ea314631-174f-4d03-a947-0710b2870ed1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b26415fa-b898-4d79-a7da-8f66451f0747": {
      "ai_languageModel": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "ac2ac571-5a1c-4f06-b45f-296fc43557c8": {
      "main": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a8920578-706a-4ed6-8c58-9be88f16420c": {
      "main": [
        [
          {
            "node": "1fccb56b-ca82-4c9b-9ede-f669a97067f6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "543be972-e489-4ca0-8a43-d77442081016": {
      "main": [
        [
          {
            "node": "ac2ac571-5a1c-4f06-b45f-296fc43557c8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "36633281-8335-4381-9393-cb1f64390bee": {
      "main": [
        [
          {
            "node": "68047540-a8ea-4836-9d5b-3b81515f98fc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ea314631-174f-4d03-a947-0710b2870ed1": {
      "main": [
        [
          {
            "node": "36633281-8335-4381-9393-cb1f64390bee",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8dedfb4b-d477-4fa5-9a9b-68b74450d1fe": {
      "main": [
        [
          {
            "node": "9ec4b763-a3c8-4d5b-a50c-64842038a4ba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Experte - Engineering, Künstliche Intelligenz

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Experte
Anzahl der Nodes20
Kategorie2
Node-Typen11
Schwierigkeitsbeschreibung

Für fortgeschrittene Benutzer, komplexe Workflows mit 16+ Nodes

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34