Automatisation GitHub avec n8n : gestion des workflows en temps réel
Ce workflow n8n a pour objectif de simplifier la gestion des fichiers sur GitHub en automatisant les processus de création, d'édition et de mise à jour. Dans un contexte où la collaboration sur des projets de développement est essentielle, ce workflow permet aux équipes de gagner du temps et de réduire les erreurs humaines. Parfait pour les développeurs et les équipes techniques, il facilite la synchronisation des fichiers et la gestion des modifications.
- Étape 1 : le déclencheur 'On clicking execute' initie le workflow manuellement.
- Étape 2 : le noeud 'dataArray' prépare les données nécessaires pour les étapes suivantes.
- Étape 3 : une requête HTTP est envoyée vers 'N8N Workflows' pour récupérer les informations des workflows existants.
- Étape 4 : le noeud 'GitHub' vérifie l'état des fichiers dans le dépôt.
- Étape 5 : selon le résultat, le workflow bifurque grâce au noeud 'github_status' pour déterminer si les fichiers sont identiques, différents ou nouveaux.
- Étape 6 : en fonction de la condition, les noeuds 'GitHub Edit' ou 'GitHub Create' sont utilisés pour mettre à jour ou créer des fichiers. Ce workflow offre une valeur ajoutée significative en réduisant les risques d'erreurs et en améliorant l'efficacité des équipes de développement grâce à une automatisation n8n fluide et intuitive.
Workflow n8n GitHub, développement, 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, développement, workflows : détail des nœuds
Inscris-toi pour voir l'intégralité du workflow
Inscription gratuite
S'inscrire gratuitementBesoin d'aide ?{
"nodes": [
{
"name": "On clicking 'execute'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
0,
150
],
"parameters": {},
"typeVersion": 1
},
{
"name": "dataArray",
"type": "n8n-nodes-base.function",
"position": [
450,
300
],
"parameters": {
"functionCode": "const newItems = [];\nfor (item of items[0].json.data) {\n newItems.push({json: item});\n}\nreturn newItems;"
},
"typeVersion": 1
},
{
"name": "N8N Workflows",
"type": "n8n-nodes-base.httpRequest",
"position": [
300,
300
],
"parameters": {
"url": "http://localhost:8443/rest/workflows",
"options": {}
},
"typeVersion": 1
},
{
"name": "GitHub",
"type": "n8n-nodes-base.github",
"position": [
800,
130
],
"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
},
"credentials": {
"githubApi": "GitHub"
},
"typeVersion": 1,
"continueOnFail": true,
"alwaysOutputData": true
},
{
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1000,
300
],
"parameters": {},
"typeVersion": 1
},
{
"name": "N8N Workflow Detail",
"type": "n8n-nodes-base.httpRequest",
"position": [
800,
460
],
"parameters": {
"url": "=http://localhost:8443/rest/workflows/{{$json[\"id\"]}}",
"options": {}
},
"typeVersion": 1
},
{
"name": "github_status",
"type": "n8n-nodes-base.switch",
"position": [
1300,
300
],
"parameters": {
"rules": {
"rules": [
{
"value2": "same"
},
{
"output": 1,
"value2": "different"
},
{
"output": 2,
"value2": "new"
}
]
},
"value1": "={{$json[\"github_status\"]}}",
"dataType": "string"
},
"typeVersion": 1
},
{
"name": "same",
"type": "n8n-nodes-base.noOp",
"position": [
1500,
130
],
"parameters": {},
"typeVersion": 1
},
{
"name": "different",
"type": "n8n-nodes-base.noOp",
"position": [
1500,
300
],
"parameters": {},
"typeVersion": 1
},
{
"name": "new",
"type": "n8n-nodes-base.noOp",
"position": [
1500,
460
],
"parameters": {},
"typeVersion": 1
},
{
"name": "GitHub Edit",
"type": "n8n-nodes-base.github",
"position": [
1700,
180
],
"parameters": {
"owner": "={{$node[\"Globals\"].json[\"repo\"][\"owner\"]}}",
"filePath": "={{$node[\"Globals\"].json[\"repo\"][\"path\"]}}{{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json",
"resource": "file",
"operation": "edit",
"repository": "={{$node[\"Globals\"].json[\"repo\"][\"name\"]}}",
"fileContent": "={{$node[\"isDiffOrNew\"].json[\"n8n_data_stringy\"]}}",
"commitMessage": "=[N8N Backup] {{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json ({{$json[\"github_status\"]}})"
},
"credentials": {
"githubApi": "GitHub"
},
"typeVersion": 1
},
{
"name": "GitHub Create",
"type": "n8n-nodes-base.github",
"position": [
1700,
460
],
"parameters": {
"owner": "={{$node[\"Globals\"].json[\"repo\"][\"owner\"]}}",
"filePath": "={{$node[\"Globals\"].json[\"repo\"][\"path\"]}}{{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json",
"resource": "file",
"repository": "={{$node[\"Globals\"].json[\"repo\"][\"name\"]}}",
"fileContent": "={{$node[\"isDiffOrNew\"].json[\"n8n_data_stringy\"]}}",
"commitMessage": "=[N8N Backup] {{$node[\"N8N Workflow Detail\"].json[\"data\"][\"name\"]}}.json ({{$json[\"github_status\"]}})"
},
"credentials": {
"githubApi": "GitHub"
},
"typeVersion": 1
},
{
"name": "isDiffOrNew",
"type": "n8n-nodes-base.function",
"position": [
1150,
300
],
"parameters": {
"functionCode": "// File Returned with Content\nif (Object.keys(items[0].json).includes(\"content\")) {\n // Get JSON Objects\n var origWorkflow = eval(\"(\"+Buffer.from(items[0].json.content, 'base64').toString()+\")\");\n var n8nWorkflow = (items[1].json.data);\n \n // Order JSON Objects\n var orderedOriginal = {}\n var orderedActual = {}\n \n Object.keys(origWorkflow).sort().forEach(function(key) {\n orderedOriginal[key] = origWorkflow[key];\n });\n \n Object.keys(n8nWorkflow).sort().forEach(function(key) {\n orderedActual[key] = n8nWorkflow[key];\n });\n \n // Determine Difference\n if ( JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual) ) {\n items[0].json.github_status = \"same\";\n items[0].json.content_decoded = orderedOriginal;\n } else {\n items[0].json.github_status = \"different\";\n items[0].json.content_decoded = orderedOriginal;\n items[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n }\n// No File Returned / New Workflow\n} else {\n // Order JSON Object\n var n8nWorkflow = (items[1].json.data);\n var orderedActual = {}\n Object.keys(n8nWorkflow).sort().forEach(function(key) {\n orderedActual[key] = n8nWorkflow[key];\n });\n \n // Proper Formatting\n items[0].json.github_status = \"new\";\n items[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n}\n\n// Return Items\nreturn items;"
},
"typeVersion": 1
},
{
"name": "Daily @ 20:00",
"type": "n8n-nodes-base.cron",
"position": [
0,
450
],
"parameters": {
"triggerTimes": {
"item": [
{
"hour": 20,
"minute": 11
}
]
}
},
"typeVersion": 1
},
{
"name": "OneAtATime",
"type": "n8n-nodes-base.splitInBatches",
"position": [
600,
300
],
"parameters": {
"options": {},
"batchSize": 1
},
"typeVersion": 1
},
{
"name": "Globals",
"type": "n8n-nodes-base.set",
"position": [
150,
300
],
"parameters": {
"values": {
"string": [
{
"name": "repo.owner",
"value": "octocat"
},
{
"name": "repo.name",
"value": "Hello-World"
},
{
"name": "repo.path",
"value": "my-team/n8n/workflows/"
}
]
},
"options": {}
},
"typeVersion": 1
}
],
"connections": {
"new": {
"main": [
[
{
"node": "GitHub Create",
"type": "main",
"index": 0
}
]
]
},
"same": {
"main": [
[
{
"node": "OneAtATime",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "isDiffOrNew",
"type": "main",
"index": 0
}
]
]
},
"GitHub": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Globals": {
"main": [
[
{
"node": "N8N Workflows",
"type": "main",
"index": 0
}
]
]
},
"dataArray": {
"main": [
[
{
"node": "OneAtATime",
"type": "main",
"index": 0
}
]
]
},
"different": {
"main": [
[
{
"node": "GitHub Edit",
"type": "main",
"index": 0
}
]
]
},
"OneAtATime": {
"main": [
[
{
"node": "GitHub",
"type": "main",
"index": 0
},
{
"node": "N8N Workflow Detail",
"type": "main",
"index": 0
}
]
]
},
"GitHub Edit": {
"main": [
[
{
"node": "OneAtATime",
"type": "main",
"index": 0
}
]
]
},
"isDiffOrNew": {
"main": [
[
{
"node": "github_status",
"type": "main",
"index": 0
}
]
]
},
"Daily @ 20:00": {
"main": [
[
{
"node": "Globals",
"type": "main",
"index": 0
}
]
]
},
"GitHub Create": {
"main": [
[
{
"node": "OneAtATime",
"type": "main",
"index": 0
}
]
]
},
"N8N Workflows": {
"main": [
[
{
"node": "dataArray",
"type": "main",
"index": 0
}
]
]
},
"github_status": {
"main": [
[
{
"node": "same",
"type": "main",
"index": 0
}
],
[
{
"node": "different",
"type": "main",
"index": 0
}
],
[
{
"node": "new",
"type": "main",
"index": 0
}
]
]
},
"N8N Workflow Detail": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"On clicking 'execute'": {
"main": [
[
{
"node": "Globals",
"type": "main",
"index": 0
}
]
]
}
}
}Workflow n8n GitHub, développement, workflows : pour qui est ce workflow ?
Ce workflow s'adresse principalement aux développeurs et aux équipes techniques qui utilisent GitHub pour la gestion de leurs projets. Il est idéal pour les entreprises de taille moyenne à grande qui cherchent à automatiser leurs processus de développement tout en minimisant les erreurs humaines.
Workflow n8n GitHub, développement, workflows : problème résolu
Ce workflow résout le problème de la gestion manuelle des fichiers sur GitHub, qui peut être source d'erreurs et de pertes de temps. En automatisant la création et l'édition de fichiers, il permet aux utilisateurs de se concentrer sur des tâches à plus forte valeur ajoutée. Les équipes bénéficient d'une meilleure synchronisation et d'une réduction des risques liés aux modifications manuelles.
Workflow n8n GitHub, développement, workflows : étapes du workflow
Étape 1 : le workflow commence par un déclencheur manuel qui active le processus.
- Étape 1 : les données sont préparées par le noeud 'dataArray'.
- Étape 2 : une requête HTTP est envoyée pour récupérer les workflows existants via le noeud 'N8N Workflows'.
- Étape 3 : le noeud 'GitHub' vérifie l'état des fichiers dans le dépôt.
- Étape 4 : en fonction du résultat, le workflow bifurque grâce au noeud 'github_status', déterminant si les fichiers sont identiques, différents ou nouveaux.
- Étape 5 : si les fichiers sont différents ou nouveaux, les noeuds 'GitHub Edit' ou 'GitHub Create' sont utilisés pour mettre à jour ou créer des fichiers.
- Étape 6 : le processus se termine par l'exécution des actions appropriées selon les résultats des vérifications.
Workflow n8n GitHub, développement, workflows : guide de personnalisation
Pour personnaliser ce workflow, vous pouvez modifier les paramètres des noeuds GitHub, tels que le propriétaire du dépôt, le chemin du fichier et le contenu du fichier à créer ou à éditer. Il est également possible d'ajuster le déclencheur pour qu'il soit programmé à des moments spécifiques en remplaçant le noeud manuel par un déclencheur cron. Pensez à sécuriser vos accès API et à surveiller les logs pour assurer le bon fonctionnement de l'automatisation. Vous pouvez également intégrer d'autres services n8n pour enrichir le workflow selon vos besoins.