Workflow n8n

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.
Tags clés :GitHubautomatisationn8ndéveloppementworkflows
Catégorie: Manual · Tags: GitHub, automatisation, n8n, développement, workflows0

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

  • On clicking 'execute'

    Déclenche le workflow manuellement lorsque l'utilisateur clique sur 'exécuter'.

  • dataArray

    Exécute un code JavaScript pour traiter ou manipuler un tableau de données.

  • N8N Workflows

    Effectue une requête HTTP vers une URL spécifiée pour récupérer des données.

  • GitHub

    Interagit avec l'API GitHub pour effectuer des opérations sur des fichiers dans un dépôt.

  • Merge

    Fusionne les données provenant de plusieurs flux en un seul.

  • N8N Workflow Detail

    Effectue une requête HTTP pour obtenir des détails sur un workflow N8N.

  • github_status

    Évalue une condition basée sur des règles définies et dirige le flux en conséquence.

  • same

    N'effectue aucune opération, servant de point de passage dans le workflow.

  • different

    N'effectue aucune opération, servant de point de passage dans le workflow.

  • new

    N'effectue aucune opération, servant de point de passage dans le workflow.

  • GitHub Edit

    Modifie un fichier existant dans un dépôt GitHub via l'API.

  • GitHub Create

    Crée un nouveau fichier dans un dépôt GitHub en utilisant l'API.

  • isDiffOrNew

    Exécute un code JavaScript pour déterminer si les données sont différentes ou nouvelles.

  • Daily @ 20:00

    Déclenche le workflow quotidiennement à 20h00.

  • OneAtATime

    Divise les données en lots pour un traitement séquentiel.

  • Globals

    Définit des valeurs globales qui peuvent être utilisées dans tout le workflow.

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.