Service Containers
Service containers, GitHub Actions içinde bir job’un yanına tanımlayabileceğin ek Docker konteynerleridir. Örneğin, test aşamasında bir veritabanı (MySQL, PostgreSQL), cache (Redis), message broker (RabbitMQ) vb. hizmete ihtiyaç duyarsan, bu hizmeti “service” olarak tanımlarsın ve aynı job içinde, test kodun bu konteynerle iletişime geçer. Aşağıda konuyu özetliyorum:
1) Service Container Nedir?
GitHub Actions, job başlarken senin tanımladığın “service container” imajlarını otomatik olarak çalıştırır.
Job bitince (veya başarısız olup da tamamlannca) bu container’lar otomatik kapatılıp kaldırılır.
Aynı job içindeki step’ler, bu service container’lara “hostname” veya “localhost” + port üzerinden erişebilir.
Uses Cases
Use Case Açıklaması
Proje Senaryosu: Örneğin Node.js tabanlı bir uygulama/cache kütüphanesi veya test suite’inin Redis’e ihtiyaç duyduğunu varsayalım. Bu workflow, “main” branch’e push yaptığında otomatik devreye girip testlerini koşturur.
Service Container: “services.redis” alanı, job başlarken bir Redis konteyneri (versiyon 6, alpine imaj) açar. 6379 portunu job ile bağlar.
Erişim: Testler “redis” adıyla hostname’e bağlanabilir.
env.REDIS_HOST
olarak “redis” ayarlanmıştır.Sağlık Kontrolü: “options” altındaki
--health-cmd
vs. Redis başlatılınca “READY” duruma gelene dek bekler.Temizlik: Job bittiğinde container otomatik kapatılır.
Böylece her push’ta “sıfırdan” temiz bir Redis ortamı oluşturulup test edilir, test sonra biter bitmez container kaldırılır. Bu yaklaşım, CI/CD’de paylaşılan veritabanı/servis kalıntılarından kaçınarak izole, tekrarlanabilir test ortamı sağlar.
Uses Case 2
2) Nasıl Çalışır?
Job Başlarken
GitHub, senin
services:
altına yazdığın her imajı birer container olarak ayağa kaldırır.“Bridge mode” ya da “Host mode” gibi network seçenekleriyle, job’un ana container’ı (veya runner) ile bu service container iletişim kurar.
İletişim
Default “bridge mode”da, service container’a hostname olarak “service id” kullanırsın. Yukarıdaki örnekte “postgres”.
Port mapping ile, “
5432:5432
” diyorsan job, “<serviceName>:5432
” veya “localhost:5432
” şeklinde erişebilir. Genelde hostname = “postgres” + port = 5432.
Job Bitince
Tüm service container’lar otomatik sonlandırılır ve temizlenir.
Manual cleanup gerekmez.
3) Neden Kullanmalı?
Kolay Test Ortamı: Örneğin CI aşamasında veritabanına veya cache sistemine ihtiyaç varsa, sunucu kurmak yerine Docker imajını “services” olarak ekleyebilirsin.
Geçici ve İzole: Her job ayrı container çalıştırdığı için test verileri, config vb. bir sonraki job’a sızmaz.
Otomatik Yönetim: Container’ları elle başlatma/durdurma uğraşın olmadan, “services” tanımıyla her job’da istediğin ek hizmeti açarsın.
4) Dikkat Noktaları
Sadece Linux Runner
Docker tabanlı bu sistem, GitHub Hosted runner’larda Ubuntu kullanır veya Self-Hosted runner’da Linuxmakine gerekir. Windows/macOS runner’larda service containers desteklenmez.
Network Ayarları
Varsayılan “bridge” modda, hostname “service adın”dır.
ports:
ile port yönlendirmesi yapılır.Bazı durumlarda “host” mod istersen, self-hosted runner ve Docker kurulumuna özel ayarlar gerekebilir.
Büyük İmajlar
Service container imajı çok büyükse, job başlarken indirme süresi uzun olabilir. Gerekirse caching yöntemleri veya optimize edilmiş imajlar kullanılmalı.
Kısıtlamalar
Service containers “composite actions” içinde tanımlanamaz. Sadece bir job context’inde çalıştırabilirsin.
Özet
Service Containers: Job’un yanına ek Docker container’lar ekleyip, test veya uygulama için gerekli altyapı hizmetlerini hızlıca ayağa kaldırma yolu.
Otomatik yönetim: Job başında kurulur, job bitince silinir.
Kolay Entegrasyon: Step’lerin bu hizmete
hostname:port
üzerinden erişip test yapar.Örnek: DB, cache, MQ vb. test ortamları.
Last updated
Was this helpful?