İçeriğe geç
GitLab Runner

GitLab Runner, .gitlab-ci.yml içinde tanımlanan job’ları çalıştıran ajandır. GitLab sunucusu pipeline’ı planlar; runner ise işi fiilen çalıştırır ve sonucu GitLab’a raporlar. Bu yüzden GitLab Runner, CI/CD’nin yalnızca yardımcı bileşeni değil, güvenlik ve kapasite kararının merkezidir.

Runner konusunda en sık sorulanlar şunlardır: pipeline neden kuyrukta bekliyor, hangi executor seçilmeli, Kubernetes’e geçmeli miyiz ve gizli bilgileri nasıl koruruz? Bu sorular ayrı ayrı değil, tek bir runner mimarisi kararı olarak ele alınmalıdır.

Executor seçimi

Runner’ın işi nerede çalıştıracağını executor belirler:

ExecutorNe zaman uygun?Dikkat noktası
DockerStandart build/test işleri, container tabanlı toolchainDocker socket, cache ve image güvenliği tasarlanmalı
KubernetesDinamik ölçek, pod izolasyonu, büyük CI trafiğiNamespace, service account ve network policy sınırları gerekir
ShellÖzel donanım veya çok basit güvenilen işlerİzolasyon zayıftır; güvenilmeyen kod için uygun değildir
SSH / özel modellerMevcut uzak makinelerde iş çalıştırmaBakımı ve erişim kontrolü daha dikkat ister

Kubernetes executor modern ekipler için güçlüdür; her job ayrı pod olarak çalıştırılabilir ve iş bitince ortam temizlenebilir. Ancak Kubernetes kullanmak otomatik olarak güvenli yapmaz. Pod yetkileri, node seçimi, image pull izinleri ve ağ politikaları ayrıca yapılandırılmalıdır.

Shared, group ve project runner

Runner paylaşımı bir maliyet/izolasyon kararıdır:

  • Shared runner: Çok sayıda proje ortak kullanır. Yönetimi kolaydır, ancak güvenlik ve kuyruk kontrolü sınırlı olabilir.
  • Group runner: Aynı ekip veya ürün ailesi için dengeli modeldir. Ortak standart korunurken erişim sınırı çizilebilir.
  • Project runner: Hassas iş, özel donanım, production deploy veya lisanslı araç gerektiren projelerde tercih edilir.

Her job aynı güven seviyesinde değildir. Test job’ı, image build job’ı ve production deploy job’ı aynı runner havuzunda çalışmamalıdır.

Güvenlik: gizli bilgiyi job’a göre verin

Runner güvenliğinde temel prensip, job’ın yalnızca ihtiyacı olan erişimi almasıdır.

Somut kontroller:

  • Merge request job’ları için production deploy anahtarı sağlamayın.
  • Fork veya dış katkı pipeline’larını iç ağa erişen runner’da çalıştırmayın.
  • Protected branch/tag şartı olmadan hassas değişkenleri açmayın.
  • Shell executor’ı güvenilmeyen kodda kullanmayın.
  • Runner cache’ini proje ve güven seviyesi bazında ayırın.
  • Privileged container kullanımını istisna haline getirin.
  • Deploy job’larını ayrı runner tag’i ve onay mekanizmasıyla sınırlandırın.

Burada “secret” yerine pratik soru şudur: Bu job hangi gizli bilgiye, hangi ortamda, ne kadar süreyle erişiyor?

Image build: DinD her zaman doğru cevap değil

Docker-in-Docker bazı pipeline’larda kolaylık sağlar; fakat privileged çalışma ve Docker daemon erişimi nedeniyle risk doğurabilir. Image build için şu seçenekler karşılaştırılmalıdır:

  • BuildKit veya rootless build yaklaşımları
  • Kaniko benzeri daemon gerektirmeyen build araçları
  • Ayrı ve izole DinD runner havuzu
  • Merkezi build cache ve base image yönetimi

Eğer DinD gerekiyorsa, bunu tüm runner havuzuna açmak yerine sadece image build job’larına ayrılmış runner’larda çalıştırmak daha güvenli olur.

Kapasite ve maliyet

Runner kapasitesi yanlış planlandığında geliştirici deneyimi bozulur: pipeline kuyrukları uzar, cache verimsizleşir, büyük image pull işlemleri ağı tüketir. Satın alma ve işletim kararında şu metrikler izlenmelidir:

  • Ortalama ve p95 pipeline bekleme süresi
  • Runner doluluk oranı
  • Job başına CPU/bellek ihtiyacı
  • Cache hit oranı
  • Artifact ve container image storage büyümesi
  • Başarısız job tekrarlarının oranı

GitLab.com kullanıyorsanız compute minutes ve plan sınırları; self-managed kullanıyorsanız VM/Kubernetes kapasitesi, bakım ve izleme maliyeti birlikte değerlendirilmelidir.

Resmi kaynaklar

Mono ne zaman yardımcı olur?

  • Docker/Kubernetes/Shell executor seçimi
  • Runner group ve tag stratejisi
  • Güvenilmeyen job ayrımı
  • Gizli bilgi kapsamı ve protected branch modeli
  • Kubernetes executor kurulumu ve ağ politikaları
  • Image build güvenliği ve cache tasarımı
  • Pipeline kuyruk ve kapasite analizi

Sıkça sorulan sorular

GitLab Runner hangi executor ile kullanılmalı?
Docker executor çoğu container tabanlı iş için pratiktir. Kubernetes executor her job için pod tabanlı ölçekleme ve izolasyon sağlar. Shell executor yalnızca güvenilen işlerde veya özel donanım ihtiyacında dikkatle kullanılmalıdır. Seçim hızdan önce güvenlik sınırı ve bakım yüküne göre yapılmalıdır.
Shared runner ile dedicated runner farkı nedir?
Shared runner birden fazla proje tarafından kullanılabilir; küçük ve güvenilen ekiplerde yeterli olabilir. Dedicated group/project runner belirli proje veya grup için ayrılır; hassas gizli bilgi, özel ağ erişimi veya yoğun pipeline trafiği varsa daha kontrollü bir model sağlar.
Güvenilmeyen job ne demektir?
Merge request, fork, dış katkı veya henüz güvenilmeyen branch kodunun runner üzerinde çalışmasıdır. Bu işler üretim ağına erişen, deploy anahtarı taşıyan veya kalıcı host üzerinde çalışan runner havuzuna gönderilmemelidir.
Docker-in-Docker zorunlu mu?
Hayır. Container image build için Docker-in-Docker tek seçenek değildir ve privileged çalışma gerektirdiğinde risk artırabilir. Kaniko, BuildKit veya rootless yaklaşımlar gibi alternatifler değerlendirilebilir; entegrasyon testleri için DinD gerekiyorsa ayrı ve sınırlı runner havuzu kurulmalıdır.
GitLab Runner maliyeti nasıl düşünülmeli?
Runner maliyeti yalnızca CPU dakikası değildir. Node/VM kapasitesi, cache ve artifact storage, image pull trafiği, bakım zamanı, güvenlik izleme ve kuyruk süreleri birlikte değerlendirilmelidir. GitLab.com compute minutes ile self-managed runner maliyeti ayrı ayrı hesaplanmalıdır.

Bir sonraki dönüşümü birlikte planlayalım.

Ekibimiz teknik gereksinimlerinizi anlamak ve hızlıca prototip çıkarmak için hazır.