Workflow: develop a modular n8n workflow that supports Gitlab Filter Create Scheduled
Integrations: aggregate, filter, gitlab, if, manualTrigger, n8n, scheduleTrigger, set, stickyNote

{"nodes": [{"id": "3e2820cb-24a4-491b-8f8b-60f97b0748dc", "name": "Backup Now - Manual Trigger", "type": "n8n-nodes-base.manualTrigger", "position": [520, 320], "parameters": {}, "typeVersion": 1}, {"id": "bc5588e5-b67a-4713-b8e7-c21227048a2d", "name": "n8n", "type": "n8n-nodes-base.n8n", "position": [980, 520], "parameters": {"filters": {"tags": "={{ $('Globals').first().json.tags_to_match_for_backup }}"}, "requestOptions": {}}, "credentials": {"n8nApi": {"id": "L3X3qWRmwZRYCpV8", "name": "Source n8n Account"}}, "typeVersion": 1}, {"id": "2a5af64d-b5c3-4180-bae5-9efeeaeba99d", "name": "Globals", "type": "n8n-nodes-base.set", "position": [740, 400], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "150135fb-c0fb-444b-aeed-eac851af255d", "name": "gitlab_owner", "type": "string", "value": "mygitlabownername"}, {"id": "8a9359c0-5a16-482b-8f3a-c8b20fbc13c0", "name": "gitlab_project", "type": "string", "value": "n8n_workflow_backups"}, {"id": "00843c18-7d09-4d60-ab70-534ca0791504", "name": "gitlab_workflow_path", "type": "string", "value": "workflow_definitions"}, {"id": "8fbcc201-dbff-440b-b440-42e8f1735548", "name": "tags_to_match_for_backup", "type": "string", "value": "gitlab_backup_enabled"}, {"id": "e17051bc-d8b3-4cef-bad0-efe38a7be464", "name": "execution_type", "type": "string", "value": "={{ ( $('Schedule Trigger').isExecuted) ? 'Scheduled' : 'Manual' }}"}, {"id": "8b90fba9-df11-4e07-a7ae-31405143e831", "name": "execution_time", "type": "string", "value": "={{ $now }}"}]}}, "typeVersion": 3.4}, {"id": "b6b44b4b-e5a7-4ce6-9cff-e7a21679ad32", "name": "Create New File(s)", "type": "n8n-nodes-base.gitlab", "position": [2060, 540], "parameters": {"owner": "={{ $('Globals').first().json.gitlab_owner }}", "branch": "main", "filePath": "={{ $('Globals').first().json.gitlab_workflow_path }}/{{ $('Derive Filename From Workflow Name').item.json.normalized_filename }}", "resource": "file", "repository": "={{ $('Globals').first().json.gitlab_project }}", "fileContent": "={{ JSON.stringify($('n8n').item.json, null, 4) }}", "commitMessage": "=(Initial) {{ $('Globals').first().json.execution_type }} Backup - {{ $('Globals').first().json.execution_time }}."}, "credentials": {"gitlabApi": {"id": "Nv1DoplS64rrPZVm", "name": "Target GitLab Account"}}, "typeVersion": 1}, {"id": "167ae6cd-b8dd-4e01-aca4-4888fcaf9958", "name": "Edit Existing File(s)", "type": "n8n-nodes-base.gitlab", "position": [2060, 340], "parameters": {"owner": "={{ $('Globals').first().json.gitlab_owner }}", "branch": "main", "filePath": "={{ $('Globals').first().json.gitlab_workflow_path }}/{{ $('Derive Filename From Workflow Name').item.json.normalized_filename }}", "resource": "file", "operation": "edit", "repository": "={{ $('Globals').first().json.gitlab_project }}", "fileContent": "={{ JSON.stringify($('n8n').item.json, null, 4) }}", "commitMessage": "={{ $('Globals').first().json.execution_type }} Backup - {{ $('Globals').first().json.execution_time }}."}, "credentials": {"gitlabApi": {"id": "Nv1DoplS64rrPZVm", "name": "Target GitLab Account"}}, "typeVersion": 1}, {"id": "a4437388-9143-4c91-841e-c062ab9af3c0", "name": "Derive Filename From Workflow Name", "type": "n8n-nodes-base.set", "position": [1160, 520], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "d2110dc6-1f31-46b3-991e-556b2255d76e", "name": "normalized_filename", "type": "string", "value": "={{ $json.name.replace(/[^a-zA-Z0-9]/g, '') }}.json"}]}}, "typeVersion": 3.4}, {"id": "cb0fca8f-dc43-4903-a8e1-5b7acf9157b1", "name": "Fetch Existing File Content", "type": "n8n-nodes-base.gitlab", "position": [1640, 340], "parameters": {"owner": "={{ $('Globals').first().json.gitlab_owner }}", "filePath": "={{ $('Globals').first().json.gitlab_workflow_path }}/{{ $('Derive Filename From Workflow Name').item.json.normalized_filename }}", "resource": "file", "operation": "get", "repository": "={{ $('Globals').first().json.gitlab_project }}", "asBinaryProperty": false, "additionalParameters": {"reference": "main"}}, "credentials": {"gitlabApi": {"id": "Nv1DoplS64rrPZVm", "name": "Target GitLab Account"}}, "typeVersion": 1}, {"id": "816843c4-769c-4033-a38e-1c6ef5325e15", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [940, 120], "parameters": {"color": 5, "width": 401, "height": 246, "content": "## Gather Gitlab Info"}, "typeVersion": 1}, {"id": "19f3fe4d-acba-4e7b-b92c-ce9024a8f37d", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [940, 460], "parameters": {"color": 5, "width": 398, "height": 240, "content": "## Gather n8n Info"}, "typeVersion": 1}, {"id": "418bef31-adf6-419b-87f1-faa2581e5766", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [1380, 280], "parameters": {"width": 598, "height": 384.41789416257484, "content": "## Decide Whether to Create or Edit or Skip"}, "typeVersion": 1}, {"id": "f3b98ded-c767-4822-bcf4-25931be03f48", "name": "Skip Unchanged Files", "type": "n8n-nodes-base.filter", "position": [1820, 340], "parameters": {"options": {}, "conditions": {"options": {"leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "3298ab8b-9934-4ed7-9c38-03f325dc71e2", "operator": {"type": "string", "operation": "notEquals"}, "leftValue": "={{ JSON.stringify($('n8n').item.json, null, 4) }}", "rightValue": "={{ $json.content.base64Decode() }}"}]}}, "typeVersion": 2}, {"id": "6bbf5146-7129-4ca8-8576-39d5cbe8e0b9", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [480, 220], "parameters": {"color": 4, "width": 402, "height": 452, "content": "## Start / Trigger & Configure"}, "typeVersion": 1}, {"id": "0e5d9c9f-40b4-494d-8233-a2b4fea67d76", "name": "Schedule Trigger", "type": "n8n-nodes-base.scheduleTrigger", "position": [520, 520], "parameters": {"rule": {"interval": [{"field": "cronExpression", "expression": "30 21 * * 6"}]}}, "typeVersion": 1.2}, {"id": "be08176e-3961-43d7-b182-89a4f45805f6", "name": "Fetch List of Existing Files", "type": "n8n-nodes-base.gitlab", "position": [980, 180], "parameters": {"owner": "={{ $('Globals').first().json.gitlab_owner }}", "filePath": "={{ $('Globals').first().json.gitlab_workflow_path }}", "resource": "file", "operation": "list", "returnAll": true, "repository": "={{ $('Globals').item.json.gitlab_project }}", "additionalParameters": {"ref": "main"}}, "credentials": {"gitlabApi": {"id": "Nv1DoplS64rrPZVm", "name": "Target GitLab Account"}}, "typeVersion": 1}, {"id": "674cdaa8-f8fe-4f6d-8743-062d3fd1ff95", "name": "Combine Gitlab Existing Files as Single List Item", "type": "n8n-nodes-base.aggregate", "position": [1180, 180], "parameters": {"options": {}, "fieldsToAggregate": {"fieldToAggregate": [{"renameField": true, "outputFieldName": "gitlab_existing_filenames", "fieldToAggregate": "name"}]}}, "typeVersion": 1}, {"id": "463ae3fb-4d66-497d-81eb-7e55b5945d84", "name": "File Exists in Gitlab?", "type": "n8n-nodes-base.if", "position": [1440, 460], "parameters": {"options": {}, "conditions": {"options": {"leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "0740c2be-ab9d-4249-af46-0d94f58c318f", "operator": {"type": "array", "operation": "contains", "rightType": "any"}, "leftValue": "={{ $('Combine Gitlab Existing Files as Single List Item').first().json.gitlab_existing_filenames }}", "rightValue": "={{ $('Derive Filename From Workflow Name').item.json.normalized_filename }}"}]}}, "typeVersion": 2}], "connections": {"n8n": {"main": [[{"node": "Derive Filename From Workflow Name", "type": "main", "index": 0}]]}, "Globals": {"main": [[{"node": "Fetch List of Existing Files", "type": "main", "index": 0}]]}, "Schedule Trigger": {"main": [[{"node": "Globals", "type": "main", "index": 0}]]}, "Skip Unchanged Files": {"main": [[{"node": "Edit Existing File(s)", "type": "main", "index": 0}]]}, "File Exists in Gitlab?": {"main": [[{"node": "Fetch Existing File Content", "type": "main", "index": 0}], [{"node": "Create New File(s)", "type": "main", "index": 0}]]}, "Backup Now - Manual Trigger": {"main": [[{"node": "Globals", "type": "main", "index": 0}]]}, "Fetch Existing File Content": {"main": [[{"node": "Skip Unchanged Files", "type": "main", "index": 0}]]}, "Fetch List of Existing Files": {"main": [[{"node": "Combine Gitlab Existing Files as Single List Item", "type": "main", "index": 0}]]}, "Derive Filename From Workflow Name": {"main": [[{"node": "File Exists in Gitlab?", "type": "main", "index": 0}]]}, "Combine Gitlab Existing Files as Single List Item": {"main": [[{"node": "n8n", "type": "main", "index": 0}]]}}}