Automatisation GitHub avec n8n : sauvegarde de workflows
Ce workflow n8n a pour objectif de sauvegarder automatiquement des workflows dans un dépôt GitHub, offrant ainsi une solution efficace pour la gestion des versions et la sécurité des données. Dans un contexte où la préservation des workflows est cruciale pour les équipes de développement et d'automatisation, ce processus permet de s'assurer que chaque modification est enregistrée et accessible. Les cas d'usage incluent la sauvegarde régulière des configurations de workflows, facilitant ainsi la récupération en cas de besoin.
- Étape 1 : Le déclencheur de ce workflow est un 'Schedule Trigger', qui permet de programmer des sauvegardes à intervalles réguliers.
- Étape 2 : Les données sont ensuite traitées à l'aide de plusieurs nœuds, notamment 'Globals' pour définir les variables nécessaires et 'Loop Over Items' pour itérer sur les éléments à sauvegarder.
- Étape 3 : Des conditions sont mises en place avec les nœuds 'If' pour vérifier si un fichier doit être créé ou mis à jour.
- Étape 4 : Selon le résultat des conditions, le workflow utilise les nœuds 'Create new file and commit' ou 'Update file content and commit' pour interagir avec l'API GitHub et effectuer les opérations nécessaires. Ce workflow n8n apporte une valeur ajoutée significative en réduisant le risque de perte de données et en améliorant la traçabilité des modifications, ce qui est essentiel pour toute équipe d'automatisation.
Workflow n8n GitHub, sauvegarde, workflows : vue d'ensemble
Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.
Workflow n8n GitHub, sauvegarde, workflows : détail des nœuds
Inscris-toi pour voir l'intégralité du workflow
Inscription gratuite
S'inscrire gratuitementBesoin d'aide ?{
"name": "Backup workflows to git repository",
"nodes": [
{
"id": "b09ae4c6-ad75-4b3b-a78a-4cc2d48b2d24",
"name": "GitHub",
"type": "n8n-nodes-base.github",
"position": [
-40,
-20
],
"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,
"additionalParameters": {}
},
"credentials": {
"githubApi": {
"id": "lSdxakI6ik5M2np2",
"name": "Shashikanth | GitHub account"
}
},
"typeVersion": 1,
"continueOnFail": true,
"alwaysOutputData": true
},
{
"id": "639582ef-f13e-4844-bd10-647718079121",
"name": "Globals",
"type": "n8n-nodes-base.set",
"position": [
-740,
-100
],
"parameters": {
"values": {
"string": [
{
"name": "repo.owner",
"value": "shashikanth171"
},
{
"name": "repo.name",
"value": "n8n-backup"
},
{
"name": "repo.path",
"value": "workflows/"
}
]
},
"options": {}
},
"typeVersion": 1
},
{
"id": "9df89713-220e-43b9-b234-b8f5612629cf",
"name": "n8n",
"type": "n8n-nodes-base.n8n",
"position": [
-500,
-100
],
"parameters": {
"filters": {},
"requestOptions": {}
},
"credentials": {
"n8nApi": {
"id": "RgwFr3HsPUEjFJNO",
"name": "n8n account"
}
},
"typeVersion": 1
},
{
"id": "43a60315-d381-4ac4-be4c-f6a158651a00",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-280,
-100
],
"parameters": {
"options": {}
},
"executeOnce": false,
"typeVersion": 3
},
{
"id": "41a7da89-1c8c-4100-8c30-d0788962efc1",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
160,
-20
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "16a9182d-059d-4774-ba95-654fb4293fdb",
"operator": {
"type": "string",
"operation": "notExists",
"singleValue": true
},
"leftValue": "={{ $json.error }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "ab9246eb-a253-4d76-b33b-5f8f12342542",
"name": "If1",
"type": "n8n-nodes-base.if",
"position": [
1040,
260
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e0c66624-429a-4f1f-bf7b-1cc1b32bad7b",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.content }}",
"rightValue": "={{ $('Loop Over Items').item.json.toJsonString() }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "72e4a5a4-6dfe-4b5c-b57b-7c1c9625e967",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
720,
-40
],
"parameters": {
"jsCode": "let items = $input.all()\n\nfor (item of items) {\n item.json.content = Buffer.from(item.json.content, 'base64').toString('utf8')\n}\n\nreturn items;\n"
},
"typeVersion": 2
},
{
"id": "68f14ac5-14d6-432e-9e6b-25df610eadac",
"name": "Create new file and commit",
"type": "n8n-nodes-base.github",
"position": [
340,
140
],
"parameters": {
"owner": "={{$node[\"Globals\"].json[\"repo\"][\"owner\"]}}",
"filePath": "={{$node[\"Globals\"].json[\"repo\"][\"path\"]}}{{ $('Loop Over Items').item.json.name }}.json",
"resource": "file",
"repository": "={{$node[\"Globals\"].json[\"repo\"][\"name\"]}}",
"fileContent": "={{ $('Loop Over Items').item.json.toJsonString() }}",
"commitMessage": "=[N8N Backup] {{ $('Loop Over Items').item.json.name }}.json"
},
"credentials": {
"githubApi": {
"id": "lSdxakI6ik5M2np2",
"name": "Shashikanth | GitHub account"
}
},
"typeVersion": 1
},
{
"id": "e50f00a3-292c-4285-b767-8d6ee4606575",
"name": "Update file content and commit",
"type": "n8n-nodes-base.github",
"position": [
1400,
460
],
"parameters": {
"owner": "={{$node[\"Globals\"].json[\"repo\"][\"owner\"]}}",
"filePath": "={{$node[\"Globals\"].json[\"repo\"][\"path\"]}}{{ $('Loop Over Items').item.json.name }}.json",
"resource": "file",
"operation": "edit",
"repository": "={{$node[\"Globals\"].json[\"repo\"][\"name\"]}}",
"fileContent": "={{ $('Loop Over Items').item.json.toJsonString() }}",
"commitMessage": "=[N8N Backup] {{ $('Loop Over Items').item.json.name }}.json"
},
"credentials": {
"githubApi": {
"id": "lSdxakI6ik5M2np2",
"name": "Shashikanth | GitHub account"
}
},
"typeVersion": 1
},
{
"id": "4b2d375c-a339-404c-babd-555bd2fc4091",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-960,
-100
],
"parameters": {
"rule": {
"interval": [
{
"field": "minutes"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "ea026e96-0db1-41fd-b003-2f2bf4662696",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1560,
480
],
"parameters": {
"height": 80,
"content": "Workflow changes committed to the repository"
},
"typeVersion": 1
},
{
"id": "9c402daa-6d03-485d-b8a0-58f1b65d396d",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
260
],
"parameters": {
"height": 80,
"content": "Check if there are any changes in the workflow"
},
"typeVersion": 1
},
{
"id": "1d9216d9-bf8d-4945-8a58-22fb1ffc9be8",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
460,
160
],
"parameters": {
"height": 80,
"content": "Create a new file for the workflow"
},
"typeVersion": 1
},
{
"id": "60a3953b-d9f1-4afd-b299-e314116b96c6",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
-120
],
"parameters": {
"height": 80,
"content": "Check if file exists in the repository"
},
"typeVersion": 1
},
{
"id": "6df689fb-cb49-4634-9d1e-59648a1e7219",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
-140
],
"parameters": {
"height": 80,
"content": "Convert the file contents to JSON string"
},
"typeVersion": 1
},
{
"id": "f2340ad0-71a1-4c74-8d90-bcb974b8b305",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-560,
-200
],
"parameters": {
"height": 80,
"content": "Get all workflows"
},
"typeVersion": 1
},
{
"id": "617bea19-341a-4e9d-b6fd-6b417e58d756",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-820,
40
],
"parameters": {
"height": 80,
"content": "Set variables"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"If": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
],
[
{
"node": "Create new file and commit",
"type": "main",
"index": 0
}
]
]
},
"If1": {
"main": [
[
{
"node": "Update file content and commit",
"type": "main",
"index": 0
}
],
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"n8n": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "If1",
"type": "main",
"index": 0
}
]
]
},
"GitHub": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Globals": {
"main": [
[
{
"node": "n8n",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "GitHub",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Globals",
"type": "main",
"index": 0
}
]
]
},
"Create new file and commit": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Update file content and commit": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
}
}
}Workflow n8n GitHub, sauvegarde, workflows : pour qui est ce workflow ?
Ce workflow s'adresse aux équipes de développement et d'automatisation, notamment dans les PME et les startups qui utilisent GitHub pour la gestion de leurs projets. Un niveau technique intermédiaire est recommandé pour la mise en place et la personnalisation de ce workflow.
Workflow n8n GitHub, sauvegarde, workflows : problème résolu
Ce workflow résout le problème de la perte potentielle de configurations de workflows en automatisant leur sauvegarde dans un dépôt GitHub. Les utilisateurs n'ont plus à se soucier de la gestion manuelle des versions, ce qui réduit les risques d'erreurs humaines et de pertes de données. Après la mise en place, les utilisateurs bénéficient d'une solution fiable pour conserver un historique de leurs workflows, facilitant ainsi la récupération et la collaboration.
Workflow n8n GitHub, sauvegarde, workflows : étapes du workflow
Étape 1 : Le workflow est déclenché par un 'Schedule Trigger' qui définit la fréquence des sauvegardes.
- Étape 1 : Les variables nécessaires sont définies à l'aide du nœud 'Globals'.
- Étape 2 : Les éléments à sauvegarder sont traités avec 'Loop Over Items'.
- Étape 3 : Des conditions sont vérifiées avec les nœuds 'If' pour déterminer si un fichier doit être créé ou mis à jour.
- Étape 4 : En fonction des résultats, le workflow utilise 'Create new file and commit' pour créer un nouveau fichier ou 'Update file content and commit' pour mettre à jour un fichier existant sur GitHub.
Workflow n8n GitHub, sauvegarde, workflows : guide de personnalisation
Pour personnaliser ce workflow, commencez par ajuster le 'Schedule Trigger' pour définir la fréquence de sauvegarde selon vos besoins. Modifiez les paramètres du nœud 'GitHub' pour spécifier le propriétaire du dépôt, le chemin du fichier et le message de commit. Vous pouvez également adapter les conditions dans les nœuds 'If' pour répondre à des critères spécifiques de votre projet. Enfin, assurez-vous que les autorisations d'accès à l'API GitHub sont correctement configurées pour permettre les opérations de création et de mise à jour de fichiers.