n8nen.nl logo n8nen.nl

N8N + GitHub Automatisering: CI/CD, Pull Requests & Issue Tracking Workflows

2026-03-10 n8nen
N8N + GitHub Automatisering: CI/CD, Pull Requests & Issue Tracking Workflows
🐙 n8n Slack Alert Jira Update Deploy GitHub + N8N Automatisering CI/CD • Pull Requests • Issues • Webhooks • Repository Monitoring

GitHub is de thuisbasis van je code. Maar de workflows eromheen — PR reviews coördineren, issues naar Jira synchen, deployment notificaties sturen — kosten vaak meer tijd dan het programmeren zelf. Met n8n automatiseer je deze processen en verbind je GitHub met de rest van je toolchain.

Wat je leert:

  • GitHub node en GitHub Trigger node configureren
  • Webhook events: push, pull_request, issues, releases
  • 7 kant-en-klare workflows voor development teams
  • CI/CD pipeline bouwen: GitHub → n8n → Deploy
  • Workflow versioning met GitHub (backup & restore)

GitHub Nodes in n8n

n8n biedt twee GitHub-gerelateerde nodes:

GitHub Node

Voert acties uit op GitHub: repositories, issues, PRs, releases, en meer.

Operaties: Create Issue, Get PR, List Commits, Create Release, Get File, etc.

GitHub Trigger Node

Luistert naar GitHub webhook events en start je workflow automatisch.

Events: push, pull_request, issues, release, fork, star, etc.

Authenticatie Instellen

// GitHub Personal Access Token (PAT) aanmaken:

// 1. GitHub → Settings → Developer settings → Personal access tokens
// 2. Kies "Fine-grained tokens" (aanbevolen) of "Classic"
// 3. Selecteer permissions:
//    - repo: Full control (voor private repos)
//    - admin:repo_hook (voor webhooks)
//    - read:org (voor organisatie-repos)
// 4. Kopieer de token

// In n8n:
// Settings → Credentials → Add Credential → GitHub API
// Plak je Personal Access Token

Workflow 1: PR Review Notificaties

Stuur automatisch een Slack bericht wanneer iemand een PR opent, en tag de relevante reviewer.

// PR → Slack Notificatie Workflow

GitHub Trigger (event: pull_request)
  Events: opened, ready_for_review
  ↓
Code Node (format message)
  const pr = $json.body.pull_request;
  const author = pr.user.login;
  const title = pr.title;
  const url = pr.html_url;
  const additions = pr.additions;
  const deletions = pr.deletions;
  const files = pr.changed_files;
  
  // Reviewer mapping
  const reviewerMap = {
    'frontend': '<@U123>',  // Slack user IDs
    'backend': '<@U456>',
    'devops': '<@U789>'
  };
  
  // Detecteer type PR op basis van labels of branch
  const branch = pr.head.ref;
  let team = 'backend';
  if (branch.includes('fe/') || branch.includes('ui/')) team = 'frontend';
  if (branch.includes('infra/') || branch.includes('deploy')) team = 'devops';
  
  return {
    text: `*Nieuwe PR:* <${url}|${title}>\n` +
          `Auteur: ${author} | ${files} bestanden | ` +
          `+${additions} -${deletions}\n` +
          `Review nodig: ${reviewerMap[team]}`,
    channel: '#code-reviews'
  };
  ↓
Slack Node (post message)

Workflow 2: Issue → Jira/Trello Sync

// GitHub Issue → Project Management Sync

GitHub Trigger (event: issues)
  Events: opened, labeled, closed
  ↓
Switch Node (op actie)
  ├── opened → HTTP Request: Create Jira Ticket
  │   POST https://jouw-org.atlassian.net/rest/api/3/issue
  │   Body: {
  │     "fields": {
  │       "project": { "key": "DEV" },
  │       "summary": {{ $json.body.issue.title }},
  │       "description": {{ $json.body.issue.body }},
  │       "issuetype": { "name": "Bug" }
  │     }
  │   }
  │
  ├── labeled ("priority:high") → Slack Alert #urgent
  │
  └── closed → HTTP Request: Transition Jira Ticket to Done

Workflow 3: Automatische Release Notes

// Release Tag → Generate Changelog → Post Everywhere

GitHub Trigger (event: release)
  Event: published
  ↓
GitHub Node (List Commits since last release)
  Operation: List Commits
  Repository: owner/repo
  Since: {{ $json.body.release.created_at }}
  ↓
AI Chain → Claude/OpenAI
  "Genereer release notes uit deze commits.
   Groepeer in: Features, Fixes, Breaking Changes.
   Schrijf in het Nederlands.
   Commits: {{ $json.commits }}"
  ↓
// Parallel publiceren:
├── GitHub Node: Update Release Body
├── Slack Node: Post in #releases
├── Email Node: Stuur naar klanten-mailinglist
└── HTTP Request: Update Changelog op website

Workflow 4: CI/CD Pipeline met n8n

Gebruik n8n als orchestrator voor je deployment pipeline — flexibeler dan GitHub Actions voor complexe multi-service deployments.

Git Push n8n Webhook Run Tests Build & Deploy Notify Team n8n orchestreert de hele pipeline — flexibeler dan GitHub Actions alleen
// CI/CD Pipeline Workflow

GitHub Trigger (event: push, branch: main)
  ↓
// Stap 1: Tests draaien
HTTP Request → SSH command (of Execute Command node)
  ssh deploy@server "cd /app && git pull && npm test"
  ↓
IF Node (tests geslaagd?)
  ├── Ja:
  │   // Stap 2: Build & Deploy
  │   HTTP Request → SSH
  │     "cd /app && npm run build && pm2 restart all"
  │   ↓
  │   // Stap 3: Health check
  │   Wait Node (10 seconden)
  │   ↓
  │   HTTP Request → GET https://app.example.com/health
  │   ↓
  │   IF Node (status 200?)
  │     ├── Ja → Slack: "Deployment gelukt! v{{ version }}"
  │     └── Nee → Slack: "ROLLBACK NODIG!" + email alert
  │
  └── Nee:
      Slack Alert: "Tests gefaald op main branch!"
      GitHub Node: Create Issue ("CI failure: {{ $json.error }}")

Workflow 5: Repository Monitoring Dashboard

// Dagelijks Repository Health Check

Schedule Trigger (08:00, maandag-vrijdag)
  ↓
GitHub Node (haal stats op)
  // Per repository:
  - Open PRs count
  - Open Issues count  
  - Last commit date
  - Open dependabot alerts
  ↓
Code Node (genereer rapport)
  const repos = items;
  const stale = repos.filter(r => {
    const daysSinceCommit = Math.floor(
      (Date.now() - new Date(r.json.lastCommit)) / 86400000
    );
    return daysSinceCommit > 14;
  });
  
  return {
    totalOpenPRs: repos.reduce((s, r) => s + r.json.openPRs, 0),
    totalOpenIssues: repos.reduce((s, r) => s + r.json.openIssues, 0),
    staleRepos: stale.map(r => r.json.name),
    securityAlerts: repos.reduce((s, r) => s + r.json.alerts, 0)
  };
  ↓
Slack Node (#dev-dashboard)
  "📊 *Daily Repo Report*
   Open PRs: {{ totalOpenPRs }}
   Open Issues: {{ totalOpenIssues }}
   Security Alerts: {{ securityAlerts }}
   Stale repos: {{ staleRepos.join(', ') }}"

Workflow 6: Workflow Versioning via GitHub

Sla je n8n workflows op in Git voor versiebeheer. Dit is essentieel voor teams die workflows in productie draaien.

// n8n Workflow → GitHub Backup (dagelijks)

Schedule Trigger (02:00, dagelijks)
  ↓
HTTP Request → n8n API
  GET /api/v1/workflows
  Headers: { "X-N8N-API-KEY": "{{ $credentials.n8nApiKey }}" }
  ↓
Loop Over Items (per workflow)
  ↓
Code Node (format voor Git)
  const workflow = $json;
  const filename = `workflows/${workflow.name.replace(/\s+/g, '-')}.json`;
  return {
    path: filename,
    content: JSON.stringify(workflow, null, 2)
  };
  ↓
GitHub Node (Create or Update File)
  Repository: org/n8n-workflows
  Path: {{ $json.path }}
  Content: {{ $json.content }}
  Message: "Auto-backup: {{ $json.path }} - {{ $now.format('yyyy-MM-dd HH:mm') }}"

Workflow 7: PR Auto-Labeling

// Automatisch labels toewijzen aan PRs op basis van gewijzigde bestanden

GitHub Trigger (event: pull_request, action: opened)
  ↓
GitHub Node (Get PR Files)
  GET /repos/{owner}/{repo}/pulls/{pr_number}/files
  ↓
Code Node (bepaal labels)
  const files = items.map(i => i.json.filename);
  const labels = new Set();
  
  files.forEach(f => {
    if (f.startsWith('src/frontend/') || f.endsWith('.tsx')) labels.add('frontend');
    if (f.startsWith('src/api/') || f.endsWith('.py')) labels.add('backend');
    if (f.includes('test') || f.includes('spec')) labels.add('tests');
    if (f.includes('Dockerfile') || f.includes('.yml')) labels.add('devops');
    if (f.includes('docs/') || f.endsWith('.md')) labels.add('documentation');
  });
  
  // Size labels
  const totalChanges = items.reduce((s, i) => 
    s + i.json.additions + i.json.deletions, 0);
  if (totalChanges < 10) labels.add('size/XS');
  else if (totalChanges < 100) labels.add('size/S');
  else if (totalChanges < 500) labels.add('size/M');
  else labels.add('size/L');
  
  return { labels: [...labels] };
  ↓
HTTP Request → GitHub API
  POST /repos/{owner}/{repo}/issues/{pr_number}/labels
  Body: { "labels": {{ $json.labels }} }

GitHub Trigger Events Overzicht

Event Wanneer Typische actie
push Code gepusht naar een branch CI/CD triggeren, tests draaien
pull_request PR geopend, gesloten, gemerged Review notificatie, auto-labeling
issues Issue aangemaakt of gewijzigd Sync naar Jira/Trello
release Nieuwe release gepubliceerd Changelog genereren, notificaties
star / fork Iemand start of forkt je repo Groei tracking, community engagement
workflow_run GitHub Actions workflow voltooid Resultaat verwerken in n8n

n8n vs GitHub Actions: Wanneer Wat?

Criterium GitHub Actions n8n + GitHub
CI/CD (build + test) Beter — native integratie Goed als orchestrator
Cross-platform integratie Beperkt tot GitHub ecosystem 400+ integraties
Visueel bouwen YAML bestanden Visuele editor
AI/LLM integratie Beperkt Native LangChain + agents

Ons advies: gebruik GitHub Actions voor build en test pipelines, en n8n voor alles eromheen — notificaties, cross-platform sync, AI-gebaseerde analyse, en complexe multi-service orchestratie.

Conclusie

GitHub + n8n is de perfecte combinatie voor development teams die meer willen dan standaard CI/CD. Van intelligente PR-routing tot geautomatiseerde release notes met AI — de mogelijkheden zijn eindeloos.

Aan de Slag

  1. 1. Maak een GitHub PAT aan met de juiste permissions
  2. 2. Configureer de GitHub credential in n8n
  3. 3. Begin met een simpele PR → Slack notificatie
  4. 4. Bouw uit naar CI/CD en issue tracking

Gerelateerde Artikelen

#n8n #github #CI/CD #pull requests #issues #devops #automatisering #webhook #deployment