Automatisation GitLab avec n8n : sauvegarde et gestion de fichiers
Ce workflow n8n a pour objectif d'automatiser la gestion des fichiers sur GitLab, en facilitant la sauvegarde et l'édition de fichiers existants. Dans un contexte où la gestion des versions et la collaboration sur des projets sont essentielles, ce workflow s'adresse aux équipes de développement et aux entreprises qui souhaitent optimiser leur processus de sauvegarde. Grâce à cette automatisation n8n, les utilisateurs peuvent facilement créer, modifier ou vérifier l'existence de fichiers dans leurs dépôts GitLab sans intervention manuelle.
- Étape 1 : le workflow commence par un déclencheur manuel ou programmé via le nœud 'Backup Now - Manual Trigger' ou 'Schedule Trigger'.
- Étape 2 : il utilise le nœud 'Fetch List of Existing Files' pour récupérer la liste des fichiers présents dans le dépôt.
- Étape 3 : une condition vérifie si le fichier existe déjà grâce au nœud 'File Exists in Gitlab?'. Si le fichier existe, il est récupéré avec 'Fetch Existing File Content', sinon, un nouveau fichier est créé avec 'Create New File(s)'.
- Étape 4 : le contenu des fichiers peut être modifié avec 'Edit Existing File(s)', permettant ainsi de garder les fichiers à jour. Ce workflow apporte une valeur ajoutée significative en réduisant le temps consacré à la gestion manuelle des fichiers et en minimisant les risques d'erreurs, tout en assurant une traçabilité et une organisation optimales des projets.
Workflow n8n GitLab, gestion de fichiers : vue d'ensemble
Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.
Workflow n8n GitLab, gestion de fichiers : détail des nœuds
Inscris-toi pour voir l'intégralité du workflow
Inscription gratuite
S'inscrire gratuitementBesoin d'aide ?{
"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
}
]
]
}
}
}Workflow n8n GitLab, gestion de fichiers : pour qui est ce workflow ?
Ce workflow s'adresse principalement aux équipes de développement et aux entreprises qui utilisent GitLab pour la gestion de leurs projets. Il est conçu pour des utilisateurs ayant un niveau technique intermédiaire, souhaitant automatiser leurs processus de sauvegarde et de gestion de fichiers.
Workflow n8n GitLab, gestion de fichiers : problème résolu
Ce workflow résout le problème de la gestion manuelle des fichiers sur GitLab, qui peut être chronophage et source d'erreurs. En automatisant la sauvegarde et l'édition de fichiers, il permet aux utilisateurs de gagner du temps et de se concentrer sur des tâches à plus forte valeur ajoutée. De plus, il réduit les risques liés à la perte de données et assure une meilleure organisation des projets.
Workflow n8n GitLab, gestion de fichiers : étapes du workflow
Étape 1 : le workflow est déclenché manuellement ou selon un calendrier.
- Étape 1 : il récupère la liste des fichiers existants dans le dépôt GitLab.
- Étape 2 : il vérifie si un fichier spécifique existe déjà.
- Étape 3 : si le fichier existe, son contenu est récupéré, sinon un nouveau fichier est créé.
- Étape 4 : les fichiers peuvent être modifiés selon les besoins.
- Étape 5 : les fichiers sont ensuite sauvegardés ou mis à jour dans GitLab.
Workflow n8n GitLab, gestion de fichiers : guide de personnalisation
Pour personnaliser ce workflow, vous pouvez modifier le nœud 'Schedule Trigger' pour ajuster la fréquence des sauvegardes. Il est également possible de changer les paramètres dans les nœuds 'Create New File(s)' et 'Edit Existing File(s)' pour spécifier le contenu et le chemin des fichiers. Pensez à vérifier les droits d'accès sur votre dépôt GitLab pour assurer un fonctionnement optimal. Vous pouvez également intégrer d'autres outils ou services en ajoutant des nœuds supplémentaires selon vos besoins.