Modern yazılım geliştirme yaşam döngüsünde hız ve güvenilirlik esastır. Sürekli Entegrasyon ve Sürekli Dağıtım (CI/CD) hatları, bu verimliliğin omurgasıdır; geliştirme ekiplerinin kod değişikliklerini sık sık birleştirmesini ve üretimi güvenle dağıtmasını sağlar. Jenkins ve GitLab CI gibi araçlar bu alanda uzun süredir hakim olsa da, GitHub Actions derin GitHub ekosistemi entegrasyonu ve güçlü, esnek bir sözdizimi sunarak güçlü bir rakip olarak ortaya çıkmıştır.
Bu kılavuz, temel kavramlardan gelişmiş iş akışı yapılandırmalarına kadar ilerleyerek GitHub Actions kullanarak sağlam bir CI/CD hattı nasıl oluşturulacağını keşfeder.
İş Akışları ve Tetikleyicileri Anlamak
GitHub Actions'ın kalbinde iş akışları yer alır. Bunlar, GitHub'daki herhangi bir kod projesini oluşturmak, test etmek, paketlemek, yayınlamak veya dağıtmak için deposunda kurabileceğiniz otomatik süreçlerdir. Bir iş akışı, deposunun `.github/workflows` dizininde saklanan bir YAML dosyası ile tanımlanır.
Bir hat tasarlamadaki ilk adım, tetikleyicileri tanımlamaktır. GitHub Actions `push`, `pull_request`, `schedule` ve `workflow_dispatch` gibi çeşitli olayları destekler. Standart bir CI/CD hattı için, genellikle kod belirli bir dalı (branch) itildiğinde veya bir çekme isteği (pull request) açıldığında iş akışını tetiklemek istersiniz.
```yaml
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
```
Yukarıdaki örnekte, hat `main` veya `develop` dallarına yapılan her itmede ve bir çekme isteği `main` dalını hedeflediğinde çalışır. Bu, kodun üretim ortamına ulaşmadan önce doğrulanmasını sağlar.
İşler, Çalıştırıcılar ve Adımlar
Bir iş akışı, bir veya daha fazla işten oluşur; bu işler de bir veya daha fazla adımdan oluşur. Her adım, çalıştırılacak bir kabuk betiği veya yürütülecek bir eylemdir. Eylemler, GitHub Actions'ın yeniden kullanılabilir yapı taşlarıdır; resmi GitHub tarafından yönetilen eylemlerden topluluk katkılı olanlara kadar uzanır.
Tipik bir Node.js uygulaması için hat şu şekilde görünebilir:
```yaml
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Run tests
run: npm test
```
Burada, Ubuntu'nun en son sürümünde çalışan `build-and-test` adlı tek bir iş tanımlıyoruz. Adımlar, kodu kontrol etmeyi, Node.js ortamını kurmayı, tekrarlanabilir yapılar sağlayan `npm ci` kullanarak bağımlılıkları yüklemeyi ve linting ile test betiklerini çalıştırmayı içerir.
Ortam Değişkenleri ve Gizli Bilgiler
Hattınız büyüdükçe, API anahtarları, veritabanı kimlik bilgileri ve dağıtım belirteçleri gibi hassas verileri yönetmeniz gerekecektir. GitHub Actions, bunları depo gizli bilgileri (repository secrets) aracılığıyla güvenli bir şekilde yönetmek için bir yol sağlar. Gizli bilgileri asla YAML dosyalarınıza sabit kodlamayın (hardcode etmeyin).
Bir gizli bilgiyi kullanmak için, iş akışınızda `secrets` bağlamı aracılığıyla ona atıfta bulunursunuz. Dağıtım adımları için, bu gizli bilgileri dağıtım betiğinize geçirebilirsiniz:
```yaml
- name: Deploy to Production
if: github.ref == 'refs/heads/main'
run: |
./deploy.sh
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }}
```
`if` koşulu, dağıtımın yalnızca kod `main` dalına birleştirildiğinde gerçekleşmesini sağlar; bu da özellik dallarından (feature branches) yanlışlıkla yapılan dağıtımları önler.
Önbellekleme ve Optimizasyon
GitHub Actions'ın en önemli performans avantajlarından biri önbellekleme özelliğidir. `node_modules` veya Maven depoları gibi bağımlılıkları önbelleğe alarak, işlerin çalışması için geçen süreyi önemli ölçüde azaltabilirsiniz. `actions/cache` eylemi, kilitleme dosyasına dayalı bir anahtar belirlemenize olanak tanır; bu da önbelleğin yalnızca bağımlılıklar değiştiğinde geçersiz kılınmasını sağlar.
```yaml
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
```
Sonuç
GitHub Actions, yazılım geliştirme iş akışınızı otomatikleştirmek için kapsamlı bir araç seti sunar. İş akışlarını, eylemleri ve önbelleği kullanarak hem verimli hem de güvenli ve sürdürülebilir hatlar oluşturabilirsiniz. Küçük bir yan projeyi mi yoksa büyük ölçekli bir kurumsal uygulamayı mı dağıtın, GitHub Actions'ı ustalaşmak, her modern DevOps mühendisi için temel bir beceridir. Küçük başlayın, iş akışlarınız üzerinde iterasyon yapın ve geliştirme hızınızın uçtuğunu görün.