GitHub Actions Nedir?
GitHub Actions, GitHub'ın yerleşik CI/CD (Continuous Integration / Continuous Delivery) platformudur. 2019 yılında genel kullanıma sunulan bu araç, yazılım geliştirme süreçlerinin otomasyonunu doğrudan GitHub deposu içinden yönetmenizi sağlar. Kod değişikliklerini otomatik olarak test etme, derleme, paketleme ve dağıtma gibi işlemleri YAML tabanlı iş akışlarıyla tanımlayabilirsiniz.
GitHub Actions'ın en büyük avantajı, versiyon kontrol sistemi ile CI/CD aracının aynı platform üzerinde entegre olmasıdır. Ayrı bir Jenkins, CircleCI veya Travis CI kurulumuna gerek kalmadan, tüm otomasyon süreçlerinizi GitHub üzerinde yönetebilirsiniz.
Temel Kavramlar
Workflow (İş Akışı)
Workflow, bir veya birden fazla job içeren otomatik bir süreçtir. YAML dosyası olarak .github/workflows dizininde tanımlanır. Her workflow bir veya birden fazla tetikleyici (trigger) ile başlatılabilir.
Event (Olay)
Workflow'u tetikleyen GitHub etkinlikleridir. En yaygın kullanılanlar:
- push: Kod push edildiğinde tetiklenir
- pull_request: Pull request açıldığında, güncellendiğinde veya kapatıldığında
- schedule: Cron ifadesiyle zamanlanan periyodik çalışma
- workflow_dispatch: Manuel tetikleme
- release: Yeni bir sürüm yayımlandığında
- issue: Issue oluşturulduğunda veya güncellendiğinde
Job (İş)
Bir workflow içindeki bağımsız çalışma birimidir. Her job kendi runner'ında çalışır. Job'lar varsayılan olarak paralel çalışır, ancak needs ifadesiyle bağımlılık tanımlanabilir.
Step (Adım)
Bir job içindeki bireysel görevlerdir. Her step ya bir shell komutu ya da bir action çalıştırır. Step'ler sıralı olarak çalışır ve aynı runner ortamını paylaşır.
Runner
Job'ların çalıştırıldığı sanal veya fiziksel makinalardır. GitHub, Ubuntu Linux, Windows Server ve macOS runner'ları sunmaktadır. Özel ihtiyaçlar için self-hosted runner kullanılabilir.
İlk Workflow Dosyasını Oluşturma
GitHub Actions workflow dosyaları .github/workflows dizininde .yml veya .yaml uzantısıyla oluşturulur. Temel bir CI workflow'u şu bileşenlerden oluşur: workflow adı, tetikleyici olay tanımı, job tanımı, runner seçimi ve step'ler.
Temel Workflow Yapısı
Bir workflow dosyasında önce name ile iş akışının adı belirlenir. Ardından on bloğunda tetikleyiciler tanımlanır. jobs bloğunda ise çalışacak işler ve adımları yer alır. Her job runs-on ile hangi işletim sisteminde çalışacağını belirtir ve steps ile sıralı adımları tanımlar.
Actions Marketplace
GitHub Actions Marketplace, topluluk tarafından geliştirilen binlerce hazır action içerir. Bu action'lar workflow'larınızda yeniden kullanılabilir bileşenler olarak kullanılır ve yaygın görevleri kolaylaştırır.
En Popüler Action'lar
| Action | Amaç | Kullanım |
|---|---|---|
| actions/checkout | Kodu indir | Her workflow'da gerekli |
| actions/setup-node | Node.js ortamı kur | JavaScript/TypeScript projeleri |
| actions/setup-dotnet | .NET SDK kur | .NET projeleri |
| actions/cache | Bağımlılık önbelleği | Build sürelerini kısaltma |
| docker/build-push-action | Docker image oluştur ve push et | Container tabanlı deployment |
| azure/webapps-deploy | Azure App Service'e deploy et | Azure deployment |
Özel Action Yazma
Kendi action'larınızı üç farklı yöntemle oluşturabilirsiniz: JavaScript action, Docker container action ve Composite action. Composite action'lar, mevcut step'leri birleştirerek yeniden kullanılabilir yapılar oluşturmanın en basit yoludur.
Matrix Build Stratejisi
Matrix build, aynı job'u farklı konfigürasyonlarla paralel olarak çalıştırmanızı sağlar. Özellikle birden fazla işletim sistemi, programlama dili sürümü veya veritabanı sürümü üzerinde test yapmak için idealdir.
Matrix Kullanım Senaryoları
- Birden fazla Node.js sürümünde test (16, 18, 20)
- Birden fazla işletim sisteminde test (Ubuntu, Windows, macOS)
- Birden fazla veritabanı sürümüyle uyumluluk testi
- .NET Framework ve .NET Core sürümlerinde paralel build
Matrix Konfigürasyon Seçenekleri
Matrix strategy bloğunda fail-fast ayarı ile bir konfigürasyon başarısız olduğunda diğerlerinin durdurulup durdurulmayacağı belirlenebilir. max-parallel ile aynı anda çalışacak maksimum job sayısı sınırlanabilir. exclude ve include ifadeleriyle belirli kombinasyonlar çıkarılabilir veya eklenebilir.
Secrets ve Güvenlik
CI/CD süreçlerinde API anahtarları, veritabanı şifreleri ve deploy token'ları gibi hassas bilgilerin güvenli yönetimi kritik öneme sahiptir.
GitHub Secrets
GitHub Secrets, hassas verileri şifreli olarak saklar. Repository, environment ve organization düzeyinde secret tanımlanabilir. Secret'lar workflow loglarında otomatik olarak maskelenir.
Güvenlik En İyi Uygulamaları
- Secret'ları asla kod içinde veya log'larda açığa çıkarmayın
- Üçüncü taraf action'ları kullanırken belirli commit SHA'sını pin'leyin
- GITHUB_TOKEN'ın minimum gerekli izinlerle çalışmasını sağlayın
- Fork'lardan gelen pull request'lerde secret erişimini kısıtlayın
- Environment protection rules ile deployment onay süreçleri tanımlayın
- OIDC (OpenID Connect) ile bulut sağlayıcılarına güvenli kimlik doğrulama yapın
Deployment Stratejileri
Bulut Platformlarına Deployment
GitHub Actions, tüm büyük bulut platformlarıyla entegre çalışır. Azure App Service, AWS Elastic Beanstalk, Google Cloud Run, DigitalOcean App Platform ve Vercel gibi servislere otomatik deployment tanımlanabilir.
Docker ve Kubernetes Deployment
Docker image'ları GitHub Actions ile oluşturulup Docker Hub, GitHub Container Registry veya özel registry'lere push edilebilir. Kubernetes ortamlarına kubectl veya Helm chart'ları aracılığıyla deployment gerçekleştirilebilir.
Deployment Ortamları (Environments)
GitHub Environments, deployment süreçlerini kontrol etmek için güçlü bir mekanizma sunar. Her ortam için ayrı secret'lar, koruma kuralları ve onay süreçleri tanımlanabilir. Tipik ortam yapısı: Development, Staging, Production şeklindedir.
Self-Hosted Runners
GitHub'ın sunduğu runner'lar birçok senaryo için yeterli olsa da, bazı durumlarda kendi runner'ınızı barındırmanız gerekebilir.
Self-Hosted Runner Avantajları
- Özel donanım: GPU, yüksek bellek veya özel işlemci gereksinimleri
- Ağ erişimi: Dahili ağdaki kaynaklara erişim (veritabanları, servisler)
- Maliyet kontrolü: Yoğun kullanımda GitHub-hosted runner'lardan daha ekonomik
- Özelleştirme: Önceden kurulmuş araçlar ve bağımlılıklar
- Uyumluluk: Kurumsal güvenlik politikalarına uygunluk
Self-Hosted Runner Güvenlik Dikkat Noktaları
Self-hosted runner'lar özellikle açık kaynak projelerde güvenlik riski oluşturabilir. Fork'lardan gelen workflow'ların runner üzerinde zararlı kod çalıştırma riski vardır. Bu nedenle self-hosted runner'ları yalnızca özel (private) depolarda kullanmak önerilir.
İleri Düzey Özellikler
Reusable Workflows
Tekrar eden workflow tanımlarını merkezi bir depoda oluşturup, diğer depolardan referans vererek kullanabilirsiniz. Bu yaklaşım, organizasyon genelinde standart CI/CD süreçleri oluşturmak için idealdir.
Concurrency Control
Aynı workflow'un birden fazla örneğinin eşzamanlı çalışmasını kontrol edebilirsiniz. cancel-in-progress ayarı ile yeni bir çalışma başladığında önceki çalışmayı otomatik olarak iptal edebilirsiniz.
Artifact Yönetimi
Build çıktıları, test raporları ve log dosyaları artifact olarak saklanabilir. actions/upload-artifact ve actions/download-artifact action'ları ile job'lar arası veri paylaşımı yapılabilir.
Cache Stratejileri
Bağımlılık indirme sürelerini dramatik şekilde azaltmak için cache kullanılır. npm, pip, NuGet, Maven ve Gradle gibi paket yöneticilerinin cache'leri workflow çalışmaları arasında paylaşılabilir.
GitHub Actions, sadece bir CI/CD aracı değil, aynı zamanda geliştirme süreçlerinizin tamamını otomatikleştirebileceğiniz güçlü bir otomasyon platformudur. Issue yönetiminden kod incelemesine, test otomasyonundan deployment'a kadar her adımı kapsayabilir.
Sonuç
GitHub Actions, modern yazılım geliştirme süreçlerinde CI/CD otomasyonunu erişilebilir ve güçlü bir şekilde sunar. YAML tabanlı konfigürasyonu, zengin marketplace ekosistemi, matrix build desteği ve esnek deployment seçenekleriyle her ölçekteki proje için uygun bir çözümdür. Güvenlik en iyi uygulamalarını takip ederek, self-hosted runner'ları gerektiğinde kullanarak ve reusable workflow'larla standardizasyon sağlayarak, ekibinizin geliştirme verimliliğini önemli ölçüde artırabilirsiniz.