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
└── sshInstalasi 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-pagerRegistrasi
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 verifyShell executor
Job berjalan langsung di mesin runner memakai shell.
[[runners]]
name = "shell-runner"
url = "https://gitlab.com/"
token = "TOKEN"
executor = "shell"| Kelebihan | Kekurangan |
|---|---|
| Cepat, tanpa overhead container | Tidak terisolasi |
| Mudah akses tool host | Job dapat mengubah host |
| Cocok untuk deploy ke host itu sendiri | Sulit 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"| Kelebihan | Kekurangan |
|---|---|
| Isolasi per job | Butuh Docker di host |
| Reproducible | Overhead pull image |
| Bersih setiap job | Build Docker butuh privileged/dind |
Docker-in-Docker vs socket binding
| Pendekatan | Cara | Risiko |
|---|---|---|
| DinD | privileged = true, service docker:dind | Isolasi lebih baik, butuh privileged |
| Socket binding | Mount /var/run/docker.sock | Job 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.shPisahkan runner berdasarkan kebutuhan:
dockeruntuk build image.shelluntuk deploy host.gpuuntuk job khusus.productiondengan 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 = 0concurrent 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
- Build dan test → Docker executor.
- Deploy ke host → Shell executor di host tersebut.
- Butuh isolasi penuh tanpa akses host → Docker executor tanpa socket.
- Butuh build image → DinD atau kaniko/buildah.
- 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
Bangun image di Docker Image Build & Container Registry.
GitHub Actions & GitLab CI/CD Advanced
Reusable workflow, composite action, matrix, service container, DAG, include, dan optimasi pipeline lanjutan.
Docker Image Build & Container Registry
Membangun image produksi, memberi tag yang tepat, push ke registry, serta mengelola cache, keamanan, dan retensi image.