Modern yazılım geliştirme yaşam döngüsünde, Sürekli Entegrasyon ve Sürekli Dağıtım (CI/CD) sadece lüks değil; kod kalitesini korumak, teslimatı hızlandırmak ve dağıtım sürtünmesini azaltmak için zorunludur. Jenkins, GitLab CI ve CircleCI gibi araçlar bu alanda uzun süredir hakim olsa da, GitHub Actions güçlü bir rakip olarak ortaya çıkmış olup doğrudan GitHub ekosistemiyle derinlemesine entegre olmuştur. Bu entegrasyon, geliştiricilerin iş akışlarını depolarının içinde tamamen tanımlamalarını, çalıştırmalarını ve yönetmelerini sağlayarak harici derleme sunucularına ve bağlam değiştirme (context switching) ihtiyacını ortadan kaldırır.
Temel Kavramları Anlamak
Yapılandırmaya dalmadan önce, GitHub Actions'ın mimari yapı taşlarını anlamak kritik öneme sahiptir. Platform, bileşenlerin bir hiyerarşisi üzerinde çalışır:
- İş Akışı (Workflow): Depolarınızın
.github/workflows dizini içindeki bir YAML dosyasında tanımladığınız otomatik bir süreçtir. Bir iş akışı, bir veya daha fazla iş (job) içerir.
- İş (Job): Aynı çalıştırıcı (runner) üzerinde yürütülen bir adım kümesidir. Her adım ya bir kabuk betiğidir ya da bir eylemdir.
- Çalıştırıcı (Runner): İş akışları tetiklendiğinde bunları çalıştıran sunucudur. GitHub, genel (public) depolar için ücretsiz olarak barındırılan çalıştırıcılar (ubuntu-latest, windows-latest, macos-latest) sağlar.
- Olay (Event): Bir iş akışını tetikleyen belirli bir aktivitedir; örneğin bir push, çekme isteği (pull request) veya zamanlanmış görev.
- Eylem (Action): GitHub Actions iş akışının en küçük yapı taşıdır. Eylemler, kodu kontrol etmek veya bir çalışma ortamı kurmak gibi karmaşık ancak sıkça tekrarlanan görevleri yerine getiren özel uygulamalardır.
İlk İş Akışınızı Kurma
GitHub Actions'ın en çekici yönü sadeliğidir. Bir boru hattı (pipeline) oluşturmak için bir YAML dosyası oluşturursunuz. Pratik bir örnek oluşturalım: ana dalda yapılan her push'ta bağımlılıkları yükleyen, testleri çalıştıran ve uygulamayı derleyen standart bir Node.js projesi boru hattı.
Depo kök dizininizde
.github/workflows/nodejs-ci.yml adında bir dosya oluşturun. Yapı, iş akışının adını ve tetikleyicileri (olayları) tanımlayarak başlar.
name: Node.js CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
Bu yapılandırmada, uygulamayı aynı anda birden fazla Node.js sürümüne karşı test etmek için bir
matrix stratejisi kullanıyoruz. Bu, ortamlar arasında uyumluluğu sağlar.
actions/checkout adımı, kodunuzu çalıştırıcının çalışma alanına getirmek için GitHub tarafından sağlanan halka açık bir eylemdir.
actions/setup-node eylemi, Node.js çalışma ortamının kurulumunu otomatikleştirir ve ortam kurulumu için karmaşık kabuk betiklerini yazmaktan bizi kurtarır.
Güvenli Dağıtımlar İçin Gizli Bilgilerden (Secrets) Yararlanma
Boru hatları büyüdükçe, genellikle Docker Hub kimlik bilgileri, AWS erişim anahtarları veya dağıtım tokenları gibi hassas bilgilere erişim gerektirir. Bu değerleri kodun içine gömmek (hardcode) kritik bir güvenlik riskidir. GitHub Actions, bunu
Actions Secrets aracılığıyla güvenli bir şekilde ele almak için bir yol sağlar.
Bu değerleri depolamak için depolarınızın
Ayarlar > Gizli bilgiler ve değişkenler > Actions bölümüne gidin. Ardından bunları YAML dosyalarınızda
secrets bağlamı kullanılarak referans gösterebilirsiniz.
- name: Deploy to AWS S3
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Upload to S3
run: aws s3 sync ./dist s3://my-production-bucket
${{ secrets.MY_SECRET }} sözdizimini kullanarak GitHub, değerlerin günlüklerde (logs) maskelendiğini ve hassas verilerin yanlışlıkla ifşa edilmesini önlerken iş akışınızın harici hizmetlerle güvenli bir şekilde kimlik doğrulaması yapmasına olanak tanır.
Boru Hatlarını Optimize Etme ve Hata Ayıklama
Altyapınız genişledikçe, boru hattı verimliliği hayati önem kazanır. Optimize etmek için
node_modules veya Docker katmanları gibi bağımlılıkları önbelleğe almak amacıyla
actions/cache kullanmayı düşünün. Bu, yürütme süresini ve enerji tüketimini önemli ölçüde azaltır. Ayrıca, işlerinizde
needs kullanımı karmaşık bağımlılık grafikleri oluşturmanıza olanak tanır. Örneğin, test işi başarısız olursa dağıtım adımını atlamak isteyebilirsiniz.
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: echo "Running tests"
deploy:
needs: test
runs-on: ubuntu-latest
if: success()
steps:
- run: echo "Deploying only if tests passed"
Sonuç
GitHub Actions, CI/CD'yi çoğu kodun bulunduğu platforma yerel olarak getirerek onu demokratikleştirmiştir. YAML tabanlı yapılandırması sezgiseldir, yeniden kullanılabilir eylemlerin geniş pazarı geliştirmeyi hızlandırır ve GitHub Arayüzü ile entegrasyonu, boru hattı sağlığı hakkında anında görünürlük sağlar. Orta ve ileri düzey geliştiriciler için Actions'ı ustalaşmak, basit derlemelerin ötesine geçerek geliştirme ekibinizi gerçekten güçlendiren sağlam, güvenli ve verimli DevOps boru hatları oluşturmaktır. Küçük başlayın, sık sık iterasyon yapın ve ideal altyapınızı oluşturmak için topluluk katkılarından yararlanın.