Automatisation de Sauvegarde GitLab pour Workflows n8n

Ce workflow d'automatisation n8n permet de sauvegarder efficacement vos workflows en les exportant vers un dépôt GitLab. Il identifie les workflows marqués pour sauvegarde, crée ou met à jour les fichiers dans le projet GitLab spécifié, assurant ainsi une gestion sécurisée et centralisée de vos processus automatisés. Cette solution offre une tranquillité d'esprit en garantissant que vos configurations critiques sont toujours à jour et facilement récupérables.

51,267 vues
10,296 copies
Intégration

Documentation Complète

📋 Automatisation de Sauvegarde GitLab pour Workflows n8n

💡 Description

Ce workflow d'automatisation n8n permet de sauvegarder efficacement vos workflows en les exportant vers un dépôt GitLab. Il identifie les workflows marqués pour sauvegarde, crée ou met à jour les fichiers dans le projet GitLab spécifié, assurant ainsi une gestion sécurisée et centralisée de vos processus automatisés. Cette solution offre une tranquillité d'esprit en garantissant que vos configurations critiques sont toujours à jour et facilement récupérables.

📈 Impact & ROI: En automatisant le processus de sauvegarde, ce workflow réduit le risque de perte de données tout en économisant du temps et des ressources, permettant aux équipes de se concentrer sur l'optimisation des workflows existants.

🚀 Fonctionnalités Clés

  • ✅ Sauvegarde automatique des workflows sur GitLab
  • ✅ Gestion centralisée des fichiers de workflow
  • ✅ Mise à jour intelligente pour éviter les doublons
  • ✅ Assure la continuité des opérations avec des sauvegardes régulières

📊 Architecture Technique

16
Nodes
10
Connexions
2
Services

🔌 Services Intégrés

GitLabn8n

🔧 Composition du Workflow

NodeTypeDescription
Backup Now - Manual TriggermanualTriggerTraitement des données
n8nn8nTraitement des données
GlobalssetTraitement des données
Create New File(s)gitlabTraitement des données
Edit Existing File(s)gitlabTraitement des données
Derive Filename From Workflow NamesetTraitement des données
Fetch Existing File ContentgitlabTraitement des données
Sticky NotestickyNoteTraitement des données
Sticky Note1stickyNoteTraitement des données
Sticky Note2stickyNoteTraitement des données
Skip Unchanged FilesfilterTraitement des données
Sticky Note3stickyNoteTraitement des données
Schedule TriggerscheduleTriggerTraitement des données
Fetch List of Existing FilesgitlabTraitement des données
Combine Gitlab Existing Files as Single List ItemaggregateTraitement des données
File Exists in Gitlab?ifCondition logique pour router le flux

📖 Guide d'Implémentation

  1. Import du workflow: Téléchargez le fichier JSON et importez-le dans votre instance n8n
  2. Configuration des credentials: Configurez les accès pour chaque service utilisé
  3. Personnalisation: Adaptez les paramètres selon vos besoins spécifiques
  4. Test: Exécutez le workflow en mode test pour vérifier le bon fonctionnement
  5. Activation: Activez le workflow pour une exécution automatique

🏷️ Tags

sauvegardeGitLabn8nworkflowautomatisation

Structure JSON

Voir le code JSON complet
{
    "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
                    }
                ]
            ]
        }
    }
}
                                

Workflows Similaires

Optimisation de la gestion des Pull Requests avec Pipedrive

Ce workflow permet d'automatiser le suivi des Pull Requests GitHub en les intégrant directement dans Pipedrive. Lorsqu'...

Synchronisation Automatisée des Événements Discord et Google Calendar

Ce workflow puissant automatise la synchronisation des événements programmés sur Discord avec Google Calendar, garant...

Automatisez les commandes Squarespace vers Google Sheets

Ce workflow automatise le processus de récupération des commandes de Squarespace et leur enregistrement dans Google Sh...