AutomationFlowsSlack & Telegram › Git Push to Windsurf CI/CD and Vercel Deploy

Git Push to Windsurf CI/CD and Vercel Deploy

Original n8n title: Build, Test and Deploy AI Projects with Windsurf Ci/cd and Vercel

ByOneclick AI Squad @oneclick-ai on n8n.io

This is a conceptual / starter workflow that triggers on git events (or schedule), runs Windsurf-powered build & test steps (via API or CLI wrapper), builds Docker if needed, pushes to registry, deploys to a target platform (e.g. Vercel / Render example), and notifies.

Webhook trigger★★★★☆ complexity15 nodesHTTP RequestSlack
Slack & Telegram Trigger: Webhook Nodes: 15 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #13823 — we link there as the canonical source.

This workflow follows the HTTP Request → Slack recipe pattern — see all workflows that pair these two integrations.

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
{
  "id": "mnDXe936xoieG86s",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "n8n Windsurf Deployment: Build, Test & Deploy AI Projects",
  "tags": [],
  "nodes": [
    {
      "id": "6c404a74-24fa-4751-85aa-4254d75c9190",
      "name": "Overview & Instructions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        528
      ],
      "parameters": {
        "width": 1100,
        "height": 826,
        "content": "This is a conceptual / starter workflow that triggers on git events (or schedule), runs Windsurf-powered build & test steps (via API or CLI wrapper), builds Docker if needed, pushes to registry, deploys to a target platform (e.g. Vercel / Render example), and notifies.\n\n### What\u2019s the Goal?\nProvide a no/low-code CI/CD pipeline for AI projects using Windsurf\u2019s AI coding & deployment capabilities inside n8n \u2014 no external GitHub Actions / Jenkins needed.\n\n### Why Does It Matter?\nAI projects evolve rapidly \u2192 manual deploy is slow & error-prone. Windsurf + n8n keeps model code, keys & inference private while automating quality gates & deployments.\n\n### How It Works\n1. Git webhook / schedule starts flow\n2. Clone latest code\n3. Trigger Windsurf build + test (lint, unit tests, model eval)\n4. If tests pass \u2192 build Docker image\n5. Push image to registry\n6. Deploy to target (Vercel / Render / Railway / Fly.io / K8s)\n7. Notify success / failure\n\n### Configuration Requirements\n- Git provider webhook / token\n- Windsurf API key or self-hosted runner access\n- Docker registry credentials\n- Deployment target token (Vercel / Render / etc.)\n- Notification (Slack / Email)\n\n### Setup Guide\n1. Import workflow\n2. Connect credentials (Git, Windsurf, Docker, Deploy target, Slack)\n3. Configure Set node: repo URL, branch, Windsurf profile, deploy target\n4. Test manually first\n5. Activate webhook \u2192 push code to trigger\n6. Monitor & tune failure branches\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "40089a37-f6fb-4d51-80da-e569111e8568",
      "name": "1. Trigger",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        544
      ],
      "parameters": {
        "color": 3,
        "width": 460,
        "height": 720,
        "content": "## 1. Trigger & Input\nGit event or schedule \u2192 prepare repo info"
      },
      "typeVersion": 1
    },
    {
      "id": "0c1bbe03-f774-4328-ab62-8e6be7eea50c",
      "name": "2. Windsurf Phase",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1616,
        528
      ],
      "parameters": {
        "color": 5,
        "width": 668,
        "height": 700,
        "content": "## 2. Windsurf Build & Test\nAI-powered lint, test, eval via Windsurf"
      },
      "typeVersion": 1
    },
    {
      "id": "1e1ac957-5ba7-4cea-8749-f2b3d847bbb1",
      "name": "3. Container Phase",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2304,
        528
      ],
      "parameters": {
        "color": 4,
        "width": 396,
        "height": 680,
        "content": "## 3. Container & Push\nDocker build \u2192 registry push"
      },
      "typeVersion": 1
    },
    {
      "id": "7352141a-5c67-44da-baf4-76d5d86021e8",
      "name": "4. Deploy & Output",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2736,
        528
      ],
      "parameters": {
        "color": 3,
        "width": 484,
        "height": 676,
        "content": "## 4. Deploy & Notify\nTarget platform + alerts"
      },
      "typeVersion": 1
    },
    {
      "id": "a3731c11-af2e-4b77-b308-9ede7c56dcac",
      "name": "Webhook: Git Push / Tag",
      "type": "n8n-nodes-base.webhook",
      "position": [
        1232,
        912
      ],
      "parameters": {
        "path": "windsurf-deploy-hook",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "d02830bd-a717-47c6-9626-3eaec4fd399a",
      "name": "Daily Check (fallback)",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        1232,
        1104
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "10641ade-9ce8-4ce6-b8ef-504d389cf606",
      "name": "Set Project Config",
      "type": "n8n-nodes-base.set",
      "position": [
        1456,
        1008
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "repo_url",
              "value": "https://github.com/your-org/your-ai-project.git"
            },
            {
              "name": "branch",
              "value": "main"
            },
            {
              "name": "windsurf_profile",
              "value": "ai-build-test"
            },
            {
              "name": "deploy_platform",
              "value": "vercel"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "dcade103-7d66-4036-a2b3-ae75eee9df07",
      "name": "Git: Get Latest Commit",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1680,
        1008
      ],
      "parameters": {
        "url": "https://api.github.com/repos/{{ $json.repo_url.split('/').slice(-2).join('/') }}/commits/{{ $json.branch }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "d3a7a00b-8732-472e-b371-8ab402010385",
      "name": "Windsurf: Build & Test",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2112,
        1008
      ],
      "parameters": {
        "url": "https://api.windsurf.dev/v1/run",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "fbba611f-c59b-4d1f-b7cb-2e627bddbb01",
      "name": "Build & Tests OK?",
      "type": "n8n-nodes-base.if",
      "position": [
        2336,
        1008
      ],
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{ $json.build_success === true || $json.tests_passed === true }}"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8b23b505-9dd4-4561-bda1-c47b18ec6dfe",
      "name": "Docker: Build & Push (placeholder)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2560,
        944
      ],
      "parameters": {
        "url": "https://registry.hub.docker.com/v2/repositories/yourusername/ai-project/tags/latest",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "70a04462-5edf-4bb9-9dff-534dab30142a",
      "name": "Deploy \u2192 Vercel (example)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2784,
        944
      ],
      "parameters": {
        "url": "https://api.vercel.com/v13/deployments",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "8d49bd41-c3b2-4e41-b325-8f887159a013",
      "name": "Notify Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        3008,
        1008
      ],
      "parameters": {
        "text": "={{ $json.success ? '\ud83d\ude80 AI Project Deployed successfully!\\nURL: ' + $json.deploy_url : '\u274c Build / Deploy failed: ' + $json.error_message }}",
        "channel": "ci-cd-notifications",
        "attachments": [],
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e42515c8-ffb5-4df9-8c12-ef875cfb4f86",
      "name": "Wait For Data",
      "type": "n8n-nodes-base.wait",
      "position": [
        1888,
        1008
      ],
      "parameters": {},
      "typeVersion": 1.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "95bf1d70-d056-4c8f-b590-f799eaac0eef",
  "connections": {
    "Wait For Data": {
      "main": [
        [
          {
            "node": "Windsurf: Build & Test",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build & Tests OK?": {
      "main": [
        [
          {
            "node": "Docker: Build & Push (placeholder)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Project Config": {
      "main": [
        [
          {
            "node": "Git: Get Latest Commit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Check (fallback)": {
      "main": [
        [
          {
            "node": "Set Project Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Git: Get Latest Commit": {
      "main": [
        [
          {
            "node": "Wait For Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Windsurf: Build & Test": {
      "main": [
        [
          {
            "node": "Build & Tests OK?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook: Git Push / Tag": {
      "main": [
        [
          {
            "node": "Set Project Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Deploy \u2192 Vercel (example)": {
      "main": [
        [
          {
            "node": "Notify Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Docker: Build & Push (placeholder)": {
      "main": [
        [
          {
            "node": "Deploy \u2192 Vercel (example)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

This is a conceptual / starter workflow that triggers on git events (or schedule), runs Windsurf-powered build & test steps (via API or CLI wrapper), builds Docker if needed, pushes to registry, deploys to a target platform (e.g. Vercel / Render example), and notifies.

Source: https://n8n.io/workflows/13823/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

HR teams, IT Operations, and System Administrators managing employee onboarding at scale. It’s perfect if you use Odoo 18 to trigger account requests and need Redmine + GitLab accounts created instant

HTTP Request, Slack
Slack & Telegram

This workflow is a complete, production-ready solution for recovering abandoned carts in Shopify stores using a multi-channel, multi-touch approach. It automates personalized follow-ups via Email, SMS

HTTP Request, Shopify, SendGrid +5
Slack & Telegram

This workflow automates end-to-end research analysis by coordinating multiple AI models—including NVIDIA NIM (Llama), OpenAI GPT-4, and Claude to analyze uploaded documents, extract insights, and gene

HTTP Request, Postgres, Slack +1
Slack & Telegram

Are you tired of the repetitive dance between git push, creating a pull request in GitHub, updating the corresponding task in JIRA, and then manually notifying your team in Slack, or Notion?

HTTP Request, Stop And Error, Jira +2
Slack & Telegram

This workflow automatically detects changes in the .env.staging file in a GitHub repository and keeps Android configuration files (build.gradle and gradle.properties) in sync.It creates a new Git bran

GitHub, HTTP Request, Slack