Saját GitLab Runner beállítása Dockerrel

A modern szoftverfejlesztés egyik alappillére a Folyamatos Integráció és Folyamatos Szállítás (CI/CD). Ez a módszertan lehetővé teszi a fejlesztők számára, hogy gyorsabban, megbízhatóbban és hatékonyabban szállítsanak kódot. A GitLab egy rendkívül népszerű platform, amely beépített CI/CD funkciókat kínál, és a kulcsfontosságú eleme ennek a rendszernek a GitLab Runner. Bár a GitLab.com biztosít megosztott Runner-eket, sok esetben előnyösebb, ha saját, dedikált Runner-t állítunk be. Különösen igaz ez, ha specifikus erőforrásokra, egyedi szoftverekre vagy szigorúbb biztonsági kontrollra van szükségünk. Ebben a részletes útmutatóban lépésről lépésre bemutatjuk, hogyan állíthatod be a saját GitLab Runner-edet Dockerrel, hogy maximális kontrollt és rugalmasságot élvezhess.

Mi az a GitLab Runner és miért van rá szükséged?

A GitLab CI/CD lényege, hogy a projekt gyökérkönyvtárában található .gitlab-ci.yml fájlban definiált utasításokat futtatja a kód változásai (pl. push, merge request) alapján. Ezek az utasítások lehetnek tesztek, fordítások, csomagolás, telepítés és sok más. Ahhoz, hogy ezek a feladatok végrehajtódjanak, egy végrehajtó környezetre van szükség: ez a GitLab Runner.

A Runner egy könnyűsúlyú, elosztott alkalmazás, amely a GitLab példányokkal kommunikál, lekérdezi a futtatandó feladatokat, végrehajtja azokat, majd visszaküldi az eredményeket. Lehet telepítve egy szerverre, egy virtuális gépre, vagy akár egy konténerbe is. Amikor saját Runner-t állítunk be, az alábbi előnyöket élvezhetjük:

  • Erőforrás-kontroll: Teljesen irányíthatod a Runner rendelkezésére álló CPU, memória és lemezterület mennyiségét.
  • Testreszabott környezet: Telepíthetsz rá bármilyen szoftvert, könyvtárat vagy eszközt, amire a CI/CD feladataidnak szüksége van.
  • Gyorsabb build-ek: Nincs várakozás a megosztott Runner-ekre, és a lokális cache-elés is gyorsíthatja a folyamatokat.
  • Biztonság: Különösen érzékeny projektek esetén a saját infrastruktúrán futó Runner fokozott biztonságot nyújt.
  • Hálózati hozzáférés: Hozzáférhet olyan belső erőforrásokhoz (adatbázisok, API-k), amelyekhez egy publikus Runner nem férne hozzá.

Miért éppen Dockerrel?

A Docker egy konténerizációs platform, amely lehetővé teszi alkalmazások és azok függőségeinek csomagolását izolált konténerekbe. A GitLab Runner Docker executor használata számtalan előnnyel jár:

  • Izoláció: Minden CI/CD feladat egy különálló Docker konténerben fut, ami garantálja, hogy a feladatok nem befolyásolják egymást és tiszta környezetben indulnak.
  • Reprodukálhatóság: A build-ek mindig ugyanabban a környezetben futnak, csökkentve az „az én gépemen működik” típusú problémákat.
  • Egyszerűség: A Runner telepítése és kezelése lényegesen egyszerűbb Dockerrel, mivel nem kell aggódni a rendszerfüggőségekért.
  • Rugalmasság: Könnyedén válthatunk különböző Docker image-ek között a feladatokhoz, például különböző nyelvi verziókhoz (Python 3.8, Node.js 16).
  • Skálázhatóság: Könnyen indítható több Runner példány vagy akár autoscaling megoldás is kiépíthető.

Előfeltételek

Mielőtt belevágnánk a konfigurációba, győződj meg róla, hogy a következőkre rendelkezel:

  • GitLab Fiók és Projekt: Rendelkezz egy aktív GitLab fiókkal és egy projekttel, amelyhez hozzá szeretnéd adni a Runner-t.
  • Fizikai vagy Virtuális Gép: Egy Linux, Windows vagy macOS alapú gép, ahol a Docker futni fog. Javasolt egy dedikált szerver vagy virtuális gép, megfelelő CPU-val és memóriával.
  • Telepített Docker: Győződj meg róla, hogy a Docker telepítve van a gépeden, és a felhasználód jogosult a Docker parancsok futtatására (általában a felhasználó hozzáadása a docker csoporthoz). A telepítési útmutatókért látogass el a Docker hivatalos weboldalára.

Lépésről lépésre: Saját GitLab Runner beállítása Dockerrel

Most pedig térjünk rá a lényegre: a GitLab Runner beállítására Dockerrel.

1. Készítsünk egy konfigurációs mappát

A Runner konfigurációs fájljaihoz és a cache-hez szükségünk lesz egy állandó tárolóhelyre. Hozzunk létre egy mappát a host gépen, amit majd a Docker konténerbe csatolunk:

sudo mkdir -p /srv/gitlab-runner/config

Ezzel biztosítjuk, hogy a Runner beállításai és adatai fennmaradjanak, még akkor is, ha a Docker konténer újraindul vagy törlődik.

2. GitLab Runner Docker image letöltése

Töltsük le a hivatalos GitLab Runner Docker image-et. Ajánlott a latest címke használata, vagy egy konkrét verzió, ha ragaszkodunk hozzá:

docker pull gitlab/gitlab-runner:latest

3. GitLab Runner regisztrálása

Ez a legfontosabb lépés. A regisztráció során összekapcsoljuk a Runner-t a GitLab példányunkkal. Ehhez szükségünk lesz a GitLab URL-re és egy regisztrációs tokenre. A token a GitLab projektedben (vagy csoportodban/példányodban) található a Settings > CI/CD > Runners menüpont alatt.

Futtassuk a következő Docker parancsot a regisztrációs folyamat elindításához. A --rm flag biztosítja, hogy a regisztráció után a konténer automatikusan törlődjön, hiszen ez csak egy egyszeri művelet.

docker run --rm -it 
    -v /srv/gitlab-runner/config:/etc/gitlab-runner 
    gitlab/gitlab-runner:latest register

A parancs futtatása után a Runner interaktívan kérdéseket fog feltenni:

  1. Enter the GitLab instance URL (e.g. https://gitlab.com/):

    Add meg a GitLab példányod URL-jét, pl. https://gitlab.com/ vagy a saját privát GitLab szervered címét.

  2. Enter the registration token:

    Illeszd be a GitLab felületén (Settings > CI/CD > Runners) található token-t.

  3. Enter a description for the runner:

    Adj egy könnyen azonosítható nevet a Runner-ednek, pl. my-docker-runner-on-server-1.

  4. Enter tags for the runner (comma-separated):

    Ez egy nagyon fontos lépés! Itt adhatsz meg címkéket, amikkel később a .gitlab-ci.yml fájlban hivatkozhatsz erre a Runner-re. Például: docker, linux, my-private-runner. Ezekkel a tag-ekkel tudod majd irányítani, hogy melyik Runner futtassa az adott feladatot.

  5. Enter an executor: docker, ssh, virtualbox, kubernetes, custom, parallels, shell, instance:

    Válaszd a docker opciót. Ez a Runner motorja, amely a feladatokat Docker konténerekben fogja futtatni.

  6. Enter the default Docker image (e.g. ruby:2.7):

    Add meg az alapértelmezett Docker image-et, amit a Runner használni fog, ha a .gitlab-ci.yml fájlban nem specifikálsz másikat. Egy jó kiindulópont lehet: ubuntu:latest, alpine/git, vagy egy specifikus nyelv image-e, pl. python:3.9-slim.

Ha a regisztráció sikeres volt, a /srv/gitlab-runner/config/config.toml fájl létrejön a host gépen, és tartalmazni fogja a Runner beállításait. Ezt a fájlt később kézzel is szerkesztheted, ha szükséges.

4. GitLab Runner elindítása szolgáltatásként

Miután regisztráltad a Runner-t, elindíthatod azt egy háttérfolyamatként. Ez a konténer folyamatosan futni fog, és várja a GitLab-tól érkező feladatokat.

docker run -d --name gitlab-runner --restart always 
    -v /srv/gitlab-runner/config:/etc/gitlab-runner 
    -v /var/run/docker.sock:/var/run/docker.sock 
    gitlab/gitlab-runner:latest

Nézzük meg a parancs paramétereit:

  • -d: A konténert háttérben indítja (detached mode).
  • --name gitlab-runner: Nevet ad a konténernek, így könnyebben hivatkozhatunk rá.
  • --restart always: Biztosítja, hogy a konténer automatikusan újrainduljon, ha a host gép újraindul, vagy a konténer bármilyen okból leáll.
  • -v /srv/gitlab-runner/config:/etc/gitlab-runner: Csatolja a korábban létrehozott konfigurációs mappát a konténerbe. Ez tartalmazza a config.toml fájlt.
  • -v /var/run/docker.sock:/var/run/docker.sock: Ez egy kulcsfontosságú paraméter! Ez teszi lehetővé, hogy a GitLab Runner a host gép Docker démonját használja a CI/CD feladatok konténereinek indításához. Ez az úgynevezett „Docker in Docker” (DinD) megközelítés egyszerűsített változata.

5. A Runner állapotának ellenőrzése

Ellenőrizd, hogy a Runner fut-e és megfelelően működik-e:

docker ps -a | grep gitlab-runner

Látnod kell a gitlab-runner nevű konténert Up státuszban.

Nézd meg a logokat is, ha bármilyen problémát tapasztalsz:

docker logs gitlab-runner

Most, ha visszalátogatsz a GitLab projekted Settings > CI/CD > Runners menüpontjához, látnod kell a frissen regisztrált Runner-edet, valószínűleg zöld jelzéssel, ami azt jelenti, hogy aktív és készen áll a feladatokra.

A .gitlab-ci.yml fájl konfigurálása

Most, hogy van egy saját Runner-ed, használnod kell azt a CI/CD pipeline-jaidban. A .gitlab-ci.yml fájlban a tags kulcsszóval hivatkozhatsz a Runner-edre. Emlékszel a regisztráció során megadott címkékre? Most jönnek jól!

stages:
  - build
  - test

build-job:
  stage: build
  image: node:16-alpine # Egyedi Docker image ehhez a jobhoz
  script:
    - echo "Building the project..."
    - npm install
    - npm run build
  tags:
    - docker # Ezzel hivatkozunk a saját Runner-ünkre
    - my-private-runner

test-job:
  stage: test
  image: python:3.9-slim
  script:
    - echo "Running tests..."
    - pip install -r requirements.txt
    - pytest
  tags:
    - docker
    - my-private-runner

A fenti példában a build-job és a test-job is a docker és my-private-runner címkével ellátott Runner-t fogja használni. Emellett minden job saját image-et is megadhat, így maximális rugalmasságot kapsz a futtatási környezetek terén.

Haladó beállítások és tippek

Saját Docker Image-ek használata

Létrehozhatsz és használhatsz saját Docker image-eket, amelyek előre telepített függőségeket tartalmaznak a projektjeidhez. Ezeket feltöltheted a GitLab Container Registry-be vagy bármely más Docker registry-be, és hivatkozhatsz rájuk a .gitlab-ci.yml fájlban.

Cache beállítása

A cache használatával jelentősen felgyorsíthatod a build-eket, mivel nem kell minden alkalommal újra letölteni a függőségeket (pl. node_modules, Maven repository). Ezt a .gitlab-ci.yml fájlban konfigurálhatod:

cache:
  paths:
    - node_modules/
    - .gradle/
  key: "$CI_COMMIT_REF_SLUG" # Gyakran használják a branch nevére, hogy branch-specifikus cache legyen

Service konténerek

A tesztek futtatásához gyakran szükség van adatbázisokra (pl. PostgreSQL, MySQL) vagy más szolgáltatásokra. Ezeket „service konténerekként” indíthatod a CI/CD job-ok mellett:

test-database:
  stage: test
  image: python:3.9-slim
  services:
    - postgres:latest # Futtat egy PostgreSQL konténert a job mellett
  variables:
    POSTGRES_DB: test_db
    POSTGRES_USER: runner
    POSTGRES_PASSWORD: password
  script:
    - pip install -r requirements.txt
    - python manage.py migrate
    - pytest

A services szekcióban megadott konténerek a job konténeréhez kapcsolódnak, és a szolgáltatás nevével (pl. postgres) érhetők el a job konténeréből.

Karbantartás és frissítés

A Runner konténert rendszeresen frissítened kell a legújabb verzióra a biztonsági javítások és új funkciók érdekében. Ehhez egyszerűen állítsd le, töröld, majd indítsd újra az image letöltésével együtt:

docker stop gitlab-runner
docker rm gitlab-runner
docker pull gitlab/gitlab-runner:latest
docker run -d --name gitlab-runner --restart always 
    -v /srv/gitlab-runner/config:/etc/gitlab-runner 
    -v /var/run/docker.sock:/var/run/docker.sock 
    gitlab/gitlab-runner:latest

A konfigurációs fájl megmarad a host gépen, így nem kell újraregisztrálnod.

Biztonsági megfontolások

A /var/run/docker.sock megosztása a Runner konténerrel nagy hatalmat ad a konténernek (gyakorlatilag a host gépen is futtathat Docker parancsokat). Ügyelj rá, hogy a Runner-t megbízható környezetben futtasd, és csak olyan projektekhez add hozzá, amelyekben megbízol. Fontos, hogy a host gépedet rendszeresen frissítsd, és csak a szükséges portokat nyisd meg.

Gyakori hibák és elhárításuk

  • „permission denied while trying to connect to the Docker daemon socket”: Ez általában azt jelenti, hogy a felhasználód nem tagja a docker csoportnak, vagy a docker.sock nincs megfelelően csatolva. Ellenőrizd a felhasználó jogosultságait és a Docker parancsot.
  • „job stuck” (a job beragadt):
    • Ellenőrizd, hogy a Runner fut-e (docker ps).
    • Ellenőrizd, hogy a Runner elérhető-e a GitLab számára (Settings > CI/CD > Runners).
    • Győződj meg róla, hogy a job-ban megadott tags megegyezik a Runner regisztrációjakor megadott címkékkel.
    • Nézd meg a Runner logjait (docker logs gitlab-runner).
  • „image not found” (image nem található): Ellenőrizd az image nevét a .gitlab-ci.yml-ben vagy a Runner alapértelmezett image beállításában. Lehet, hogy elírtad, vagy az image privát és nincs hitelesítve a Runner.
  • Hálózati problémák: Ha a Runner-nek hálózati erőforrásokra van szüksége, győződj meg róla, hogy a host gép tűzfala engedélyezi a kimenő és bejövő forgalmat a szükséges portokon.

Összefoglalás

A saját GitLab Runner beállítása Dockerrel egy rendkívül hasznos lépés a CI/CD automatizálásod fejlesztésében. Növeli a projekted rugalmasságát, sebességét és biztonságát, miközben teljes kontrollt biztosít a build környezet felett. Bár a kezdeti beállítás igényel némi figyelmet, a hosszú távú előnyei messze felülmúlják ezt az erőfeszítést.

Reméljük, hogy ez az útmutató segített abban, hogy magabiztosan vágj bele a saját GitLab Runner-ed konfigurálásába. Ne félj kísérletezni a különböző Docker image-ekkel, cache beállításokkal és service konténerekkel, hogy optimalizáld a pipeline-jaidat a projekted specifikus igényei szerint. Sok sikert a CI/CD utazásodhoz!

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük