Günümüzde yazılım geliştirme süreçleri, hızlı ve güvenilir dağıtım döngüleri üzerine kuruludur. Manuel dağıtım süreçleri zaman alıcı, hataya açık ve ölçeklenebilir değildir. İşte tam bu noktada GitHub Actions devreye giriyor. GitHub Actions, doğrudan GitHub repositörünüzde otomatikleştirilmiş iş akışları (workflows) oluşturmanıza olanak tanıyan güçlü bir sürekli entegrasyon ve sürekli dağıtım (CI/CD) aracıdır. Bu makale, GitHub Actions'ı kullanarak bir Node.js API'sinin otomatik dağıtımını derinlemesine inceleyecektir. Amacımız, okuyucunun hem teorik bilgiye sahip olmasını hem de pratik uygulamaları kolayca gerçekleştirebilmesini sağlamaktır.
1. Giriş: Otomatik Dağıtımın Önemi ve GitHub Actions'ın Rolü
Modern yazılım geliştirme süreçlerinde, kodun yazılmasından sonraki aşama olan dağıtım, uygulamanın kullanıcılarla buluştuğu kritik bir adımdır. Geleneksel manuel dağıtım yöntemleri, geliştiricilerin zamanını önemli ölçüde alırken, insan hatası riskini de beraberinde getirir. Otomatik dağıtım ise bu sorunlara çözüm sunarak, geliştirme ve operasyon ekiplerinin (DevOps) daha verimli çalışmasını sağlar. GitHub Actions, bu otomasyonu sağlayan popüler araçlardan biridir.
1.1. Otomatik Dağıtımın Faydaları
- Hız: Yeni özellikler ve düzeltmeler, daha hızlı bir şekilde kullanıcılara sunulur.
- Güvenilirlik: İnsan hatası riski azalır ve dağıtım süreçleri daha tutarlı hale gelir.
- Verimlilik: Geliştiriciler, dağıtım işlemleriyle uğraşmak yerine kod yazmaya odaklanabilirler.
- Ölçeklenebilirlik: Artan dağıtım ihtiyaçları, manuel müdahale olmadan karşılanabilir.
- Geri Alma Kolaylığı: Otomatik dağıtım sistemleri, hatalı bir dağıtımı kolayca geri alma imkanı sunar.
1.2. GitHub Actions Nedir?
GitHub Actions, GitHub tarafından sunulan bir CI/CD platformudur. YAML dosyaları aracılığıyla tanımlanan iş akışları (workflows) sayesinde, bir dizi görevi otomatik olarak gerçekleştirebilirsiniz. Bu görevler arasında test çalıştırma, kod analizi, Docker imajı oluşturma ve dağıtım gibi işlemler yer alır. GitHub Actions, geniş bir yelpazede platform ve araç desteği sunarak, farklı proje ihtiyaçlarına uyum sağlar.
1.3. Neden GitHub Actions?
- Ücretsiz Katman: Açık kaynak projeleri için ücretsiz kullanım imkanı sunar.
- Entegrasyon Kolaylığı: Doğrudan GitHub repositörüsüyle entegre çalışır.
- Geniş Topluluk Desteği: Çok sayıda hazır aksiyon (actions) ve iş akışı şablonu bulunur.
- Esneklik: Farklı programlama dilleri ve platformlarla uyumlu çalışır.
- Ölçeklenebilirlik: Artan proje ihtiyaçlarına göre kolayca ölçeklenebilir.
2. Gerekli Araçlar ve Hazırlıklar
GitHub Actions ile Node.js API'sini otomatik olarak dağıtmak için belirli araçlara ve hazırlıklara ihtiyaç vardır. Bu bölüm, gerekli ön koşulları ve kurulum adımlarını detaylı bir şekilde ele alacaktır.
2.1. Hesaplar ve Erişim Hakları
- GitHub Hesabı: Bir GitHub hesabınızın olması gerekmektedir.
- Dağıtım Ortamı Hesabı: Dağıtım yapacağınız ortama (örneğin, AWS, Azure, Heroku) ait bir hesabınız olmalıdır.
- API Anahtarları ve Kimlik Bilgileri: Dağıtım ortamına erişim için gerekli olan API anahtarları ve kimlik bilgilerini güvenli bir şekilde saklamanız gerekmektedir (GitHub Secrets).
2.2. Node.js ve npm/yarn
- Node.js: API'nizin çalışması için gerekli olan Node.js'nin kurulu olması gerekmektedir.
- npm veya yarn: Bağımlılıkları yönetmek için npm veya yarn paket yöneticilerinden birini kullanmanız gerekmektedir.
2.3. Proje Yapısı
Projenizin belirli bir yapıya sahip olması, dağıtım sürecini kolaylaştıracaktır. Önerilen proje yapısı aşağıdaki gibidir:
my-node-api/
├── .github/workflows/ # GitHub Actions iş akışları
│ └── deploy.yml
├── src/ # API kaynak kodları
│ ├── index.js
│ └── ...
├── package.json # Proje bağımlılıkları ve script'leri
├── .gitignore # Git tarafından takip edilmeyecek dosyalar
└── README.md
2.4. GitHub Secrets
API anahtarları, veritabanı şifreleri ve diğer hassas bilgileri GitHub repositörüsünde doğrudan saklamak güvenli değildir. Bu nedenle, bu bilgileri GitHub Secrets olarak saklamanız gerekmektedir. GitHub Secrets, şifrelenmiş ortamlardır ve sadece GitHub Actions iş akışları tarafından erişilebilir.
GitHub Secrets'ı ayarlamak için:
- GitHub repositörünüzde "Settings" sekmesine gidin.
- "Secrets" bölümünü bulun ve tıklayın.
- "New repository secret" butonuna tıklayarak yeni bir secret oluşturun.
- Secret adını ve değerini girin.
3. GitHub Actions İş Akışı (Workflow) Oluşturma
GitHub Actions iş akışları, `.github/workflows` dizini altında bulunan YAML dosyaları ile tanımlanır. Bu bölümde, bir Node.js API'sini otomatik olarak dağıtmak için gerekli olan bir iş akışı örneği oluşturacağız.
3.1. YAML Dosyası Oluşturma
`.github/workflows` dizini altında `deploy.yml` adında bir dosya oluşturun. Bu dosya, dağıtım iş akışını tanımlayacaktır.
3.2. İş Akışının Temel Yapısı
YAML dosyasının temel yapısı aşağıdaki gibidir:
name: Node.js API Dağıtımı
on:
push:
branches:
- main # Hangi branch'e push yapıldığında tetiklenecek
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Kod Çekme
uses: actions/checkout@v3
- name: Node.js Kurulumu
uses: actions/setup-node@v3
with:
node-version: '16.x'
- name: Bağımlılıkları Yükle
run: npm install
- name: Testleri Çalıştır
run: npm test
- name: Dağıtım
run: |
# Dağıtım komutları buraya gelecek
echo "Dağıtım Başarılı!"
3.3. İş Akışının Detaylı Açıklaması
- name: İş akışının adını belirtir.
- on: İş akışını tetikleyecek olayları belirtir. Bu örnekte, `main` branch'ine yapılan `push` olayları tetikleyecektir.
- jobs: İş akışında çalışacak işleri (jobs) tanımlar. Bu örnekte, sadece `deploy` adında bir iş bulunmaktadır.
- runs-on: İşin hangi sanal ortamda çalışacağını belirtir. Bu örnekte, `ubuntu-latest` kullanılmıştır.
- steps: İşin içinde çalışacak adımları tanımlar. Her adım, bir aksiyon (action) veya bir komut olabilir.
- uses: Hazır bir aksiyonu kullanmak için kullanılır. Örneğin, `actions/checkout@v3` aksiyonu, kodu repositöriden çeker.
- run: Kabuk komutlarını çalıştırmak için kullanılır. Örneğin, `npm install` komutu, bağımlılıkları yükler.
3.4. Dağıtım Adımı
Dağıtım adımı, uygulamanızı hedef ortama dağıtmak için gerekli olan komutları içerir. Bu komutlar, dağıtım yaptığınız ortama göre değişiklik gösterecektir. Örneğin, Heroku'ya dağıtım yapmak için Heroku CLI'yı kullanabilirsiniz.
- name: Dağıtım
run: |
heroku login
heroku git:remote -a my-heroku-app
git push heroku main
Bu örnekte, `heroku login` komutu ile Heroku'ya giriş yapılır, `heroku git:remote` komutu ile Heroku uygulamasına bir remote eklenir ve `git push heroku main` komutu ile kodlar Heroku'ya gönderilir.
4. Dağıtım Ortamına Göre İş Akışı Örnekleri
GitHub Actions ile farklı dağıtım ortamlarına dağıtım yapmak mümkündür. Bu bölümde, popüler dağıtım ortamlarına göre iş akışı örnekleri sunulacaktır.
4.1. Heroku'ya Dağıtım
Heroku, bulut tabanlı bir uygulama platformudur. Heroku'ya dağıtım yapmak için aşağıdaki adımları izleyebilirsiniz:
- Heroku hesabı oluşturun.
- Heroku CLI'yı kurun.
- Heroku'da bir uygulama oluşturun.
- GitHub Secrets'a `HEROKU_API_KEY` adında bir secret ekleyin. Bu secret, Heroku API anahtarınızı içermelidir.
- Aşağıdaki iş akışını kullanın:
name: Heroku'ya Dağıtım
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Kod Çekme
uses: actions/checkout@v3
- name: Node.js Kurulumu
uses: actions/setup-node@v3
with:
node-version: '16.x'
- name: Bağımlılıkları Yükle
run: npm install
- name: Testleri Çalıştır
run: npm test
- name: Heroku'ya Dağıtım
run: |
git remote add heroku https://git.heroku.com/your-heroku-app-name.git
git push heroku main:main -f
4.2. AWS EC2'ye Dağıtım
AWS EC2, Amazon Web Services tarafından sunulan sanal sunucu hizmetidir. EC2'ye dağıtım yapmak için aşağıdaki adımları izleyebilirsiniz:
- Bir AWS hesabı oluşturun.
- EC2'de bir sanal sunucu oluşturun.
- EC2 sunucusuna SSH ile bağlanabilmek için gerekli olan SSH anahtarlarını oluşturun.
- GitHub Secrets'a `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` ve `SSH_PRIVATE_KEY` adında secret'lar ekleyin.
- Aşağıdaki iş akışını kullanın:
name: AWS EC2'ye Dağıtım
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Kod Çekme
uses: actions/checkout@v3
- name: Node.js Kurulumu
uses: actions/setup-node@v3
with:
node-version: '16.x'
- name: Bağımlılıkları Yükle
run: npm install
- name: Testleri Çalıştır
run: npm test
- name: AWS EC2'ye Dağıtım
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /path/to/your/app
git pull origin main
npm install
pm2 restart your-app-name
4.3. Docker ile Dağıtım
Docker, uygulamaları konteynerler içinde paketlemeye ve dağıtmaya olanak tanıyan bir platformdur. Docker ile dağıtım yapmak için aşağıdaki adımları izleyebilirsiniz:
- Bir Docker hesabı oluşturun.
- Projeniz için bir Dockerfile oluşturun.
- GitHub Secrets'a `DOCKER_USERNAME` ve `DOCKER_PASSWORD` adında secret'lar ekleyin.
- Aşağıdaki iş akışını kullanın:
name: Docker ile Dağıtım
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Kod Çekme
uses: actions/checkout@v3
- name: Docker Kurulumu
uses: docker/setup-buildx-action@v2
- name: Docker'a Giriş
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker İmajını Oluştur ve Yayınla
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: your-docker-username/your-app-name:latest
5. Test Otomasyonu Entegrasyonu
Otomatik dağıtım sürecinin önemli bir parçası, test otomasyonudur. Kodun dağıtılmadan önce test edilmesi, hataların erken tespit edilmesini ve uygulamanın kalitesinin artmasını sağlar.
5.1. Test Script'leri Tanımlama
Projenizin `package.json` dosyasında, test script'lerini tanımlamanız gerekmektedir. Örneğin:
{
"name": "my-node-api",
"version": "1.0.0",
"scripts": {
"test": "jest"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"jest": "^27.0.0"
}
}
Bu örnekte, `test` script'i `jest` test framework'ünü kullanmaktadır. `npm test` komutu çalıştırıldığında, Jest testleri çalıştırılacaktır.
5.2. GitHub Actions İş Akışına Test Adımı Ekleme
GitHub Actions iş akışına test adımı eklemek için, `run` komutunu kullanarak `npm test` komutunu çalıştırabilirsiniz. Örneğin:
- name: Testleri Çalıştır
run: npm test
Eğer testler başarısız olursa, iş akışı duracak ve dağıtım gerçekleşmeyecektir. Bu, hatalı kodun dağıtılmasını engeller.
5.3. Test Sonuçlarını Yayınlama
Test sonuçlarını GitHub Actions arayüzünde yayınlamak için, üçüncü taraf aksiyonları kullanabilirsiniz. Örneğin, `dorny/test-reporter` aksiyonu, farklı test framework'lerinden elde edilen sonuçları GitHub Actions'a aktarmanıza olanak tanır.
6. Geri Alma (Rollback) Stratejileri
Her ne kadar otomatik dağıtım süreçleri hataları minimize etse de, bazen hatalı bir dağıtım gerçekleşebilir. Bu durumda, hızlı bir şekilde geri alma (rollback) işlemi yapmak önemlidir.
6.1. Geri Alma Neden Gereklidir?
- Hatalı Kod: Dağıtılan kodda beklenmedik hatalar olabilir.
- Uyumsuzluk: Yeni sürüm, mevcut sistemlerle uyumsuz olabilir.
- Performans Sorunları: Yeni sürüm, performans sorunlarına neden olabilir.
6.2. Geri Alma Stratejileri
- Son Başarılı Dağıtıma Dönme: En basit yöntem, önceki başarılı dağıtıma geri dönmektir. Bu, genellikle dağıtım ortamının sunduğu bir özelliktir.
- Kod Geri Alma (Revert): Hatalı commit'i geri alarak (revert) yeni bir dağıtım yapabilirsiniz.
- Mavi/Yeşil Dağıtım: İki farklı ortam (mavi ve yeşil) kullanarak, yeni sürümü yeşil ortamda test edip, sorun yoksa trafiği yeşil ortama yönlendirebilirsiniz. Hata durumunda, trafiği tekrar mavi ortama yönlendirebilirsiniz.
6.3. GitHub Actions ile Geri Alma Otomasyonu
GitHub Actions ile geri alma süreçlerini otomatikleştirmek mümkündür. Örneğin, bir hata tespit edildiğinde, otomatik olarak önceki başarılı dağıtıma dönen bir iş akışı oluşturabilirsiniz.
7. Güvenlik Konuları
Otomatik dağıtım süreçlerinde güvenliği sağlamak, kritik öneme sahiptir. Hassas bilgilerin (API anahtarları, şifreler vb.) güvenli bir şekilde saklanması ve dağıtım ortamına güvenli bir şekilde aktarılması gerekmektedir.
7.1. GitHub Secrets'ın Önemi
Daha önce bahsedildiği gibi, hassas bilgileri GitHub repositörüsünde doğrudan saklamak güvenli değildir. Bu nedenle, bu bilgileri GitHub Secrets olarak saklamanız gerekmektedir. GitHub Secrets, şifrelenmiş ortamlardır ve sadece GitHub Actions iş akışları tarafından erişilebilir.
7.2. Erişim Kontrolü
GitHub repositörüsüne erişimi olan kişileri dikkatli bir şekilde yönetmeniz gerekmektedir. Sadece gerekli kişilere erişim izni vermelisiniz. Ayrıca, dağıtım ortamına erişimi olan hesapların da güvenliğini sağlamanız gerekmektedir.
7.3. Kod İncelemesi (Code Review)
Koda yapılan değişikliklerin dağıtılmadan önce incelenmesi, güvenlik açıklarının ve hataların erken tespit edilmesini sağlar. Kod incelemesi, güvenlik açısından kritik bir adımdır.
7.4. Bağımlılık Güvenliği
Projenizde kullandığınız bağımlılıkların güvenliğini düzenli olarak kontrol etmeniz gerekmektedir. Güvenlik açığı bulunan bağımlılıkları güncelleyerek, uygulamanızın güvenliğini artırabilirsiniz.
8. İzleme ve Alarm (Monitoring & Alerting)
Dağıtım sonrası uygulamanın performansını ve sağlığını izlemek, olası sorunları erken tespit etmek için önemlidir. İzleme ve alarm sistemleri, uygulamanın beklenmedik davranışlarını tespit ederek, hızlı bir şekilde müdahale etmenizi sağlar.
8.1. İzleme Metrikleri
İzlenmesi gereken temel metrikler şunlardır:
- CPU Kullanımı: Sunucunun CPU kullanımını izlemek, performans sorunlarını tespit etmenize yardımcı olur.
- Bellek Kullanımı: Sunucunun bellek kullanımını izlemek, bellek sızıntılarını ve yetersiz bellek sorunlarını tespit etmenize yardımcı olur.
- Disk Kullanımı: Sunucunun disk kullanımını izlemek, disk doluluğu sorunlarını tespit etmenize yardımcı olur.
- Ağ Trafiği: Sunucunun ağ trafiğini izlemek, anormal trafik artışlarını ve güvenlik tehditlerini tespit etmenize yardımcı olur.
- Hata Oranı: Uygulamanın hata oranını izlemek, hataların sıklığını ve ciddiyetini takip etmenize yardımcı olur.
- Yanıt Süresi: Uygulamanın yanıt süresini izlemek, performans sorunlarını tespit etmenize yardımcı olur.
8.2. Alarm Sistemleri
Alarm sistemleri, belirli metrikler belirli bir eşiği aştığında otomatik olarak uyarı gönderir. Bu uyarılar, e-posta, SMS veya Slack gibi farklı kanallar aracılığıyla gönderilebilir.
8.3. İzleme Araçları
Popüler izleme araçları şunlardır:
- Prometheus: Açık kaynaklı bir izleme ve alarm sistemidir.
- Grafana: Verileri görselleştirmek için kullanılan açık kaynaklı bir araçtır.
- New Relic: Bulut tabanlı bir performans izleme platformudur.
- Datadog: Bulut tabanlı bir izleme ve güvenlik platformudur.
9. Gerçek Hayattan Örnekler ve Vaka Çalışmaları
Bu bölümde, GitHub Actions ile Node.js API otomatik dağıtımı konusunda gerçek hayattan örnekler ve vaka çalışmaları sunulacaktır.
9.1. E-ticaret Platformu
Bir e-ticaret platformu, yeni özellikler ve düzeltmelerin hızlı bir şekilde kullanıcılara sunulmasını sağlamak için GitHub Actions'ı kullanmaktadır. GitHub Actions sayesinde, geliştiriciler kodlarını `main` branch'ine push ettiklerinde, otomatik olarak testler çalıştırılır ve kod Heroku'ya dağıtılır. Bu sayede, dağıtım süreci önemli ölçüde hızlandırılmıştır ve hatalı kodun dağıtılma riski azaltılmıştır.
9.2. SaaS Uygulaması
Bir SaaS uygulaması, farklı müşteriler için farklı ortamlara dağıtım yapmak için GitHub Actions'ı kullanmaktadır. GitHub Actions sayesinde, her müşteri için ayrı bir iş akışı tanımlanmış ve her müşterinin ortamına özel dağıtım yapılması sağlanmıştır. Bu, dağıtım sürecini daha esnek ve ölçeklenebilir hale getirmiştir.
10. Sık Sorulan Sorular
- 10.1. GitHub Actions ücretsiz mi?
- GitHub Actions, açık kaynak projeleri için ücretsizdir. Özel projeler için ise belirli bir kullanım limiti bulunmaktadır. Bu limiti aşarsanız, ücret ödemeniz gerekmektedir.
- 10.2. GitHub Actions hangi platformları destekler?
- GitHub Actions, Linux, Windows ve macOS platformlarını destekler.
- 10.3. GitHub Actions hangi programlama dillerini destekler?
- GitHub Actions, herhangi bir programlama dilini destekler. İş akışlarında, istediğiniz programlama dilini ve araçları kullanabilirsiniz.
- 10.4. GitHub Actions ile neler yapabilirim?
- GitHub Actions ile test çalıştırma, kod analizi, Docker imajı oluşturma, dağıtım, altyapı yönetimi gibi birçok işlemi otomatikleştirebilirsiniz.
- 10.5. GitHub Actions'ı nasıl öğrenirim?
- GitHub Actions'ı öğrenmek için GitHub'ın resmi dokümantasyonunu, online eğitimleri ve örnek projeleri inceleyebilirsiniz.
11. Sonuç ve Özet
GitHub Actions, Node.js API'lerinin otomatik dağıtımı için güçlü ve esnek bir araçtır. Bu makalede, GitHub Actions'ın ne olduğunu, nasıl kullanıldığını ve farklı dağıtım ortamlarına göre nasıl yapılandırıldığını detaylı bir şekilde inceledik. Otomatik dağıtımın faydalarını, test otomasyonu entegrasyonunu, geri alma stratejilerini, güvenlik konularını ve izleme/alarm sistemlerini ele aldık. Umarım bu makale, GitHub Actions ile Node.js API'lerini otomatik olarak dağıtmak isteyen geliştiriciler için faydalı bir kaynak olmuştur.
Önemli Notlar:
- GitHub Actions iş akışlarınızı düzenli olarak güncelleyin ve güvenlik açıklarına karşı tarayın.
- GitHub Secrets'ı dikkatli bir şekilde yönetin ve hassas bilgilerinizi güvende tutun.
- Uygulamanızın performansını ve sağlığını düzenli olarak izleyin ve alarm sistemlerini yapılandırın.
- Kod incelemesi yaparak, hataların ve güvenlik açıklarının erken tespit edilmesini sağlayın.
Özellik | GitHub Actions | Jenkins | CircleCI |
---|---|---|---|
Entegrasyon | GitHub ile tam entegre | Eklentilerle entegre | GitHub ve diğer VCS'lerle entegre |
Ücretlendirme | Açık kaynak projeler için ücretsiz, özel projeler için kullanım bazlı | Açık kaynak ve ücretsiz, ancak altyapı maliyeti var | Ücretsiz katman mevcut, daha fazla kaynak için ücretli |
Kullanım Kolaylığı | YAML tabanlı, öğrenmesi kolay | Arayüz karmaşık olabilir, eklentilerle özelleştirme gerektirir | YAML tabanlı, kullanımı kolay |
Ölçeklenebilirlik | GitHub tarafından otomatik olarak ölçeklenir | Altyapıya bağlı olarak ölçeklenebilir | Bulut tabanlı, otomatik ölçeklenebilirlik |
Dağıtım Ortamı | Avantajları | Dezavantajları |
---|---|---|
Heroku | Kurulumu kolay, hızlı dağıtım | Sınırlı özelleştirme, maliyetli olabilir |
AWS EC2 | Tam kontrol, özelleştirilebilir | Kurulum ve yönetim karmaşık olabilir |
Docker | Taşınabilirlik, tutarlılık | Öğrenme eğrisi, yönetim karmaşık olabilir |