n8n Workflow

Save Your Workflows Into A Github Repository

This n8n workflow automates tasks using GitHub. Save Your Workflows Into A Github Repository - ready to import and run in your n8n instance.

n8n workflow.json

About This Script

This n8n workflow automates tasks using GitHub. Save Your Workflows Into A Github Repository - ready to import and run in your n8n instance.
Features:
  • Custom JavaScript function processing
  • Makes HTTP requests to external APIs
  • Conditional logic and branching
  • Scheduled automation with cron triggers
  • Integrates with GitHub
Source Code
{
    "nodes": [
        {
            "name": "On clicking 'execute'",
            "type": "n8n-nodes-base.manualTrigger",
            "position": [
                0,
                150
            ],
            "parameters": [],
            "typeVersion": 1,
            "id": "58ce6462-01e9-46ef-9dcd-fbab3c905d63"
        },
        {
            "name": "dataArray",
            "type": "n8n-nodes-base.function",
            "position": [
                450,
                300
            ],
            "parameters": {
                "functionCode": "const newItems = [];\nfor (item of items[0].json.data) {\n  newItems.push({json: item});\n}\nreturn newItems;"
            },
            "typeVersion": 1,
            "id": "3db8a22d-6ee4-4641-a7d9-7e601207f9ab"
        },
        {
            "name": "N8N Workflows",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                300,
                300
            ],
            "parameters": {
                "url": "http://localhost:8443/rest/workflows",
                "options": []
            },
            "typeVersion": 1,
            "id": "074d0d48-6561-4dd9-8c78-fd7bd040157a"
        },
        {
            "name": "GitHub",
            "type": "n8n-nodes-base.github",
            "position": [
                800,
                130
            ],
            "parameters": {
                "owner": "={{$node[\"Globals\"].json[\"repo\"][\"owner\"]}}",
                "filePath": "={{$node[\"Globals\"].json[\"repo\"][\"path\"]}}{{$json[\"name\"]}}.json",
                "resource": "file",
                "operation": "get",
                "repository": "={{$node[\"Globals\"].json[\"repo\"][\"name\"]}}",
                "asBinaryProperty": false
            },
            "credentials": {
                "githubApi": "GitHub"
            },
            "typeVersion": 1,
            "continueOnFail": true,
            "alwaysOutputData": true,
            "id": "ce48f500-71e1-4c48-9968-7af33f0ab49f"
        },
        {
            "name": "Merge",
            "type": "n8n-nodes-base.merge",
            "position": [
                1000,
                300
            ],
            "parameters": [],
            "typeVersion": 1,
            "id": "7ff63065-a9c0-4ad0-9c87-08fc50413fd4"
        },
        {
            "name": "N8N Workflow Detail",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                800,
                460
            ],
            "parameters": {
                "url": "=http://localhost:8443/rest/workflows/{{$json[\"id\"]}}",
                "options": []
            },
            "typeVersion": 1,
            "id": "d384ee68-9088-4c17-9621-4f40c90b409a"
        },
        {
            "name": "github_status",
            "type": "n8n-nodes-base.switch",
            "position": [
                1300,
                300
            ],
            "parameters": {
                "rules": {
                    "rules": [
                        {
                            "value2": "same"
                        },
                        {
                            "output": 1,
                            "value2": "different"
                        },
                        {
                            "output": 2,
                            "value2": "new"
                        }
                    ]
                },
                "value1": "={{$json[\"github_status\"]}}",
                "dataType": "string"
            },
            "typeVersion": 1,
            "id": "83cc9bd6-fe85-418e-b1f9-4f813adaf331"
        },
        {
            "name": "same",
            "type": "n8n-nodes-base.noOp",
            "position": [
                1500,
                130
            ],
            "parameters": [],
            "typeVersion": 1,
            "id": "a6e668f1-37b6-4e19-98a4-3114500baa0b"
        },
        {
            "name": "different",
            "type": "n8n-nodes-base.noOp",
            "position": [
                1500,
                300
            ],
            "parameters": [],
            "typeVersion": 1,
            "id": "5039a47f-182b-4469-a686-4e59e85a18c1"
        },
        {
            "name": "new",
            "type": "n8n-nodes-base.noOp",
            "position": [
                1500,
                460
            ],
            "parameters": [],
            "typeVersion": 1,
            "id": "0dddf032-9793-4575-94d4-e0fdaf0b2116"
        },
        {
            "name": "GitHub Edit",
            "type": "n8n-nodes-base.github",
            "position": [
                1700,
                180
            ],
            "parameters": {
                "owner": "={{$node[\"Globals\"].json[\"repo\"][\"owner\"]}}",
                "filePath": "={{$node[\"Globals\"].json[\"repo\"][\"path\"]}}{{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json",
                "resource": "file",
                "operation": "edit",
                "repository": "={{$node[\"Globals\"].json[\"repo\"][\"name\"]}}",
                "fileContent": "={{$node[\"isDiffOrNew\"].json[\"n8n_data_stringy\"]}}",
                "commitMessage": "=[N8N Backup] {{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json ({{$json[\"github_status\"]}})"
            },
            "credentials": {
                "githubApi": "GitHub"
            },
            "typeVersion": 1,
            "id": "a80369c7-527a-4f14-be0e-60633a930c6f"
        },
        {
            "name": "GitHub Create",
            "type": "n8n-nodes-base.github",
            "position": [
                1700,
                460
            ],
            "parameters": {
                "owner": "={{$node[\"Globals\"].json[\"repo\"][\"owner\"]}}",
                "filePath": "={{$node[\"Globals\"].json[\"repo\"][\"path\"]}}{{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json",
                "resource": "file",
                "repository": "={{$node[\"Globals\"].json[\"repo\"][\"name\"]}}",
                "fileContent": "={{$node[\"isDiffOrNew\"].json[\"n8n_data_stringy\"]}}",
                "commitMessage": "=[N8N Backup] {{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json ({{$json[\"github_status\"]}})"
            },
            "credentials": {
                "githubApi": "GitHub"
            },
            "typeVersion": 1,
            "id": "3bd40469-0577-406a-ade1-b56ce4e6f9b7"
        },
        {
            "name": "isDiffOrNew",
            "type": "n8n-nodes-base.function",
            "position": [
                1150,
                300
            ],
            "parameters": {
                "functionCode": "// File Returned with Content\nif (Object.keys(items[0].json).includes(\"content\")) {\n  // Get JSON Objects\n  var origWorkflow = eval(\"(\"+Buffer.from(items[0].json.content, 'base64').toString()+\")\");\n  var n8nWorkflow = (items[1].json.data);\n  \n  // Order JSON Objects\n  var orderedOriginal = {}\n  var orderedActual = {}\n  \n  Object.keys(origWorkflow).sort().forEach(function(key) {\n    orderedOriginal[key] = origWorkflow[key];\n  });\n  \n  Object.keys(n8nWorkflow).sort().forEach(function(key) {\n    orderedActual[key] = n8nWorkflow[key];\n  });\n  \n  // Determine Difference\n  if ( JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual) ) {\n    items[0].json.github_status = \"same\";\n    items[0].json.content_decoded = orderedOriginal;\n  } else {\n    items[0].json.github_status = \"different\";\n    items[0].json.content_decoded = orderedOriginal;\n    items[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n// No File Returned / New Workflow\n} else {\n  // Order JSON Object\n  var n8nWorkflow = (items[1].json.data);\n  var orderedActual = {}\n  Object.keys(n8nWorkflow).sort().forEach(function(key) {\n    orderedActual[key] = n8nWorkflow[key];\n  });\n  \n  // Proper Formatting\n  items[0].json.github_status = \"new\";\n  items[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n}\n\n// Return Items\nreturn items;"
            },
            "typeVersion": 1,
            "id": "0789ec57-80cd-403e-b8f3-8fd6309520e1"
        },
        {
            "name": "Daily @ 20:00",
            "type": "n8n-nodes-base.cron",
            "position": [
                0,
                450
            ],
            "parameters": {
                "triggerTimes": {
                    "item": [
                        {
                            "hour": 20,
                            "minute": 11
                        }
                    ]
                }
            },
            "typeVersion": 1,
            "id": "51feaa7d-edb8-46ee-8d86-2675bf947cde"
        },
        {
            "name": "OneAtATime",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                600,
                300
            ],
            "parameters": {
                "options": [],
                "batchSize": 1
            },
            "typeVersion": 1,
            "id": "918bc8c5-6a96-44c7-9d7e-b15972dd8f7e"
        },
        {
            "name": "Globals",
            "type": "n8n-nodes-base.set",
            "position": [
                150,
                300
            ],
            "parameters": {
                "values": {
                    "string": [
                        {
                            "name": "repo.owner",
                            "value": "octocat"
                        },
                        {
                            "name": "repo.name",
                            "value": "Hello-World"
                        },
                        {
                            "name": "repo.path",
                            "value": "my-team/n8n/workflows/"
                        }
                    ]
                },
                "options": []
            },
            "typeVersion": 1,
            "id": "295894da-9212-4c4d-a64a-aba3ff79f9c2"
        }
    ],
    "connections": {
        "new": {
            "main": [
                [
                    {
                        "node": "GitHub Create",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "same": {
            "main": [
                [
                    {
                        "node": "OneAtATime",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Merge": {
            "main": [
                [
                    {
                        "node": "isDiffOrNew",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "GitHub": {
            "main": [
                [
                    {
                        "node": "Merge",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Globals": {
            "main": [
                [
                    {
                        "node": "N8N Workflows",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "dataArray": {
            "main": [
                [
                    {
                        "node": "OneAtATime",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "different": {
            "main": [
                [
                    {
                        "node": "GitHub Edit",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "OneAtATime": {
            "main": [
                [
                    {
                        "node": "GitHub",
                        "type": "main",
                        "index": 0
                    },
                    {
                        "node": "N8N Workflow Detail",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "GitHub Edit": {
            "main": [
                [
                    {
                        "node": "OneAtATime",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "isDiffOrNew": {
            "main": [
                [
                    {
                        "node": "github_status",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Daily @ 20:00": {
            "main": [
                [
                    {
                        "node": "Globals",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "GitHub Create": {
            "main": [
                [
                    {
                        "node": "OneAtATime",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "N8N Workflows": {
            "main": [
                [
                    {
                        "node": "dataArray",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "github_status": {
            "main": [
                [
                    {
                        "node": "same",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "different",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "new",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "N8N Workflow Detail": {
            "main": [
                [
                    {
                        "node": "Merge",
                        "type": "main",
                        "index": 1
                    }
                ]
            ]
        },
        "On clicking 'execute'": {
            "main": [
                [
                    {
                        "node": "Globals",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        }
    },
    "n8n_version": "1.5.0"
}
Requirements
n8n instance, Github API credentials
Tags
#n8n #automation #workflow
Quick Actions
More in n8n Workflows