Sauvegarde des workflows vers GitHub
Avancé
Ceci est unDevOpsworkflow d'automatisation du domainecontenant 23 nœuds.Utilise principalement des nœuds comme If, N8n, Set, Merge, Slack. Sauvegarde automatisée des workflows vers GitHub avec création de PR et notifications Slack
Prérequis
- •Token Bot Slack ou URL Webhook
- •Personal Access Token GitHub
- •Peut nécessiter les informations d'identification d'authentification de l'API cible
Nœuds utilisés (23)
Catégorie
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
"id": "GZqZRs30KLvYLk4T",
"meta": {
"instanceId": "e76981884963d13b9deb7bc5a6b15daf6838937e1dd529f22f2c146d8b79cae4",
"templateCredsSetupCompleted": true
},
"name": "Backup workflows to GitHub",
"tags": [],
"nodes": [
{
"id": "3abc6972-965d-4333-b1d2-d7097ea077da",
"name": "n8n",
"type": "n8n-nodes-base.n8n",
"position": [
660,
-300
],
"parameters": {
"filters": {},
"requestOptions": {}
},
"credentials": {
"n8nApi": {
"id": "f2iSnAHCaePA8jyU",
"name": "n8n account"
}
},
"typeVersion": 1
},
{
"id": "9c386d7c-dc48-4f92-bc2f-5c5772e931f8",
"name": "Rechercher les nouveaux workflows",
"type": "n8n-nodes-base.merge",
"position": [
880,
-250
],
"parameters": {
"mode": "combine",
"options": {},
"joinMode": "keepNonMatches",
"outputDataFrom": "input1",
"fieldsToMatchString": "id"
},
"typeVersion": 3.1,
"alwaysOutputData": true
},
{
"id": "a82b074d-b12f-49f9-a69b-492847bb3dfd",
"name": "Rechercher les workflows mis à jour",
"type": "n8n-nodes-base.merge",
"position": [
880,
0
],
"parameters": {
"mode": "combine",
"options": {},
"joinMode": "keepNonMatches",
"outputDataFrom": "input1",
"fieldsToMatchString": "id, updatedAt"
},
"typeVersion": 3.1,
"alwaysOutputData": true
},
{
"id": "8d6181f4-873b-46ad-aa88-a6005f78e618",
"name": "Attendre la fin de création/modification de fichier sur GitHub",
"type": "n8n-nodes-base.merge",
"position": [
2680,
-140
],
"parameters": {},
"typeVersion": 3.1
},
{
"id": "aefdbaf3-bbb9-426b-bc01-1dfd1f094a87",
"name": "Créer une nouvelle PR via GitHub API",
"type": "n8n-nodes-base.httpRequest",
"position": [
2900,
-140
],
"parameters": {
"url": "=https://api.github.com/repos/{{ $('Define Local Variables').item.json.github_owner }}/{{ $('Define Local Variables').item.json.repo_name }}/pulls",
"method": "POST",
"options": {},
"jsonBody": "={\n\"title\": \"Automated PR for {{ $('Define Local Variables').item.json.branch_name }}\",\n\"body\": \"\",\n\"head\": \"{{ $('Define Local Variables').item.json.branch_name }}\",\n\"base\": \"main\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "R8n2QZnsA7dlSq4d",
"name": "GitHub account"
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "bdcd0ef4-ebcd-43fc-b320-ee62bb3b9c71",
"name": "Définir les variables locales",
"type": "n8n-nodes-base.set",
"position": [
40,
-160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "575b2ca9-528f-421f-8352-073c916fcd63",
"name": "branch_name",
"type": "string",
"value": "=workflows_{{ $now.format('yyyy-MM-dd-hh-mm-ss')}}"
},
{
"id": "6f7a1168-1c55-4e50-b7d2-0868104ee1db",
"name": "github_owner",
"type": "string",
"value": "duynb92"
},
{
"id": "9c8cf8ba-9e64-4fb5-ba38-8429264c84dd",
"name": "repo_name",
"type": "string",
"value": "n8n-workflows"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "b74a8a0c-5205-47fd-a9c9-60d8299a4254",
"name": "Obtenir tous les workflows sur GitHub",
"type": "n8n-nodes-base.github",
"position": [
220,
50
],
"webhookId": "481a47c9-57bf-4c5f-a9c8-7246190c4b3c",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.github_owner }}"
},
"filePath": "workflows",
"resource": "file",
"operation": "list",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.repo_name }}"
}
},
"credentials": {
"githubApi": {
"id": "R8n2QZnsA7dlSq4d",
"name": "GitHub account"
}
},
"typeVersion": 1.1
},
{
"id": "fd86d8e4-948e-4679-a995-87fcad2ceaaf",
"name": "Obtenir le contenu de chaque workflow",
"type": "n8n-nodes-base.github",
"position": [
440,
50
],
"webhookId": "bfb94e71-96eb-4fc3-9fe0-1b5255d48b53",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.github_owner }}"
},
"filePath": "={{ $json.path }}",
"resource": "file",
"operation": "get",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.repo_name }}"
},
"asBinaryProperty": false,
"additionalParameters": {}
},
"credentials": {
"githubApi": {
"id": "R8n2QZnsA7dlSq4d",
"name": "GitHub account"
}
},
"typeVersion": 1.1
},
{
"id": "60b86288-22cd-460e-9da2-67de123b1cb1",
"name": "Décoder le contenu du workflow en Base64",
"type": "n8n-nodes-base.set",
"position": [
660,
50
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{ $json.content.base64Decode() }}"
},
"typeVersion": 3.4
},
{
"id": "fc4d4f78-e6b3-418f-8c4f-8ad70eb5a32b",
"name": "Attendre la fin",
"type": "n8n-nodes-base.merge",
"position": [
1100,
-125
],
"parameters": {
"mode": "chooseBranch",
"output": "empty"
},
"typeVersion": 3.1
},
{
"id": "08db5cda-4059-4e96-9732-63bc824daa5d",
"name": "S'il y a des changements dans les workflows",
"type": "n8n-nodes-base.if",
"position": [
1320,
-125
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "cec5563a-01dd-4372-882a-2114c8e476a7",
"operator": {
"type": "array",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $('Find updated workflows').all() }}",
"rightValue": ""
},
{
"id": "fb800963-acc7-495f-8bf2-c29c3b3d0450",
"operator": {
"type": "array",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $('Find new workflows').all() }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "45369a54-bc73-4287-9037-1286d8a9690d",
"name": "Aucune opération, ne rien faire",
"type": "n8n-nodes-base.noOp",
"position": [
1560,
160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "d8b8a670-3ea1-4d5f-86e9-537f72d964fc",
"name": "Créer une nouvelle branche via GitHub API",
"type": "n8n-nodes-base.httpRequest",
"position": [
1760,
-125
],
"parameters": {
"url": "=https://api.github.com/repos/{{ $('Define Local Variables').item.json.github_owner }}/{{ $('Define Local Variables').item.json.repo_name }}/git/refs",
"method": "POST",
"options": {},
"jsonBody": "={\n \"ref\": \"refs/heads/{{ $('Define Local Variables').item.json.branch_name }}\",\n \"sha\": \"{{ $json.object.sha }}\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "R8n2QZnsA7dlSq4d",
"name": "GitHub account"
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "4292f0e4-3012-4165-bcda-e4a1519ca80c",
"name": "Obtenir le dernier SHA de commit sur main via GitHub API",
"type": "n8n-nodes-base.httpRequest",
"position": [
1540,
-125
],
"parameters": {
"url": "=https://api.github.com/repos/{{ $('Define Local Variables').item.json.github_owner }}/{{ $('Define Local Variables').item.json.repo_name }}/git/ref/heads/main",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "R8n2QZnsA7dlSq4d",
"name": "GitHub account"
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "d0d727d9-f547-440b-8213-9ec5ce23c1fa",
"name": "Attendre la création de la branche",
"type": "n8n-nodes-base.merge",
"position": [
1980,
0
],
"parameters": {
"mode": "chooseBranch",
"useDataOfInput": 2
},
"typeVersion": 3.1,
"alwaysOutputData": false
},
{
"id": "89f36b7c-6de1-4069-83bd-8b6aeed4a069",
"name": "Attendre la création de la branche1",
"type": "n8n-nodes-base.merge",
"position": [
1980,
-250
],
"parameters": {
"mode": "chooseBranch",
"useDataOfInput": 2
},
"typeVersion": 3.1,
"alwaysOutputData": false
},
{
"id": "f8088f5b-cb9a-40eb-ab8f-de6aeddfdaa6",
"name": "Filtrer les données vides",
"type": "n8n-nodes-base.filter",
"notes": "Empty data can happen because 'Find new workflows' always output data",
"position": [
2200,
-250
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "835f2dab-de42-4c97-a747-47b23d55c990",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.id }}",
"rightValue": ""
}
]
}
},
"notesInFlow": true,
"typeVersion": 2.2
},
{
"id": "157955f3-88bf-448d-b424-c71ba32d4fb5",
"name": "Filtrer les données vides1",
"type": "n8n-nodes-base.filter",
"notes": "Empty data can happen because 'Find updated workflows' always output data",
"position": [
2200,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1d8312fd-5157-4058-823c-35f7574541fa",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.id }}",
"rightValue": ""
}
]
}
},
"notesInFlow": true,
"typeVersion": 2.2
},
{
"id": "0c3e9957-d4e8-4b30-b368-7698087b37e7",
"name": "Créer un nouveau commit pour ajouter un workflow",
"type": "n8n-nodes-base.github",
"position": [
2420,
-250
],
"webhookId": "843c09e3-953a-40c4-a208-38acdd2ea466",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.github_owner }}"
},
"filePath": "=workflows/{{ $json.id }}.json",
"resource": "file",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.repo_name }}"
},
"fileContent": "={{ $json.toJsonString() }}",
"commitMessage": "=Add new workflow {{ $json.id }}",
"additionalParameters": {
"branch": {
"branch": "={{ $('Define Local Variables').item.json.branch_name }}"
}
}
},
"credentials": {
"githubApi": {
"id": "R8n2QZnsA7dlSq4d",
"name": "GitHub account"
}
},
"typeVersion": 1.1
},
{
"id": "fd5091b9-7c6e-4408-8656-4dac64f10088",
"name": "Créer un nouveau commit pour mettre à jour un workflow modifié",
"type": "n8n-nodes-base.github",
"position": [
2420,
0
],
"webhookId": "843c09e3-953a-40c4-a208-38acdd2ea466",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.github_owner }}"
},
"filePath": "=workflows/{{ $json.id }}.json",
"resource": "file",
"operation": "edit",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ $('Define Local Variables').item.json.repo_name }}"
},
"fileContent": "={{ $json.toJsonString() }}",
"commitMessage": "=Update workflow {{ $json.id }}",
"additionalParameters": {
"branch": {
"branch": "={{ $('Define Local Variables').item.json.branch_name }}"
}
}
},
"credentials": {
"githubApi": {
"id": "R8n2QZnsA7dlSq4d",
"name": "GitHub account"
}
},
"typeVersion": 1.1
},
{
"id": "63a97673-c96e-43ca-b3b2-cf264b2b1381",
"name": "Slack",
"type": "n8n-nodes-base.slack",
"position": [
3120,
-140
],
"webhookId": "799530a9-9c2f-482e-9265-a2d58663223e",
"parameters": {
"text": "=:firework: {{ $workflow.name }} executed succesfully. \nIt created a new <{{ $json.html_url }}|GitHub PR>.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C08NZ6D9CRF",
"cachedResultName": "n8n-notifications"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "gz8u4Mu9o2dA9gbl",
"name": "Slack Bot Access Token"
}
},
"typeVersion": 2.3
},
{
"id": "1ea514d9-bf41-4de4-938a-68bde8be660b",
"name": "Cliquez pour déclencher",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-200,
-160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "aa9c2d16-d87b-42a6-b8af-6785fe212eee",
"name": "Note autocollante",
"type": "n8n-nodes-base.stickyNote",
"position": [
-280,
-500
],
"parameters": {
"width": 280,
"height": 260,
"content": "## Setup\n1. GitHub credentials: Add your GitHub API credentials in n8n.\n2. Slack integration: Connect your Slack Bot token if you want PR notifications.\n3. Repository details: Update github_owner, repo_name, and workflow directory path in the “Define Local Variables” node.\n4. n8n API key - [Check this doc](https://docs.n8n.io/api/authentication/)"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "c2e49f18-b2a4-4ced-a1a7-67dc69926a78",
"connections": {
"3abc6972-965d-4333-b1d2-d7097ea077da": {
"main": [
[
{
"node": "9c386d7c-dc48-4f92-bc2f-5c5772e931f8",
"type": "main",
"index": 0
},
{
"node": "a82b074d-b12f-49f9-a69b-492847bb3dfd",
"type": "main",
"index": 0
}
]
]
},
"f8088f5b-cb9a-40eb-ab8f-de6aeddfdaa6": {
"main": [
[
{
"node": "0c3e9957-d4e8-4b30-b368-7698087b37e7",
"type": "main",
"index": 0
}
]
]
},
"fc4d4f78-e6b3-418f-8c4f-8ad70eb5a32b": {
"main": [
[
{
"node": "08db5cda-4059-4e96-9732-63bc824daa5d",
"type": "main",
"index": 0
}
]
]
},
"157955f3-88bf-448d-b424-c71ba32d4fb5": {
"main": [
[
{
"node": "fd5091b9-7c6e-4408-8656-4dac64f10088",
"type": "main",
"index": 0
}
]
]
},
"9c386d7c-dc48-4f92-bc2f-5c5772e931f8": {
"main": [
[
{
"node": "89f36b7c-6de1-4069-83bd-8b6aeed4a069",
"type": "main",
"index": 1
},
{
"node": "fc4d4f78-e6b3-418f-8c4f-8ad70eb5a32b",
"type": "main",
"index": 0
}
]
]
},
"1ea514d9-bf41-4de4-938a-68bde8be660b": {
"main": [
[
{
"node": "bdcd0ef4-ebcd-43fc-b320-ee62bb3b9c71",
"type": "main",
"index": 0
}
]
]
},
"bdcd0ef4-ebcd-43fc-b320-ee62bb3b9c71": {
"main": [
[
{
"node": "3abc6972-965d-4333-b1d2-d7097ea077da",
"type": "main",
"index": 0
},
{
"node": "b74a8a0c-5205-47fd-a9c9-60d8299a4254",
"type": "main",
"index": 0
}
]
]
},
"a82b074d-b12f-49f9-a69b-492847bb3dfd": {
"main": [
[
{
"node": "fc4d4f78-e6b3-418f-8c4f-8ad70eb5a32b",
"type": "main",
"index": 1
},
{
"node": "d0d727d9-f547-440b-8213-9ec5ce23c1fa",
"type": "main",
"index": 1
}
]
]
},
"d0d727d9-f547-440b-8213-9ec5ce23c1fa": {
"main": [
[
{
"node": "157955f3-88bf-448d-b424-c71ba32d4fb5",
"type": "main",
"index": 0
}
]
]
},
"89f36b7c-6de1-4069-83bd-8b6aeed4a069": {
"main": [
[
{
"node": "f8088f5b-cb9a-40eb-ab8f-de6aeddfdaa6",
"type": "main",
"index": 0
}
]
]
},
"b74a8a0c-5205-47fd-a9c9-60d8299a4254": {
"main": [
[
{
"node": "fd86d8e4-948e-4679-a995-87fcad2ceaaf",
"type": "main",
"index": 0
}
]
]
},
"aefdbaf3-bbb9-426b-bc01-1dfd1f094a87": {
"main": [
[
{
"node": "63a97673-c96e-43ca-b3b2-cf264b2b1381",
"type": "main",
"index": 0
}
]
]
},
"60b86288-22cd-460e-9da2-67de123b1cb1": {
"main": [
[
{
"node": "a82b074d-b12f-49f9-a69b-492847bb3dfd",
"type": "main",
"index": 1
},
{
"node": "9c386d7c-dc48-4f92-bc2f-5c5772e931f8",
"type": "main",
"index": 1
}
]
]
},
"fd86d8e4-948e-4679-a995-87fcad2ceaaf": {
"main": [
[
{
"node": "60b86288-22cd-460e-9da2-67de123b1cb1",
"type": "main",
"index": 0
}
]
]
},
"d8b8a670-3ea1-4d5f-86e9-537f72d964fc": {
"main": [
[
{
"node": "89f36b7c-6de1-4069-83bd-8b6aeed4a069",
"type": "main",
"index": 0
},
{
"node": "d0d727d9-f547-440b-8213-9ec5ce23c1fa",
"type": "main",
"index": 0
}
]
]
},
"0c3e9957-d4e8-4b30-b368-7698087b37e7": {
"main": [
[
{
"node": "8d6181f4-873b-46ad-aa88-a6005f78e618",
"type": "main",
"index": 0
}
]
]
},
"08db5cda-4059-4e96-9732-63bc824daa5d": {
"main": [
[
{
"node": "4292f0e4-3012-4165-bcda-e4a1519ca80c",
"type": "main",
"index": 0
}
],
[
{
"node": "45369a54-bc73-4287-9037-1286d8a9690d",
"type": "main",
"index": 0
}
]
]
},
"8d6181f4-873b-46ad-aa88-a6005f78e618": {
"main": [
[
{
"node": "aefdbaf3-bbb9-426b-bc01-1dfd1f094a87",
"type": "main",
"index": 0
}
]
]
},
"fd5091b9-7c6e-4408-8656-4dac64f10088": {
"main": [
[
{
"node": "8d6181f4-873b-46ad-aa88-a6005f78e618",
"type": "main",
"index": 1
}
]
]
},
"4292f0e4-3012-4165-bcda-e4a1519ca80c": {
"main": [
[
{
"node": "d8b8a670-3ea1-4d5f-86e9-537f72d964fc",
"type": "main",
"index": 0
}
]
]
}
}
}Foire aux questions
Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - DevOps
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Sauvegarde automatisée des workflows n8n vers GitHub avec suivi des suppressions
Sauvegarde automatisée des workflows n8n vers GitHub et suivi des suppressions
If
N8n
Set
+
If
N8n
Set
31 NœudsMarcial Ambriz
DevOps
Enregistrez vos workflows dans un dépôt GitHub
Sauvegarde quotidienne du flux de travail vers GitHub et envoi d'une notification Slack
If
N8n
Set
+
If
N8n
Set
18 NœudsAndrew
DevOps
Tableau de bord de synchronisation GitHub - V2
Tableau de versionning des workflows GitHub avec historique de commits et fonction de rollback
If
N8n
Set
+
If
N8n
Set
94 NœudsEduard
DevOps
Synchronisation bidirectionnelle des processus Typebot et GitHub, avec l'API Typebot
Synchronisation bidirectionnelle entre les processus Typebot et GitHub, via l'API Typebot
If
Set
Code
+
If
Set
Code
31 NœudsMarcial Ambriz
DevOps
Sauvegarde des workflows sur GitHub (sous-dossier)
Sauvegarde des workflows dans GitHub (sous-dossier)
If
N8n
Set
+
If
N8n
Set
25 NœudsNazmy
Autres
Sauvegarde des workflows sur GitHub
Sauvegarde des workflows dans GitHub
If
N8n
Set
+
If
N8n
Set
23 NœudsSolomon
Autres
Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds23
Catégorie1
Types de nœuds11
Description de la difficulté
Auteur
Bao Duy Nguyen
@duynbLiens externes
Voir sur n8n.io →
Partager ce workflow