Paket 2 · Praktik LanjutanModul B — CI/CD & Container Pipeline

GitLab Runner: Shell vs Docker Executor

Memasang dan mendaftarkan GitLab Runner, membandingkan shell dan Docker executor, serta mengatur keamanan dan cache.

GitLab Runner mengeksekusi job dari .gitlab-ci.yml. Pemilihan executor menentukan isolasi, kebersihan environment, dan cara job berinteraksi dengan host.

Arsitektur

GitLab ──job──▶ GitLab Runner ──▶ Executor ──▶ Job
                                  ├── shell
                                  ├── docker
                                  ├── kubernetes
                                  └── ssh

Instalasi runner

Debian/Ubuntu

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash
apt install -y gitlab-runner
gitlab-runner --version
systemctl status gitlab-runner --no-pager

Registrasi

Dapatkan URL dan token dari GitLab → Settings → CI/CD → Runners.

gitlab-runner register \
  --non-interactive \
  --url https://gitlab.com/ \
  --token "$RUNNER_TOKEN" \
  --executor docker \
  --docker-image alpine:latest \
  --description "docker-runner-01" \
  --tag-list "docker,linux"

Cek:

gitlab-runner list
gitlab-runner verify

Shell executor

Job berjalan langsung di mesin runner memakai shell.

[[runners]]
  name = "shell-runner"
  url = "https://gitlab.com/"
  token = "TOKEN"
  executor = "shell"
KelebihanKekurangan
Cepat, tanpa overhead containerTidak terisolasi
Mudah akses tool hostJob dapat mengubah host
Cocok untuk deploy ke host itu sendiriSulit reproducibility

Shell executor sering dipakai untuk deployment ke server yang sama dengan runner.

Shell executor tidak terisolasi

Job dapat menghapus file, mengubah konfigurasi, atau membaca secret host. Gunakan hanya untuk repository tepercaya dan user runner terbatas.

Docker executor

Setiap job berjalan di container baru.

[[runners]]
  name = "docker-runner"
  url = "https://gitlab.com/"
  token = "TOKEN"
  executor = "docker"
  [runners.docker]
    image = "alpine:latest"
    privileged = false
    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
    cache_dir = "/cache"
KelebihanKekurangan
Isolasi per jobButuh Docker di host
ReproducibleOverhead pull image
Bersih setiap jobBuild Docker butuh privileged/dind

Docker-in-Docker vs socket binding

PendekatanCaraRisiko
DinDprivileged = true, service docker:dindIsolasi lebih baik, butuh privileged
Socket bindingMount /var/run/docker.sockJob punya akses penuh ke Docker host

Socket binding praktis, tetapi sangat berbahaya untuk job tidak tepercaya.

Cache

[runners]
  cache_dir = "/cache"

[runners.docker]
  volumes = ["/cache"]

Di .gitlab-ci.yml:

cache:
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - node_modules/

Untuk cache terpusat, gunakan S3/MinIO/GCS.

Tags

Runner hanya mengambil job dengan tag yang cocok.

deploy:
  tags: [shell, production]
  script: ./deploy.sh

Pisahkan runner berdasarkan kebutuhan:

  • docker untuk build image.
  • shell untuk deploy host.
  • gpu untuk job khusus.
  • production dengan akses terbatas.

Konfigurasi config.toml

Lokasi umum: /etc/gitlab-runner/config.toml.

concurrent = 4
check_interval = 0

[[runners]]
  name = "docker-runner"
  url = "https://gitlab.com/"
  token = "TOKEN"
  executor = "docker"
  [runners.docker]
    image = "node:22-alpine"
    privileged = false
    disable_entrypoint_overwrite = false
    shm_size = 0

concurrent membatasi job paralel. Terlalu tinggi dapat menghabiskan CPU/RAM.

Keamanan

  • Jangan gunakan runner bersama untuk repo publik dengan secret produksi.
  • Batasi tag dan protected runner.
  • Jalankan runner sebagai user non-root.
  • Perbarui runner secara rutin.
  • Pisahkan runner produksi dari runner build umum.
  • Audit volume dan akses Docker socket.

Praktik: memilih executor

  1. Build dan test → Docker executor.
  2. Deploy ke host → Shell executor di host tersebut.
  3. Butuh isolasi penuh tanpa akses host → Docker executor tanpa socket.
  4. Butuh build image → DinD atau kaniko/buildah.
  5. Butuh skala besar → Kubernetes executor.

Ringkasan

  • Runner mengeksekusi job; executor menentukan lingkungan.
  • Shell cepat tetapi tidak terisolasi.
  • Docker memberi isolasi dan reproducibility, dengan biaya overhead.
  • Tag, concurrency, cache, dan keamanan runner harus direncanakan.

Selanjutnya

On this page