Workflow: Code GitHub Create

Workflow Details

Download Workflow
{
    "nodes": [
        {
            "id": "421824c2-59a2-441b-aacc-7dadf2ec153b",
            "name": "On clicking 'execute'",
            "type": "n8n-nodes-base.manualTrigger",
            "position": [
                900,
                1180
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "c6024a57-1957-4714-84e3-8d326c83cd89",
            "name": "Sticky Note",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                420,
                1560
            ],
            "parameters": {
                "color": 6,
                "width": 1910.78130460513466459815390408039093017578125,
                "height": 731.70398215136492581223137676715850830078125,
                "content": "## Subworkflow"
            },
            "typeVersion": 1
        },
        {
            "id": "07691901-a8d2-4891-860b-1d672361021b",
            "name": "Execute Workflow Trigger",
            "type": "n8n-nodes-base.executeWorkflowTrigger",
            "position": [
                480,
                1940
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "2b1dd138-7872-42ea-9882-8750ef4cf227",
            "name": "n8n",
            "type": "n8n-nodes-base.n8n",
            "position": [
                1300,
                1280
            ],
            "parameters": {
                "filters": [],
                "requestOptions": []
            },
            "credentials": {
                "n8nApi": {
                    "id": "t2YEgbUMXHjsykeF",
                    "name": "admin"
                }
            },
            "typeVersion": 1
        },
        {
            "id": "96c0c6a7-2a11-441d-8177-e0a18030daf9",
            "name": "Return",
            "type": "n8n-nodes-base.set",
            "position": [
                2140,
                1760
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "8d513345-6484-431f-afb7-7cf045c90f4f",
                            "name": "Done",
                            "type": "boolean",
                            "value": true
                        }
                    ]
                }
            },
            "typeVersion": 3.29999999999999982236431605997495353221893310546875
        },
        {
            "id": "6715d1ff-a1f0-4e1a-b96e-f680d1495047",
            "name": "Get File",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                1100,
                1640
            ],
            "parameters": {
                "url": "={{ $json.download_url }}",
                "options": []
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "443b18e8-c05b-444f-b323-dea0b3041939",
            "name": "If file too large",
            "type": "n8n-nodes-base.if",
            "position": [
                860,
                1660
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "45ce825e-9fa6-430c-8931-9aaf22c42585",
                            "operator": {
                                "type": "string",
                                "operation": "empty",
                                "singleValue": true
                            },
                            "leftValue": "={{ $json.content }}",
                            "rightValue": ""
                        },
                        {
                            "id": "9619a55f-7fb1-4f24-b1a7-7aeb82365806",
                            "operator": {
                                "type": "string",
                                "operation": "notExists",
                                "singleValue": true
                            },
                            "leftValue": "={{ $json.error }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2
        },
        {
            "id": "e460a2cd-f7af-4551-8ea2-84d9b9e5cb7f",
            "name": "Merge Items",
            "type": "n8n-nodes-base.merge",
            "position": [
                860,
                1920
            ],
            "parameters": [],
            "typeVersion": 2
        },
        {
            "id": "f795180a-66aa-4a86-acb0-96cf8c487db0",
            "name": "isDiffOrNew",
            "type": "n8n-nodes-base.code",
            "position": [
                1060,
                1920
            ],
            "parameters": {
                "jsCode": "const orderJsonKeys = (jsonObj) => {\n  const ordered = {};\n  Object.keys(jsonObj).sort().forEach(key => {\n    ordered[key] = jsonObj[key];\n  });\n  return ordered;\n}\n\n\/\/ Check if file returned with content\nif (Object.keys($input.all()[0].json).includes(\"content\")) {\n  \/\/ Decode base64 content and parse JSON\n  const origWorkflow = JSON.parse(Buffer.from($input.all()[0].json.content, 'base64').toString());\n  const n8nWorkflow = $input.all()[1].json;\n  \n  \/\/ Order JSON objects\n  const orderedOriginal = orderJsonKeys(origWorkflow);\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n\n  \/\/ Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n\/\/ No file returned \/ new workflow\n} else if (Object.keys($input.all()[0].json).includes(\"data\")) {\n  const origWorkflow = JSON.parse($input.all()[0].json.data);\n  const n8nWorkflow = $input.all()[1].json;\n  \n  \/\/ Order JSON objects\n  const orderedOriginal = orderJsonKeys(origWorkflow);\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n\n  \/\/ Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n\n} else {\n  \/\/ Order JSON object\n  const n8nWorkflow = $input.all()[1].json;\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n  \n  \/\/ Proper formatting\n  $input.all()[0].json.github_status = \"new\";\n  $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n}\n\n\/\/ Return items\nreturn $input.all();\n"
            },
            "typeVersion": 1
        },
        {
            "id": "30e7d6fc-327e-4693-95ce-376a3b1f145c",
            "name": "Check Status",
            "type": "n8n-nodes-base.switch",
            "position": [
                1460,
                1920
            ],
            "parameters": {
                "rules": {
                    "rules": [
                        {
                            "value2": "same"
                        },
                        {
                            "output": 1,
                            "value2": "different"
                        },
                        {
                            "output": 2,
                            "value2": "new"
                        }
                    ]
                },
                "value1": "={{$json.github_status}}",
                "dataType": "string"
            },
            "typeVersion": 1
        },
        {
            "id": "36f12309-c7fe-446f-9571-bd1005c18ed8",
            "name": "Same file - Do nothing",
            "type": "n8n-nodes-base.noOp",
            "position": [
                1680,
                1760
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "45f0eaa7-259b-4908-b567-af2b3b5abb6d",
            "name": "File is different",
            "type": "n8n-nodes-base.noOp",
            "position": [
                1680,
                1920
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "d16ec06b-7a3f-486e-8328-935ed3b4d565",
            "name": "File is new",
            "type": "n8n-nodes-base.noOp",
            "position": [
                1680,
                2120
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "cdc7f306-b7d2-4de1-8e44-0bd8d49a679f",
            "name": "Create new file",
            "type": "n8n-nodes-base.github",
            "position": [
                1900,
                2120
            ],
            "parameters": {
                "owner": {
                    "__rl": true,
                    "mode": "",
                    "value": "={{ $('Config').first().item.repo_owner }}"
                },
                "filePath": "={{ $('Config').first().item.repo_path }}{{ $json.subPath }}{{$('Execute Workflow Trigger').first().json.id}}.json",
                "resource": "file",
                "repository": {
                    "__rl": true,
                    "mode": "",
                    "value": "={{ $('Config').first().item.repo_name }}"
                },
                "fileContent": "={{$('isDiffOrNew').item.json[\"n8n_data_stringy\"]}}",
                "commitMessage": "={{$('Execute Workflow Trigger').first().json.name}} ({{$json.github_status}})"
            },
            "typeVersion": 1
        },
        {
            "id": "9785333a-4a86-448d-afc2-58b0aa50ea96",
            "name": "Edit existing file",
            "type": "n8n-nodes-base.github",
            "position": [
                1900,
                1920
            ],
            "parameters": {
                "owner": {
                    "__rl": true,
                    "mode": "",
                    "value": "={{ $('Config').first().item.repo_owner }}"
                },
                "filePath": "={{ $('Config').first().item.repo_path }}{{ $json.subPath }}{{$('Execute Workflow Trigger').first().json.id}}.json",
                "resource": "file",
                "operation": "edit",
                "repository": {
                    "__rl": true,
                    "mode": "",
                    "value": "={{ $('Config').first().item.repo_name }}"
                },
                "fileContent": "={{$('isDiffOrNew').item.json[\"n8n_data_stringy\"]}}",
                "commitMessage": "={{$('Execute Workflow Trigger').first().json.name}} ({{$json.github_status}})"
            },
            "typeVersion": 1
        },
        {
            "id": "806db72c-c9f6-461d-be1a-1e6867a25382",
            "name": "Loop Over Items",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                1500,
                1280
            ],
            "parameters": {
                "options": []
            },
            "typeVersion": 3
        },
        {
            "id": "e5c433e4-bf56-4a0a-906c-7d74f6fe7287",
            "name": "Schedule Trigger",
            "type": "n8n-nodes-base.scheduleTrigger",
            "position": [
                900,
                1380
            ],
            "parameters": {
                "rule": {
                    "interval": [
                        {
                            "triggerAtHour": 1,
                            "triggerAtMinute": 33
                        }
                    ]
                }
            },
            "typeVersion": 1.1999999999999999555910790149937383830547332763671875
        },
        {
            "id": "f6b566cb-0a15-4792-ba27-d6cd2a6c9453",
            "name": "Create sub path",
            "type": "n8n-nodes-base.set",
            "position": [
                1260,
                1920
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "dae43d3b-56e5-4098-b602-862ebf5cd073",
                            "name": "subPath",
                            "type": "string",
                            "value": "={{ $('Execute Workflow Trigger').first().json.createdAt.split('-')[0] }}\/{{ $('Execute Workflow Trigger').first().json.createdAt.split('-')[1] }}\/"
                        }
                    ]
                },
                "includeOtherFields": true
            },
            "typeVersion": 3.29999999999999982236431605997495353221893310546875
        },
        {
            "id": "9e2412f6-df25-4c12-8faf-0200558b537c",
            "name": "Sticky Note1",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                420,
                1100
            ],
            "parameters": {
                "color": 4,
                "width": 385,
                "height": 417,
                "content": "## Backup to GitHub \nThis workflow will backup all instance workflows to GitHub every 24 hours.\n\nThe files are saved into folders using `YYYY\/MM\/` for the directory path and `ID.json` for the filename.\n\nThe Repo Owner, Repo Name and Main folder are set using the **Variables** feature but can be replaced with the `Config` node in the subworkflow. \n\nThe workflow runs calls itself to help reduce memory usage, Once the workflow has completed it will send an optional notification to Slack.\n\n### Time to Run\nTested with 1423 workflows on `1.44.1` it took under 30 minutes for the first run and under 12 minutes once the initial run is complete."
            },
            "typeVersion": 1
        },
        {
            "id": "00fdb977-4f3e-49f6-81c3-bc7f9520914f",
            "name": "Sticky Note2",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                860,
                1100
            ],
            "parameters": {
                "color": 7,
                "width": 1272.640814568015457552974112331867218017578125,
                "height": 416.185690661807484502787701785564422607421875,
                "content": "## Main workflow loop"
            },
            "typeVersion": 1
        },
        {
            "id": "0c00a374-566a-49c7-80de-66a991c4bf69",
            "name": "Starting Message",
            "type": "n8n-nodes-base.slack",
            "position": [
                1140,
                1280
            ],
            "webhookId": "c02eb407-5547-4aa0-9ebf-46dab67b63b6",
            "parameters": {
                "text": "=:information_source:  Starting Workflow Backup [{{ $execution.id }}]",
                "select": "channel",
                "channelId": {
                    "__rl": true,
                    "mode": "name",
                    "value": "#notifications"
                },
                "otherOptions": {
                    "includeLinkToWorkflow": false
                }
            },
            "typeVersion": 2.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "eb7d15be-7f5d-4e39-837b-06d740685af3",
            "name": "Execute Workflow",
            "type": "n8n-nodes-base.executeWorkflow",
            "onError": "continueErrorOutput",
            "position": [
                1720,
                1300
            ],
            "parameters": {
                "mode": "each",
                "options": [],
                "workflowId": "={{ $workflow.id }}"
            },
            "typeVersion": 1
        },
        {
            "id": "c831a0eb-95e1-46b3-bbf8-5d5bd928ca0a",
            "name": "Completed Notification",
            "type": "n8n-nodes-base.slack",
            "position": [
                1720,
                1120
            ],
            "webhookId": "a0c6e8c8-5d71-40fa-b02b-63a7ed5726c4",
            "parameters": {
                "text": "=\u2705 Backup has completed - {{ $('n8n').all().length }} workflows have been processed.",
                "select": "channel",
                "channelId": {
                    "__rl": true,
                    "mode": "name",
                    "value": "#notifications"
                },
                "otherOptions": []
            },
            "executeOnce": true,
            "typeVersion": 2.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "00864cb8-c8e4-4324-be1b-7d093e1bc3bf",
            "name": "Failed Flows",
            "type": "n8n-nodes-base.slack",
            "position": [
                1920,
                1320
            ],
            "webhookId": "2a092edb-de12-490f-931b-34d70e7d7696",
            "parameters": {
                "text": "=:x: Failed to backup {{ $('Loop Over Items').item.json.id }}",
                "select": "channel",
                "channelId": {
                    "__rl": true,
                    "mode": "name",
                    "value": "#notifications"
                },
                "otherOptions": {
                    "includeLinkToWorkflow": false
                }
            },
            "typeVersion": 2.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "e4d70af5-5c21-4340-8054-7ba0203f3ee1",
            "name": "Get file data",
            "type": "n8n-nodes-base.github",
            "position": [
                660,
                1660
            ],
            "parameters": {
                "owner": {
                    "__rl": true,
                    "mode": "",
                    "value": "={{ $('Config').first().item.repo_owner }}"
                },
                "filePath": "={{ $('Config').first().item.repo_path }}{{ $('Execute Workflow Trigger').first().json.createdAt.split('-')[0] }}\/{{ $('Execute Workflow Trigger').first().json.createdAt.split('-')[1] }}\/{{$json.id}}.json",
                "resource": "file",
                "operation": "get",
                "repository": {
                    "__rl": true,
                    "mode": "",
                    "value": "={{ $('Config').first().item.repo_name }}"
                },
                "asBinaryProperty": false,
                "additionalParameters": []
            },
            "typeVersion": 1,
            "continueOnFail": true,
            "alwaysOutputData": true
        },
        {
            "id": "42ad4762-26fb-4686-9016-729e95c95324",
            "name": "Config",
            "type": "n8n-nodes-base.set",
            "position": [
                660,
                1940
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "8f6d1741-772f-462a-811f-4c334185e4f0",
                            "name": "repo_owner",
                            "type": "string",
                            "value": "={{ $vars.repo_owner }}"
                        },
                        {
                            "id": "8cac215c-4fd7-422f-9fd2-6b2d1e5e0383",
                            "name": "repo_name",
                            "type": "string",
                            "value": "={{ $vars.repo_name }}"
                        },
                        {
                            "id": "eee305e9-4164-462a-86bd-80f0d58a31ae",
                            "name": "repo_path",
                            "type": "string",
                            "value": "={{ $vars.repo_path }}"
                        }
                    ]
                },
                "includeOtherFields": true
            },
            "typeVersion": 3.399999999999999911182158029987476766109466552734375
        }
    ],
    "pinData": [],
    "connections": {
        "n8n": {
            "main": [
                [
                    {
                        "node": "Loop Over Items",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Config": {
            "main": [
                [
                    {
                        "node": "Get file data",
                        "type": "main",
                        "index": 0
                    },
                    {
                        "node": "Merge Items",
                        "type": "main",
                        "index": 1
                    }
                ]
            ]
        },
        "Get File": {
            "main": [
                [
                    {
                        "node": "Merge Items",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "File is new": {
            "main": [
                [
                    {
                        "node": "Create new file",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Merge Items": {
            "main": [
                [
                    {
                        "node": "isDiffOrNew",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "isDiffOrNew": {
            "main": [
                [
                    {
                        "node": "Create sub path",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Check Status": {
            "main": [
                [
                    {
                        "node": "Same file - Do nothing",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "File is different",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "File is new",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Failed Flows": {
            "main": [
                [
                    {
                        "node": "Loop Over Items",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get file data": {
            "main": [
                [
                    {
                        "node": "If file too large",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Create new file": {
            "main": [
                [
                    {
                        "node": "Return",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Create sub path": {
            "main": [
                [
                    {
                        "node": "Check Status",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Loop Over Items": {
            "main": [
                [
                    {
                        "node": "Completed Notification",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Execute Workflow",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Execute Workflow": {
            "main": [
                [
                    {
                        "node": "Loop Over Items",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Failed Flows",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Schedule Trigger": {
            "main": [
                [
                    {
                        "node": "Starting Message",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Starting Message": {
            "main": [
                [
                    {
                        "node": "n8n",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "File is different": {
            "main": [
                [
                    {
                        "node": "Edit existing file",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "If file too large": {
            "main": [
                [
                    {
                        "node": "Get File",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Merge Items",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Edit existing file": {
            "main": [
                [
                    {
                        "node": "Return",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "On clicking 'execute'": {
            "main": [
                [
                    {
                        "node": "Starting Message",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Same file - Do nothing": {
            "main": [
                [
                    {
                        "node": "Return",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Execute Workflow Trigger": {
            "main": [
                [
                    {
                        "node": "Config",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        }
    }
}
Back to Workflows

Related Workflows

Manual Tapfiliate Automate Triggered
View
Google Search Engine Results Page Extraction with Bright Data
View
Gmail Googlecalendartool Send Triggered
View
Manual Stickynote Automate Triggered
View
Respondtowebhook Webhook Import Webhook
View
Post RSS feed items from yesterday to Slack
View
All-in-One Telegram/Baserow AI Assistant 🤖🧠 Voice/Photo/Save Notes/Long Term Mem
View
Generate Exam Questions
View
Mautic Webhook Update Webhook
View
GoogleCalendar Schedule Create Scheduled
View