AutomationFlowsGeneral › Automate GitLab Merge Requests

Automate GitLab Merge Requests

Original n8n title: Http Schedule (http Request) #5

Http Schedule. Uses httpRequest, splitInBatches, scheduleTrigger. Scheduled trigger; 10 nodes.

Cron / scheduled trigger★★★★☆ complexity10 nodesHTTP Request
General Trigger: Cron / scheduled Nodes: 10 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "b9a807c3-5847-477a-a242-2fdf5b15ba7e",
      "name": "API to Check existing merge request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -840,
        -20
      ],
      "parameters": {
        "url": "=https://gitlab.com/<projectid>/merge_requests",
        "options": {
          "allowUnauthorizedCerts": false
        },
        "sendQuery": true,
        "sendHeaders": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "state",
              "value": "opened"
            },
            {
              "name": "source_branch",
              "value": "=sourceBranchName"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN",
              "value": "=gitlabToken"
            }
          ]
        }
      },
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "id": "42270a5a-d696-44f3-b2f5-16b2ddb3488c",
      "name": "Is Exists",
      "type": "n8n-nodes-base.if",
      "position": [
        -660,
        -20
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "d895b8cc-5679-442f-a1bf-d8375174a24b",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $node[\"API to Check existing merge request\"].data.isEmpty() }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d380c943-0525-4976-9e70-c90de1177f0c",
      "name": "Create New Merge Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -440,
        -200
      ],
      "parameters": {
        "url": "=https://gitlab.com/<projectid>/merge_requests",
        "method": "POST",
        "options": {
          "allowUnauthorizedCerts": false
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "source_branch",
              "value": "=sourceBranchName"
            },
            {
              "name": "target_branch",
              "value": "=targetBranchName"
            },
            {
              "name": "title",
              "value": "=mergeTitle"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN",
              "value": "=gitlabToken"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "600a0ed5-cb68-4479-8aee-55b55f0d8630",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -440,
        160
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "555643cb-761c-41ec-b983-8e0194851a8d",
      "name": "API to CLOSE existing Merge Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -220,
        180
      ],
      "parameters": {
        "url": "=https://gitlab.com/<projectid>/merge_requests/<merge_iid>",
        "method": "PUT",
        "options": {
          "allowUnauthorizedCerts": false
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "state_event",
              "value": "close"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN",
              "value": "=gitlabToken"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "0c94b06a-80e3-4e50-8bac-2bd4015f085e",
      "name": "Add Custom Notes To Merge Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -220,
        -200
      ],
      "parameters": {
        "url": "=https://gitlab.com/<projectid>/merge_requests/<merge_iid>/notes",
        "method": "POST",
        "options": {
          "allowUnauthorizedCerts": false
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "body",
              "value": "=<mergeComments>"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN",
              "value": "=gitlabToken"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8e849f4f-2a52-46ba-9e0a-17126a8d966c",
      "name": "30 secs wait to approve merge request and pipeline to finish1",
      "type": "n8n-nodes-base.wait",
      "position": [
        140,
        -200
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "05cca829-b2df-4c1e-9441-56349acc4a0d",
      "name": "Merge When Pipeline Succeeds",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        720,
        -200
      ],
      "parameters": {
        "url": "=https://gitlab.com/<projectid>/merge_requests/<merge_iid>/merge",
        "method": "PUT",
        "options": {
          "allowUnauthorizedCerts": false
        },
        "jsonBody": "={\n\"merge_when_pipeline_succeeds\": {{ $('setValueForMerge').item.json.merge_when_pipeline_succeeds }},\n  \"should_remove_source_branch\": {{ $('setValueForMerge').item.json.should_remove_source_branch }}\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN",
              "value": "=gitlabToken"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "e3ce9cdc-5484-4b4b-8701-6b9089a1f76d",
      "name": "setValueForMerge",
      "type": "n8n-nodes-base.set",
      "position": [
        460,
        -200
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a22922c7-0c69-4ac1-bd15-4d289fa57737",
              "name": "merge_when_pipeline_succeeds",
              "type": "boolean",
              "value": false
            },
            {
              "id": "17580668-84d9-4ad6-b93b-e7b6c9c0f8ea",
              "name": "should_remove_source_branch",
              "type": "boolean",
              "value": true
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0d49ec98-4806-492e-a6c2-a298ed8bb11a",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1160,
        -20
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    }
  ],
  "connections": {
    "Is Exists": {
      "main": [
        [
          {
            "node": "Create New Merge Request",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "API to Check existing merge request",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "API to CLOSE existing Merge Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "API to Check existing merge request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "setValueForMerge": {
      "main": [
        [
          {
            "node": "Merge When Pipeline Succeeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create New Merge Request": {
      "main": [
        [
          {
            "node": "Add Custom Notes To Merge Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Custom Notes To Merge Request": {
      "main": [
        [
          {
            "node": "30 secs wait to approve merge request and pipeline to finish1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "API to CLOSE existing Merge Request": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "API to Check existing merge request": {
      "main": [
        [
          {
            "node": "Is Exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "30 secs wait to approve merge request and pipeline to finish1": {
      "main": [
        [
          {
            "node": "setValueForMerge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow automates the management of merge requests in your GitLab repository, ensuring that outdated or conflicting requests are efficiently updated or closed to keep your development pipeline smooth and error-free. It's ideal for development teams handling frequent code contributions, where manual oversight can lead to delays or overlooked issues. The key step involves checking for existing merge requests via the httpRequest node, then either creating new ones or closing old ones with custom notes, followed by a wait period to allow pipelines to complete before merging.

Use this workflow when you need regular, automated housekeeping for merge requests on a cron schedule, such as daily or weekly, to maintain repository hygiene without constant manual intervention. Avoid it for one-off tasks or repositories with minimal activity, as the scheduling overhead isn't justified. Common variations include adjusting the wait time for longer pipelines or integrating with Slack for notifications on merges.

About this workflow

Http Schedule. Uses httpRequest, splitInBatches, scheduleTrigger. Scheduled trigger; 10 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Scheduled Automations (Reminders, Invoices, Escalations). Uses httpRequest. Scheduled trigger; 17 nodes.

HTTP Request
General

Amazon Product Price Tracker. Uses googleSheets, splitInBatches, httpRequest, emailSend. Scheduled trigger; 16 nodes.

Google Sheets, HTTP Request, Email Send
General

Code Schedule. Uses itemLists, httpRequest, googleSheets, stickyNote. Scheduled trigger; 13 nodes.

Item Lists, HTTP Request, Google Sheets
General

Generate Weekly Energy Consumption Reports with API, Email and Google Drive. Uses httpRequest, convertToFile, emailSend, googleDrive. Scheduled trigger; 12 nodes.

HTTP Request, Email Send, Google Drive
General

Weekly hiring‑manager snapshot from Breezy HR to email (pipeline, next‑week interviews, stuck). Uses httpRequest, emailSend. Scheduled trigger; 12 nodes.

HTTP Request, Email Send