====== CI/CI met gitea in docker compose (gegenereert door LM Studio: ====== Het koppelen van Gitea aan CI/CD is de overstap van "code hosten" naar "hele software lifecycle beheren". Je huidige setup draait perfect als broncodebeheer, maar hij heeft nog geen mechanisme om *actie* uit te voeren nadat er code verandert. Je hebt dus een **Build Runner** nodig. Hier is een stapsgewijze uitleg van de concepten en hoe je dit in Docker Compose kunt implementeren. ---- === 💡 Conceptueel Overzicht: Hoe werkt CI/CD met Gitea? === Voordat we naar de code kijken, is het belangrijk om te begrijpen wat er gebeurt: * **De Trigger:** Een ontwikkelaar pusht (pushes) code naar een branch in Gitea. * **De Webhook:** Gitea detecteert deze push en stuurt automatisch een bericht (een *webhook*) naar een specifieke URL van jouw CI/CD-systeem. * **De Runner:** Het CI/CD-systeem (de "Runner") ontvangt het webhook, checkt de code uit, identificeert welke stappen moeten worden uitgevoerd (bijvoorbeeld: `npm install`, `npm test`, `docker build`). * **Executie:** De Runner voert deze commando's in een schone, geïsoleerde omgeving (een container!) uit. **Jouw Taak:** Je moet nu een nieuwe Docker-service toevoegen die de rol van de "Runner" op zich neemt en luistert naar webhooks. ==== 🚀 Stap 1: De CI/CD Runner Implementeren ==== Omdat er geen standaard, universele `ci_runner` image is dat alles kan, heb je twee opties: === Optie A (Aanbevolen voor leren): Een Simpele Webhook Listener === Dit is een minimale service die alleen de trigger ontvangt en het concept laat zien. Je kunt hierbij een Python/Flask of Node.js/Express microservice gebruiken die simpelweg de webhook afhandelt en dan bijvoorbeeld een logboek genereert, om te bewijzen dat hij geactiveerd wordt. === Optie B (Professioneel): Een Bestaand CI Tool Gebruiken === Je kunt tools zoals **Drone CI**, of zelfs een specifieke **GitLab Runner** container gebruiken als je de complexiteit van het opzetten van een full-blown CI/CD platform aankunt. ***We gaan uit van Optie A, omdat dit het leerproces het meest toegankelijk houdt.*** ==== 🛠️ Stap 2: De `docker-compose.yaml` Aanpassen ==== We voegen een nieuwe service toe aan je bestand, bijvoorbeeld genaamd `ci_runner`. **Aanpassing in de `networks` sectie:** Zorg ervoor dat alle diensten op hetzelfde netwerk draaien, zodat ze elkaar kunnen bereiken (wat al het geval is). version: '3.8' services: # -------------------- # Huidige Gitea service # -------------------- server: image: gitea/gitea:1.24 container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 restart: unless-stopped networks: - gitea volumes: - ./data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "3003:3000" # De 3003 poort is nu je web toegangspunt - "2222:22" # -------------------- # NIEUWE CI/CD Runner Service # -------------------- ci_runner: image: node:lts-slim # Gebruik een image met build tools (Node is vaak goed voor web apps) container_name: ci_runner restart: always environment: # Hier pas je credentials in, bijvoorbeeld de webhook secret key - WEBHOOK_SECRET=mijngeheimekey networks: - gitea volumes: # Hiermee kan de runner code uit checken (of een aparte repo volume) - ./runner_data:/work ports: # De poort waarop Gitea naar zal communiceren - "5001:3000" # Exposeert de service op localhost:5001 networks: gitea: external: false ==== ⚙️ Stap 3: Implementatie van de Runner Logica (Code) ==== De container die je hebt geadd (`ci_runner`) moet nu een webserver draaien (bijvoorbeeld met Node.js/Express of Python/Flask) die **luistert naar POST-requests op `/webhook`**. Dit is het pseudocode-idee voor wat in de `ci_runner` container draait: * **Luister:** Start een HTTP server op poort 3000 (die je hebt geëxposeerd als 5001). * **Check Webhook:** Wanneer een request binnenkomt, controleer dan of het bericht van Gitea is en of de `WEBHOOK_SECRET` klopt. * **Identificeer Event:** Lees uit het payload (de body) wat er gebeurd is: Was het een `push`? Welke repository en welke branch? * **Uitvoeren:** Als het een push is, voer dan de build stappen uit: # Pseudocode voor execution inside the runner container git checkout $GIT_BRANCH npm install # Installeert dependencies npm run test # Voert tests uit npm run build # Creëert artefacten (de deployable code) echo "Build succesvol afgerond!" >> /var/log/ci.log ==== ✅ Stap 4: Gitea Configureren en Connecteren ==== Nadat de `docker-compose up -d` is uitgevoerd en je weet dat je runner op het netwerk draait, moet je Gitea vertellen waar hij zijn webhooks moet sturen. * **Navigeer naar Gitea:** Open de instellingen van je Gitea-instantie (meestal als admin). * **Webhooks Instellen (Per Repository):** Ga naar de repository waar je wilt dat CI/CD draait. * **Creëer Webhook:** Maak een nieuwe webhook aan. * **URL:** Je moet het interne netwerkadres van de runner gebruiken, bijvoorbeeld: `http://ci_runner:3000/webhook` * **Trigger:** Selecteer "Push" (of wat je wilt testen). * **Secret:** Voer dezelfde secret key in die je in de environment variabelen (`WEBHOOK_SECRET`) van je runner hebt ingesteld. ==== 🌟 Samenvatting & Volgende Stappen ==== ^ Component ^ Wat doet het? ^ Docker Compose Service ^ Poort (Intern) ^ | **Source Code** | Host en triggert events (webhooks). | `server` (Gitea) | 3000 | | **Trigger Mechanism**| Ontvangt webhooks van Gitea. | `ci_runner` | 3000 | | **Build/Executie**| Voert de geautomatiseerde stappen uit. | Binnen de logica van `ci_runner` (via Git/npm/etc.) | N.v.t. | ==== Wat nu? ==== * **Kies je technologie:** Als je Node.js-projecten hebt, gebruik dan een Node runner. Voor Python projecten: `python:3.10-slim`. * **Bouw de logica:** Schrijf de code die in die runner service draait om de stappen te automatiseren (checkout -> install -> test/build). Door deze architectuur te volgen, heb je een volledig gecontaineriseerd CI/CD systeem: Gitea beheert het *wat*, en de Runner bepaalt het *hoe* en *wanneer*.