Sauvegarde quotidienne des workflows sur GitLab avec notification Slack

Avancé

Ceci est uncontenant 22 nœuds.Utilise principalement des nœuds comme If, N8n, Set, Code, Slack. Sauvegarde quotidienne du flux de travail vers GitLab et envoi d'une notification Slack

Prérequis
  • Token Bot Slack ou URL Webhook
  • Personal Access Token GitLab

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
{
  "meta": {
    "instanceId": "cfcdd4aa7acb600106c0a4bff4e6959e8e3b32b3b8cbc7d93531b2a4c9012a32"
  },
  "nodes": [
    {
      "id": "05ee377d-5402-46ee-81b4-c56e6115ecd4",
      "name": "Obtenir tous les workflows",
      "type": "n8n-nodes-base.n8n",
      "position": [
        -496,
        16
      ],
      "parameters": {
        "filters": {},
        "requestOptions": {}
      },
      "credentials": {
        "n8nApi": {
          "id": "L1VsfzLKd4G6IpiP",
          "name": "backup-internal"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f107d96b-26cf-47ad-97fc-83f64c7b621e",
      "name": "Exclure les workflows archivés",
      "type": "n8n-nodes-base.filter",
      "position": [
        -336,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3d21f751-35bf-439c-8536-ff5e8968672e",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.isArchived }}",
              "rightValue": "true"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "67333676-710a-4721-82a4-f9288366c6d0",
      "name": "Convertir en fichier",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        240,
        112
      ],
      "parameters": {
        "mode": "each",
        "options": {
          "format": true
        },
        "operation": "toJson"
      },
      "typeVersion": 1.1
    },
    {
      "id": "2d508a48-be41-40cd-be68-2aad83038cce",
      "name": "Si fichier existe",
      "type": "n8n-nodes-base.if",
      "position": [
        400,
        112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "9798deb6-300a-48ff-9f5c-a581b2d941a7",
              "operator": {
                "type": "array",
                "operation": "contains",
                "rightType": "any"
              },
              "leftValue": "={{ $('List of Names').item.json.name }}",
              "rightValue": "={{ $('Process Each File').item.json.name }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b816f0b9-26b1-438d-877a-d1d4ad86fe89",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        -992,
        16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "558377f5-54a6-4dd2-872a-dd1fa8f1fc9f",
              "name": "project_owner",
              "type": "string",
              "value": "PROJECT_OWNER e.g. mookielian"
            },
            {
              "id": "063bbfbf-697e-4825-8c68-af5cc7b6aa2d",
              "name": "project_name",
              "type": "string",
              "value": "PROJECT_NAME e.g. n8n"
            },
            {
              "id": "7938d2e2-b203-45fc-8432-f9f3ac241946",
              "name": "branch",
              "type": "string",
              "value": "main"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "517ef436-5323-4ffc-8ead-5c303930987e",
      "name": "Liste des noms",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        -656,
        16
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "name"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5befe173-4171-4107-be94-4c5ad235ca76",
      "name": "Créer un nouveau fichier - GitLab",
      "type": "n8n-nodes-base.gitlab",
      "onError": "continueErrorOutput",
      "position": [
        560,
        192
      ],
      "parameters": {
        "owner": "={{ $('Configuration').item.json.project_owner }}",
        "branch": "={{ $('Configuration').item.json.branch }}",
        "filePath": "={{ $('Process Each File').item.json.name }}",
        "resource": "file",
        "binaryData": true,
        "repository": "={{ $('Configuration').item.json.project_name }}",
        "commitMessage": "=File created! {{ $('Process Each File').item.json.name }}"
      },
      "credentials": {
        "gitlabApi": {
          "id": "CV2TdcFVqfePX5QH",
          "name": "GitLab Account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "20270a8c-ac47-4449-a506-618fe2362e17",
      "name": "Mettre à jour le fichier - GitLab",
      "type": "n8n-nodes-base.gitlab",
      "onError": "continueErrorOutput",
      "position": [
        560,
        0
      ],
      "parameters": {
        "owner": "={{ $('Configuration').item.json.project_owner }}",
        "branch": "={{ $('Configuration').item.json.branch }}",
        "filePath": "={{ $('Process Each File').item.json.name }}",
        "resource": "file",
        "operation": "edit",
        "binaryData": true,
        "repository": "={{ $('Configuration').item.json.project_name }}",
        "commitMessage": "=File was updated! {{ $('Process Each File').item.json.name }}"
      },
      "credentials": {
        "gitlabApi": {
          "id": "CV2TdcFVqfePX5QH",
          "name": "GitLab Account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "62bc4120-f641-456d-ae3c-2d450941ebe6",
      "name": "Lister tous les fichiers - GitLab",
      "type": "n8n-nodes-base.gitlab",
      "position": [
        -832,
        16
      ],
      "parameters": {
        "owner": "={{ $('Configuration').item.json.project_owner }}",
        "resource": "file",
        "operation": "list",
        "returnAll": true,
        "repository": "={{ $('Configuration').item.json.project_name }}",
        "additionalParameters": {}
      },
      "credentials": {
        "gitlabApi": {
          "id": "CV2TdcFVqfePX5QH",
          "name": "GitLab Account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2e8a6259-5530-4e15-babf-febbad2095ac",
      "name": "Déclencheur quotidien",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1136,
        16
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 12
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "de6637b3-1a90-4683-b785-ee168de26cbe",
      "name": "Traiter chaque fichier",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -144,
        16
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "17b4693e-d52c-4f1a-97fa-2c42da170df3",
      "name": "Supprimer les champs inutiles",
      "type": "n8n-nodes-base.code",
      "position": [
        64,
        112
      ],
      "parameters": {
        "jsCode": "return $input.all().map(item => {\n  const { createdAt, updatedAt, id, name, active, isArchived, ...rest } = item.json;\n  return { json: rest };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "d96386b2-75df-49c1-9645-f50a96c92d23",
      "name": "Envoyer un message au canal",
      "type": "n8n-nodes-base.slack",
      "position": [
        64,
        -80
      ],
      "webhookId": "7204c9cc-0e71-46ce-9760-3c49075bc472",
      "parameters": {
        "text": "=*Successful Backup!*\n\n- Execution ID: {{ $execution.id }}\n- Mode: {{ $execution.mode }}\n- Timestamp(Workflow Region): {{$now.toFormat('yyyy-MM-dd HH:mm:ss')}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KF70UXL3",
          "cachedResultName": "backup-notifications"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {
        "slackApi": {
          "id": "jkWLdvbGqIn5uLSh",
          "name": "n8n-backup-bot-v2"
        }
      },
      "executeOnce": true,
      "typeVersion": 2.3
    },
    {
      "id": "25cc4169-c68e-4ed8-a85c-43e432cf5dbf",
      "name": "Nouveau fichier - Échec",
      "type": "n8n-nodes-base.slack",
      "position": [
        752,
        208
      ],
      "webhookId": "5354db33-36b0-4f5b-ba5e-4d902660a1dd",
      "parameters": {
        "text": "=*Failed creating a new file - GitLab.*\n\n- File Name: {{ $('Process Each File').item.json.name }}\n- Error: {{ $json.error }}\n- Workflow State: _active={{ $('Process Each File').item.json.active }}_\n- Execution ID: {{ $execution.id }}\n- Mode: {{ $execution.mode }}\n- Timestamp(Workflow Region): {{$now.toFormat('yyyy-MM-dd HH:mm:ss')}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KF70UXL3",
          "cachedResultName": "backup-notifications"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "id": "jkWLdvbGqIn5uLSh",
          "name": "n8n-backup-bot-v2"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "2a2bad0d-af10-494b-aa21-48c2b1f277c3",
      "name": "Mettre à jour le fichier - Échec",
      "type": "n8n-nodes-base.slack",
      "position": [
        752,
        16
      ],
      "webhookId": "5354db33-36b0-4f5b-ba5e-4d902660a1dd",
      "parameters": {
        "text": "=*Failed updating specified file - GitLab.*\n\n- File Name: {{ $('Process Each File').item.json.name }}\n- Error: {{ $json.error }}\n- Workflow State: _active={{ $('Process Each File').item.json.active }}_\n- Execution ID: {{ $execution.id }}\n- Mode: {{ $execution.mode }}\n- Timestamp(Workflow Region): {{$now.toFormat('yyyy-MM-dd HH:mm:ss')}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KF70UXL3",
          "cachedResultName": "backup-notifications"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "id": "jkWLdvbGqIn5uLSh",
          "name": "n8n-backup-bot-v2"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "48ea9738-ef97-452b-b6ce-10db70d0920c",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1856,
        -240
      ],
      "parameters": {
        "color": 4,
        "width": 400,
        "height": 704,
        "content": "# Welcome\n\n## Summary of Nodes\n\n- Daily Trigger (Customizable)\n- Conf. (GitLab)\n- List All Files (Necessary for comparison)\n- List of Names (Turns all names into an array of single field)\n- Get All Workflows (JSON of all workflows, base code)\n- Discard Archived Workflows (Toggle of if you want to backup archived too)\n- Process Each File (Loop to execute nodes for each workflow)\n  - Remove Unwanted Fields (Returns clean node code of the workflow)\n  - Convert to File (Turns JSON code into a formatted file ready for upload)\n  - If File Exists (Route into two path, Update or Create in GitLab)\n  - Update File - GitLab (Updates existing file, no update if the file is the same)\n  - Update File - Failed (Informs you on Slack about the file that failed)\n  - Create New File - GitLab (Push new file to repo.)\n  - New File - Failed (Informs you about failed file creation)\n- Send Message to Channel (Done branch of loop, success message)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "bbaad52a-b34c-4b43-aad2-cf187bf7c6be",
      "name": "Note adhésive 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1440,
        -240
      ],
      "parameters": {
        "color": 5,
        "width": 2608,
        "height": 704,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "a5eabdaa-c744-4272-868a-7a60740278b9",
      "name": "Note adhésive 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1856,
        480
      ],
      "parameters": {
        "color": 6,
        "width": 3024,
        "height": 336,
        "content": "# CREDENTIALS"
      },
      "typeVersion": 1
    },
    {
      "id": "cdcf207f-0efd-4124-95b3-3d6a329e14c2",
      "name": "Note adhésive 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1840,
        576
      ],
      "parameters": {
        "width": 496,
        "height": 176,
        "content": "## Configuration Node\n\n- Create a project in GitLab.\n- Type the owner of the project as 'project_owner'.\n- Type the name of the project as 'project_name'.\n- Type the branch name. Will create a branch if main doesn't exist."
      },
      "typeVersion": 1
    },
    {
      "id": "45f50d44-40c7-4e04-9e7f-36ee2cc075d4",
      "name": "Note adhésive 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1328,
        576
      ],
      "parameters": {
        "width": 480,
        "height": 176,
        "content": "## GitLab - [Docs](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gitlab/)\n\n- Enter your project settings on GitLab Dashboard.\n- Go to access tokens page and create a new token.\n- Paste in your token in n8n credential and save.\n- No need to change the GitLab server parameter."
      },
      "typeVersion": 1
    },
    {
      "id": "819a6463-8222-47e9-aca2-36e4f20e0489",
      "name": "Note adhésive 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        576
      ],
      "parameters": {
        "width": 496,
        "height": 176,
        "content": "## n8n Internal - [Docs](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.n8n/)\n\n- From left menu and bottom go to your user settings.\n- Go to API Keys page and create a new key.\n- Paste in the API Key in the credential page.\n- As base URL, enter your domain with '/api/v1' at the end and save."
      },
      "typeVersion": 1
    },
    {
      "id": "ef82a762-7d0c-4928-a404-5a1f691aed71",
      "name": "Note adhésive 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        576
      ],
      "parameters": {
        "width": 1440,
        "height": 176,
        "content": "## Slack - [Docs](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/)\n\n- Go to 'api.slack.com/apps' and create an account if you haven't already.\n- Create a new app in your workspace and go to OAuth screen from left menu.\n- Add a redirect URL which is your domain with this at the end: '/rest/oauth2-credential/callback'. In scopes section add these scopes as Bot Token Scopes: chat:write, channels:join, channels:read, groups:read... \n- From OAuth Tokens section copy bot token and paste as access token in n8n credential. From basic information page copy signature secret, paste in n8n credential and save."
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "b816f0b9-26b1-438d-877a-d1d4ad86fe89": {
      "main": [
        [
          {
            "node": "62bc4120-f641-456d-ae3c-2d450941ebe6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2e8a6259-5530-4e15-babf-febbad2095ac": {
      "main": [
        [
          {
            "node": "b816f0b9-26b1-438d-877a-d1d4ad86fe89",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "517ef436-5323-4ffc-8ead-5c303930987e": {
      "main": [
        [
          {
            "node": "05ee377d-5402-46ee-81b4-c56e6115ecd4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2d508a48-be41-40cd-be68-2aad83038cce": {
      "main": [
        [
          {
            "node": "20270a8c-ac47-4449-a506-618fe2362e17",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "5befe173-4171-4107-be94-4c5ad235ca76",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "67333676-710a-4721-82a4-f9288366c6d0": {
      "main": [
        [
          {
            "node": "2d508a48-be41-40cd-be68-2aad83038cce",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "05ee377d-5402-46ee-81b4-c56e6115ecd4": {
      "main": [
        [
          {
            "node": "f107d96b-26cf-47ad-97fc-83f64c7b621e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "25cc4169-c68e-4ed8-a85c-43e432cf5dbf": {
      "main": [
        [
          {
            "node": "de6637b3-1a90-4683-b785-ee168de26cbe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "de6637b3-1a90-4683-b785-ee168de26cbe": {
      "main": [
        [
          {
            "node": "d96386b2-75df-49c1-9645-f50a96c92d23",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "17b4693e-d52c-4f1a-97fa-2c42da170df3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2a2bad0d-af10-494b-aa21-48c2b1f277c3": {
      "main": [
        [
          {
            "node": "de6637b3-1a90-4683-b785-ee168de26cbe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "20270a8c-ac47-4449-a506-618fe2362e17": {
      "main": [
        [
          {
            "node": "de6637b3-1a90-4683-b785-ee168de26cbe",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "2a2bad0d-af10-494b-aa21-48c2b1f277c3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "17b4693e-d52c-4f1a-97fa-2c42da170df3": {
      "main": [
        [
          {
            "node": "67333676-710a-4721-82a4-f9288366c6d0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "62bc4120-f641-456d-ae3c-2d450941ebe6": {
      "main": [
        [
          {
            "node": "517ef436-5323-4ffc-8ead-5c303930987e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5befe173-4171-4107-be94-4c5ad235ca76": {
      "main": [
        [
          {
            "node": "de6637b3-1a90-4683-b785-ee168de26cbe",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "25cc4169-c68e-4ed8-a85c-43e432cf5dbf",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f107d96b-26cf-47ad-97fc-83f64c7b621e": {
      "main": [
        [
          {
            "node": "de6637b3-1a90-4683-b785-ee168de26cbe",
            "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é

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.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds22
Catégorie-
Types de nœuds12
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur

AI Developer & Automation Consultant

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34