GitHub Actions ile DigitalOcean’a Otomatik Dağıtım: Kapsamlı Bir Rehber
Giriş
Modern yazılım geliştirme süreçlerinde hız, güvenilirlik ve verimlilik, başarı için kritik öneme sahiptir. Uygulamaların sürekli entegrasyon (CI) ve sürekli dağıtım (CD) pratikleri aracılığıyla otomatik olarak test edilmesi ve dağıtılması, geliştiricilerin daha hızlı inovasyon yapmasına ve ürünlerini pazara daha çabuk sunmasına olanak tanır. Bu bağlamda, GitHub Actions ve DigitalOcean gibi güçlü araçların birleşimi, geliştiricilere bulut ortamına otomatik dağıtım için kusursuz bir yol sunar.
Bu makale, GitHub Actions kullanarak DigitalOcean’a nasıl otomatik dağıtım yapılacağını adım adım detaylandıracaktır. İki ana DigitalOcean hizmeti olan Droplets (sanal makineler) ve App Platform (yönetilen uygulama platformu) için dağıtım senaryolarını ele alacak, gerekli yapılandırmaları, en iyi uygulamaları ve sık karşılaşılan sorunları tartışacağız. Amacımız, geliştiricilerin CI/CD süreçlerini otomatize ederek geliştirme döngülerini hızlandırmalarına ve operasyonel yüklerini azaltmalarına yardımcı olmaktır.
CI/CD Nedir ve Neden Önemlidir?
CI/CD, Continuous Integration (Sürekli Entegrasyon) ve Continuous Delivery/Deployment (Sürekli Teslimat/Dağıtım) kavramlarının kısaltmasıdır. Yazılım geliştirme yaşam döngüsünü otomatikleştirmeyi ve iyileştirmeyi amaçlayan bir dizi prensip ve pratikten oluşur.
Sürekli Entegrasyon (CI)
Sürekli Entegrasyon, geliştiricilerin kod değişikliklerini ana kod tabanına düzenli olarak, genellikle günde birkaç kez, entegre etme pratiğidir. Her entegrasyon, otomatik testler (birim testleri, entegrasyon testleri) ve derleme (build) süreçleriyle doğrulanır. CI’nin temel amacı, entegrasyon sorunlarını erken aşamada tespit etmek ve çözmek, böylece büyük entegrasyon çatışmalarını önlemektir. Bu, kod kalitesini artırır ve geliştirme ekibinin daha güvenle çalışmasını sağlar.
Sürekli Teslimat (CD) ve Sürekli Dağıtım (CD)
Sürekli Teslimat (Continuous Delivery), CI’nin bir uzantısıdır. Kod değişikliklerinin test edildikten ve derlendikten sonra, manuel bir onayla üretime dağıtıma hazır hale getirilmesini sağlar. Bu, her an güvenle dağıtılabilecek bir yazılım sürümü olduğu anlamına gelir. Sürekli Dağıtım (Continuous Deployment) ise Sürekli Teslimat’ın bir adım ötesidir. Kod değişiklikleri, otomatik testlerden geçtikten sonra herhangi bir insan müdahalesi olmadan otomatik olarak üretime dağıtılır. Bu, yazılımın pazara sunulma süresini (time-to-market) önemli ölçüde kısaltır.
CI/CD’nin Faydaları
* Daha Hızlı Teslimat: Otomatik süreçler sayesinde yazılım daha sık ve daha hızlı bir şekilde kullanıcılara ulaştırılır.
* Daha Az Hata: Otomatik testler, hataların erken aşamada yakalanmasını sağlar, bu da üretim ortamına ulaşan hata sayısını azaltır.
* Geliştirici Verimliliği: Geliştiriciler manuel dağıtım süreçleriyle uğraşmak yerine kod yazmaya odaklanabilirler.
* Daha İyi Kod Kalitesi: Düzenli entegrasyon ve otomatik testler, kod kalitesini sürekli olarak yüksek tutar.
* Geri Alma Kolaylığı: Başarısız dağıtımlar durumunda, önceki kararlı sürüme geri dönmek genellikle daha kolaydır.
GitHub Actions’a Yakından Bakış
GitHub Actions, GitHub’ın doğrudan entegre edilmiş bir CI/CD platformudur. Deponuzdaki olaylara (push, pull request vb.) yanıt olarak kod derleme, test etme ve dağıtma gibi otomasyon görevlerini gerçekleştirmenizi sağlar.
Temel Bileşenler
* Workflow (İş Akışı): GitHub Actions’ın kalbidir. .github/workflows dizininde depolanan YAML dosyalarıyla tanımlanır. Bir iş akışı, bir veya daha fazla iş (job) içerir ve belirli bir olay (event) tarafından tetiklenir.
* Event (Olay): Bir iş akışını tetikleyen belirli bir aktivite veya durumdur. Örnekler arasında bir push olayı (koda yeni commit gönderildiğinde), bir pull_request açıldığında, schedule (belirli zamanlarda) veya workflow_dispatch (manuel tetikleme) yer alır.
* Job (İş): Bir iş akışının içindeki mantıksal birimdir. Bir veya daha fazla adım (step) içerir ve kendi sanal makinesinde (runner) çalışır. İşler birbirine bağımlı olabilir veya paralel olarak çalışabilir.
* Step (Adım): Bir işin içindeki tekil bir görevdir. Bir komut (örneğin, run: npm install) veya bir eylem (action) çalıştırabilir.
* Action (Eylem): Tekrar kullanılabilir birimlerdir. Bir komut dosyasını, bir Docker kapsayıcısını veya bir JavaScript uygulamasını çalıştıran önceden oluşturulmuş görevlerdir. GitHub Marketplace’te birçok hazır eylem bulunur veya kendi özel eylemlerinizi yazabilirsiniz. Örneğin, actions/checkout@v4 deposu kodunu runner’a kopyalamak için kullanılan popüler bir eylemdir.
* Runner (Koşucu): İş akışındaki işleri yürüten sanal makinelerdir. GitHub tarafından barındırılan runner’lar (Ubuntu, Windows, macOS) veya kendi barındırdığınız runner’lar kullanabilirsiniz. GitHub tarafından barındırılan runner’lar, her iş için temiz bir ortam sağlar.
* Secrets (Sırlar): Hassas bilgileri (API anahtarları, SSH özel anahtarları, parolalar) güvenli bir şekilde depolamak için kullanılır. GitHub deposu ayarlarında tanımlanır ve iş akışlarında secrets.SECRET_NAME şeklinde referans verilir. Bu sırlar, loglarda veya iş akışı çıktılarında asla görünmez.
DigitalOcean’a Yakından Bakış
DigitalOcean, geliştiriciler için tasarlanmış basit, ölçeklenebilir ve uygun fiyatlı bir bulut platformudur. Uygulamaları dağıtmak ve yönetmek için çeşitli hizmetler sunar.
Temel Hizmetler (Dağıtım İçin İlgili Olanlar)
* Droplets (Sanal Makineler): DigitalOcean’ın temel hizmetidir. Linux tabanlı sanal özel sunuculardır (VPS). Geliştiricilere tam kontrol sağlar; işletim sistemi, yazılım yığını ve yapılandırma üzerinde tam yetkiye sahip olursunuz. Geleneksel sunucu dağıtımları için idealdir.
* App Platform: Kaynak kodu doğrudan bağlayarak veya bir container imajı sağlayarak uygulamaları hızlı bir şekilde dağıtmanıza olanak tanıyan yönetilen bir platformdur. Altyapı yönetimiyle uğraşmak istemeyen veya daha hızlı dağıtım döngülerine ihtiyaç duyan geliştiriciler için tasarlanmıştır. Çeşitli dilleri ve framework’leri (Node.js, Python, Go, PHP, Ruby vb.) destekler ve otomatik ölçeklendirme, HTTPS, veritabanı entegrasyonu gibi özellikleri sağlar.
* Managed Kubernetes: Konteynerize edilmiş uygulamaları ölçekli olarak çalıştırmak için yönetilen Kubernetes kümeleri sunar. Mikroservis mimarileri ve karmaşık uygulamalar için uygundur.
* Spaces (Nesne Depolama): Statik dosyaları, yedeklemeleri ve diğer büyük verileri depolamak için S3 uyumlu bir nesne depolama hizmetidir.
* Managed Databases: PostgreSQL, MySQL, Redis ve MongoDB için yönetilen veritabanı hizmetleri sunar.
Bu makalede, Droplet’e SSH üzerinden dağıtım ve App Platform’a entegre dağıtım olmak üzere iki ana dağıtım stratejisine odaklanacağız.
Dağıtım Senaryoları ve Ön Gereksinimler
GitHub Actions ile DigitalOcean’a dağıtım yaparken, uygulamanızın türüne ve kontrol tercihlerinize göre farklı senaryolar izleyebilirsiniz.
Senaryo 1: Droplet’e SSH Üzerinden Dağıtım (Geleneksel)
Bu senaryo, uygulamanızı bir DigitalOcean Droplet’e doğrudan SSH bağlantısı kurarak dağıtmayı içerir. Tam sunucu kontrolüne sahip olmak isteyen veya özel bir yazılım yığını gerektiren uygulamalar için idealdir.
Ön Gereksinimler:
* DigitalOcean Hesabı ve Droplet: Çalışır durumda bir DigitalOcean hesabı ve dağıtım yapacağınız bir Droplet’in mevcut olması.
* Droplet’e SSH Erişimi: Droplet’e SSH üzerinden manuel olarak bağlanabildiğinizden emin olun.
* GitHub Deposu: Dağıtılacak uygulamanın kodunu içeren bir GitHub deposu.
* Uygulama: Dağıtılacak bir web uygulaması (örneğin, Node.js, Python Flask/Django, PHP Laravel/Symfony).
* SSH Anahtar Çifti: GitHub Actions’ın Droplet’e güvenli bir şekilde bağlanabilmesi için özel bir SSH anahtar çifti (public/private key) oluşturulması gereklidir.
* GitHub Secrets: SSH özel anahtarı, Droplet’in IP adresi ve kullanıcı adı gibi hassas bilgilerin GitHub Secrets’ta saklanması.
Senaryo 2: DigitalOcean App Platform’a Dağıtım
Bu senaryo, uygulamanızı DigitalOcean’ın yönetilen App Platform hizmetine dağıtmayı kapsar. Altyapı yönetimiyle uğraşmak istemeyen ve hızlı dağıtım döngülerine ihtiyaç duyan projeler için daha uygundur. App Platform, genellikle GitHub deposundaki kod değişikliklerini otomatik olarak algılar ve dağıtır, ancak GitHub Actions ile bu süreci daha da özelleştirebilirsiniz.
Ön Gereksinimler:
* DigitalOcean Hesabı: Çalışır durumda bir DigitalOcean hesabı.
* GitHub Deposu: Dağıtılacak uygulamanın kodunu içeren bir GitHub deposu.
* Uygulama: App Platform’un desteklediği dillerden veya framework’lerden biriyle yazılmış bir uygulama.
* DigitalOcean API Token: GitHub Actions’ın DigitalOcean API’si ile etkileşim kurabilmesi için bir API token’ı oluşturulması gereklidir.
* GitHub Secrets: DigitalOcean API token’ının GitHub Secrets’ta saklanması.
GitHub Actions ile DigitalOcean Droplet’e Dağıtım Adım Adım Rehber
Bu bölümde, bir web uygulamasını GitHub Actions kullanarak bir DigitalOcean Droplet’ine SSH üzerinden nasıl dağıtacağımızı adım adım inceleyeceğiz.
Adım 1: Droplet Hazırlığı
1. Droplet Oluşturma: DigitalOcean kontrol panelinden yeni bir Droplet oluşturun. Ubuntu 22.04 LTS gibi güncel bir Linux dağıtımı seçmek iyi bir başlangıçtır. SSH anahtarınızı Droplet’e eklemeyi unutmayın.
2. Gerekli Yazılımları Yükleme: Droplet’e SSH ile bağlanın ve uygulamanızın çalışması için gerekli yazılımları yükleyin. Örneğin, bir Node.js uygulaması için:
sudo apt update
sudo apt install -y curl git
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install -g pm2 # Uygulamayı arka planda çalıştırmak için
# Nginx gibi bir web sunucusu da gerekebilir
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
3. Uygulama Dizini Oluşturma: Uygulamanız için bir dizin oluşturun ve gerekli izinleri ayarlayın. Örneğin:
sudo mkdir -p /var/www/your-app-directory
sudo chown -R your_user:your_user /var/www/your-app-directory # your_user yerine kendi kullanıcı adınızı yazın
4. Güvenlik Duvarı (Firewall): Gerekli portların (HTTP için 80, HTTPS için 443, SSH için 22) açık olduğundan emin olun. ufw kullanıyorsanız:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx HTTP' # Eğer Nginx kullanıyorsanız
sudo ufw enable
Adım 2: SSH Anahtarı Oluşturma ve Yapılandırma
GitHub Actions’ın Droplet’inize güvenli bir şekilde bağlanabilmesi için özel bir SSH anahtar çifti oluşturacağız. Bu anahtar sadece GitHub Actions tarafından kullanılacak ve Droplet’inize erişim sağlayacak.
1. Anahtar Çifti Oluşturma: Yerel makinenizde (veya GitHub Actions’ın çalışacağı herhangi bir güvenli ortamda) aşağıdaki komutu çalıştırın. Parola sormazsa Enter’a basın (parola korumalı anahtarlar GitHub Actions ile daha karmaşık olabilir).
ssh-keygen -t rsa -b 4096 -C "github-actions-deploy-key" -f id_rsa_github_actions
Bu komut, id_rsa_github_actions (özel anahtar) ve id_rsa_github_actions.pub (genel anahtar) adında iki dosya oluşturacaktır.
2. Genel Anahtarı Droplet’e Ekleme: id_rsa_github_actions.pub dosyasının içeriğini kopyalayın. Droplet’inize bağlanın ve bu içeriği /home/your_user/.ssh/authorized_keys dosyasına ekleyin. Eğer dosya veya dizin yoksa oluşturun:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-rsa AAAAB3NzaC..." >> ~/.ssh/authorized_keys # Kopyaladığınız genel anahtarı buraya yapıştırın
chmod 600 ~/.ssh/authorized_keys
3. Özel Anahtarı Kopyalama: id_rsa_github_actions dosyasının içeriğini kopyalayın. Bu özel anahtar, GitHub Secrets’ta kullanılacaktır.
Adım 3: GitHub Repository Secrets Yapılandırması
GitHub deponuzda, hassas bilgileri güvenli bir şekilde saklamak için “Secrets” kullanın.
1. GitHub deponuza gidin.
2. Settings (Ayarlar) sekmesine tıklayın.
3. Sol menüden Secrets and variables (Sırlar ve değişkenler) altında Actions seçeneğini tıklayın.
4. New repository secret (Yeni depo sırrı) butonuna tıklayarak aşağıdaki sırları ekleyin:
* SSH_PRIVATE_KEY: id_rsa_github_actions dosyasının tüm içeriğini yapıştırın (başında -----BEGIN OPENSSH PRIVATE KEY----- ile başlayıp sonunda -----END OPENSSH PRIVATE KEY----- ile biten kısım).
* SSH_HOST: Droplet’inizin genel IP adresi.
* SSH_USER: Droplet’inizdeki kullanıcı adı (genellikle root veya özel oluşturduğunuz kullanıcı).
Adım 4: GitHub Actions Workflow Dosyası Oluşturma (.github/workflows/deploy.yml)
Deponuzun kök dizininde .github/workflows/ adında bir dizin oluşturun ve içine deploy.yml adında bir dosya ekleyin. Bu dosya, dağıtım iş akışınızı tanımlayacaktır.
name: Deploy to DigitalOcean Droplet
on:
push:
branches:
- main # main branch'ine yapılan her push'ta tetiklenir
jobs:
deploy:
runs-on: ubuntu-latest # İşin çalışacağı runner tipi
steps:
- name: Checkout code
uses: actions/checkout@v4 # Depo kodunu runner'a kopyalar
- name: Set up SSH agent
uses: webfactory/ssh-agent@v0.9.0 # SSH özel anahtarını SSH agent'a ekler
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} # GitHub Secret'tan özel anahtarı alır
- name: Add SSH host key
run: |
mkdir -p ~/.ssh # .ssh dizinini oluşturur (varsa atlar)
ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts # Droplet'in host key'ini known_hosts'a ekler
chmod 600 ~/.ssh/known_hosts # known_hosts dosyasının izinlerini ayarlar
# Bu adım, ilk kez bağlanırken 'Are you sure you want to continue connecting (yes/no)?' sorusunu atlamak için gereklidir.
- name: Deploy to Droplet
run: |
# SSH ile Droplet'e bağlan ve komutları çalıştır
ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "
cd /var/www/your-app-directory && # Uygulama dizinine git
git pull origin main && # En son kodu çek
npm install && # Bağımlılıkları yükle (örnek: Node.js için)
npm run build && # Uygulamayı derle (eğer build adımı varsa)
pm2 restart your-app-name # Uygulamayı PM2 ile yeniden başlat (veya systemctl restart your-service)
"
env:
# Eğer uygulamanızın ortam değişkenlerine ihtiyacı varsa, burada tanımlayabilirsiniz.
# Örneğin: NODE_ENV: production
# Ancak hassas bilgiler için DigitalOcean Droplet'inde .env dosyası kullanmak daha iyidir.
Bu YAML dosyası, main branch’ine her push yapıldığında çalışacak bir iş akışı tanımlar.
* Checkout code: Depodaki kodu GitHub Actions runner’ına çeker.
* Set up SSH agent: SSH özel anahtarınızı runner’ın SSH agent’ına ekler, böylece SSH komutları anahtarı kullanabilir.
* Add SSH host key: Droplet’in SSH parmak izini known_hosts dosyasına ekleyerek güvenli bağlantı sağlar ve manuel onayı atlar.
* Deploy to Droplet: SSH üzerinden Droplet’e bağlanır ve uygulamanızın güncellenmesi, bağımlılıkların yüklenmesi, derlenmesi ve yeniden başlatılması gibi dağıtım adımlarını tetikler. your-app-directory ve your-app-name kısımlarını kendi uygulamanızın adıyla değiştirmeniz gerekmektedir.
Kodunuzu GitHub’a main branch’ine push ettiğinizde, GitHub Actions otomatik olarak tetiklenecek ve uygulamanızı Droplet’inize dağıtacaktır.
GitHub Actions ile DigitalOcean App Platform’a Dağıtım Adım Adım Rehber
DigitalOcean App Platform, uygulamaları daha az altyapı yönetimiyle dağıtmak için harika bir seçenektir. GitHub Actions ile bu süreci daha da otomatikleştirebilirsiniz.
Adım 1: DigitalOcean App Platform Projesi Oluşturma (Manuel)
1. Uygulama Oluşturma: DigitalOcean kontrol panelinize gidin ve sol menüden Apps seçeneğini tıklayın. Create App (Uygulama Oluştur) butonuna tıklayın.
2. Kaynak Bağlama: GitHub deponuzu seçin ve dağıtmak istediğiniz branch’i (örneğin, main) belirtin. DigitalOcean, deponuzu analiz edecek ve uygulamanız için uygun bir yapılandırma önerecektir.
3. Yapılandırma: Uygulamanızın bileşenlerini (web hizmetleri, veritabanları vb.) yapılandırın. Ortam değişkenlerini, build komutlarını ve run komutlarını ayarlayın.
4. İlk Dağıtım: İlk dağıtımı manuel olarak tetikleyin ve uygulamanızın başarılı bir şekilde çalıştığından emin olun. Bu adım, App Platform’un GitHub deponuzla doğru şekilde entegre olduğundan emin olmanızı sağlar.
Adım 2: DigitalOcean API Token Oluşturma
GitHub Actions’ın DigitalOcean App Platform ile etkileşim kurabilmesi için bir API token’ına ihtiyacı vardır.
1. DigitalOcean kontrol panelinize gidin.
2. Sol menüden API seçeneğini tıklayın.
3. Generate New Token (Yeni Token Oluştur) butonuna tıklayın.
4. Token’a açıklayıcı bir isim verin (örneğin, github-actions-app-deploy).
5. Write (Yazma) erişimi verdiğinizden emin olun, bu GitHub Actions’ın dağıtım tetikleyebilmesi için gereklidir.
6. Oluşturulan token’ı kopyalayın. Bu token sadece bir kez gösterilecektir, bu yüzden güvenli bir yere kaydedin.
Adım 3: GitHub Repository Secrets Yapılandırması
GitHub deponuzda, DigitalOcean API token’ını güvenli bir şekilde saklamak için “Secrets” kullanın.
1. GitHub deponuza gidin.
2. Settings (Ayarlar) sekmesine tıklayın.
3. Sol menüden Secrets and variables (Sırlar ve değişkenler) altında Actions seçeneğini tıklayın.
4. New repository secret (Yeni depo sırrı) butonuna tıklayarak aşağıdaki sırrı ekleyin:
* DIGITALOCEAN_ACCESS_TOKEN: Oluşturduğunuz DigitalOcean API token’ını yapıştırın.
* DIGITALOCEAN_APP_ID (isteğe bağlı ama önerilir): App Platform uygulamanızın benzersiz ID’si. Bu ID’yi, DigitalOcean kontrol panelinde uygulamanızın URL’sinden (örneğin, https://cloud.digitalocean.com/apps/YOUR_APP_ID) veya doctl apps list komutu ile alabilirsiniz.
Adım 4: GitHub Actions Workflow Dosyası Oluşturma (.github/workflows/deploy-app-platform.yml)
Deponuzun kök dizininde .github/workflows/ adında bir dizin oluşturun ve içine deploy-app-platform.yml adında bir dosya ekleyin.
name: Deploy to DigitalOcean App Platform
on:
push:
branches:
- main # main branch'ine yapılan her push'ta tetiklenir
jobs:
deploy:
runs-on: ubuntu-latest # İşin çalışacağı runner tipi
steps:
- name: Checkout code
uses: actions/checkout@v4 # Depo kodunu runner'a kopyalar
- name: Install doctl
uses: digitalocean/action-doctl@v2 # DigitalOcean CLI (doctl) kurar ve API token'ı ile kimlik doğrulaması yapar
with:
token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} # GitHub Secret'tan API token'ı alır
- name: Trigger DigitalOcean App Platform Deployment
run: doctl apps create-deployment ${{ secrets.DIGITALOCEAN_APP_ID }}
# Eğer DIGITALOCEAN_APP_ID sırrını kullanmıyorsanız ve depo zaten App Platform'a bağlıysa,
# aşağıdaki gibi uygulamanın adıyla ID'yi dinamik olarak bulabilirsiniz:
# run: doctl apps create-deployment $(doctl apps list --format ID,Spec.Name --no-header | grep 'your-app-name' | awk '{print $1}')
# "your-app-name" kısmını uygulamanızın adıyla değiştirin.
Bu YAML dosyası, main branch’ine her push yapıldığında çalışacak bir iş akışı tanımlar.
* Checkout code: Depodaki kodu GitHub Actions runner’ına çeker.
* Install doctl: DigitalOcean tarafından sağlanan action-doctl eylemini kullanarak doctl CLI aracını kurar ve sağlanan DIGITALOCEAN_ACCESS_TOKEN ile kimlik doğrulaması yapar.
* Trigger DigitalOcean App Platform Deployment: doctl apps create-deployment komutunu kullanarak App Platform’da yeni bir dağıtım tetikler. Bu komut, App Platform’a GitHub deponuzdaki en son kodu çekmesini ve yeni bir dağıtım başlatmasını söyler. Eğer DIGITALOCEAN_APP_ID kullanıyorsanız, doğrudan uygulama ID’sini belirtirsiniz. Aksi takdirde, uygulamanın adını kullanarak ID’yi dinamik olarak bulmanız gerekebilir.
Bu yapılandırma ile, kodunuzu main branch’ine push ettiğinizde, GitHub Actions otomatik olarak DigitalOcean App Platform’da yeni bir dağıtım başlatacaktır.
Gelişmiş Dağıtım Teknikleri ve En İyi Uygulamalar
CI/CD süreçlerinizi daha sağlam, güvenli ve verimli hale getirmek için bazı gelişmiş teknikler ve en iyi uygulamalar mevcuttur.
Ortam Değişkenleri ve Sırlar Yönetimi
Uygulamalar genellikle veritabanı bağlantı dizeleri, API anahtarları gibi hassas bilgilere ihtiyaç duyar.
* GitHub Secrets: Dağıtım sürecinde kullanılan hassas bilgiler (SSH anahtarları, API token’ları) için GitHub Secrets’ı kullanın.
* Uygulama Ortam Değişkenleri: Uygulamanızın kendisi için gereken ortam değişkenlerini doğrudan Droplet üzerinde (örneğin, .env dosyaları veya sistem ortam değişkenleri olarak) veya DigitalOcean App Platform’un kendi ortam değişkeni yönetim arayüzü üzerinden ayarlayın. Bu, sırların kod deposunda veya GitHub Actions loglarında görünmesini engeller.
Testler ve Kalite Kontrolleri
Dağıtımdan önce otomatik testlerin çalıştırılması, hatalı kodun üretime gitmesini engeller.
* Unit/Integration Tests: Kodunuzu test etmek için iş akışınızda npm test, pytest, php artisan test gibi komutları çalıştırın.
* Linting/Static Analysis: Kod stilini ve potansiyel hataları kontrol etmek için linting araçlarını kullanın.
* Güvenlik Tarama: Bağımlılık güvenlik açıklarını taramak için araçlar entegre edin.
Dağıtım işi, ancak tüm testler başarılı olursa devam etmelidir.
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
deploy:
needs: test # Dağıtım işi, test işi başarılı olursa çalışır
runs-on: ubuntu-latest
# ... dağıtım adımları ...
Rollback Stratejileri
Her dağıtım başarılı olmayabilir. Hızlı ve güvenli bir geri alma (rollback) mekanizması kritik öneme sahiptir.
* Droplet: git commit geçmişini kullanarak önceki kararlı bir sürüme geri dönmek veya önceki bir uygulama imajını geri yüklemek. PM2 gibi süreç yöneticileri, uygulamaların farklı sürümlerini yönetme yeteneğine sahip olabilir.
* App Platform: DigitalOcean App Platform, önceki dağıtımları otomatik olarak saklar ve kontrol panelinden kolayca geri alım yapmanızı sağlar.
Bildirimler
Dağıtım durumunu (başarılı/başarısız) ilgili ekiplere bildirmek önemlidir.
* Slack/Email Bildirimleri: GitHub Actions’da dağıtım durumuna göre Slack veya e-posta bildirimleri göndermek için üçüncü taraf eylemleri kullanabilirsiniz (örneğin, rtCamp/action-slack-notify).
Çoklu Ortamlar (Environments)
Geliştirme, hazırlık (staging) ve üretim (production) gibi farklı ortamlar için ayrı dağıtım iş akışları veya koşullar tanımlamak yaygın bir pratiktir.
* Branch Bazlı Dağıtım: main branch’ine push yapıldığında üretime, develop branch’ine push yapıldığında hazırlık ortamına dağıtım yapabilirsiniz.
* GitHub Environments: GitHub, ortamları yönetmek ve her ortam için özel kurallar (manuel onaylar, korumalı sırlar) belirlemek için “Environments” özelliğini sunar.
on:
push:
branches:
- main
- develop
jobs:
deploy-staging:
if: github.ref == 'refs/heads/develop'
environment: staging # GitHub Environment kullanır
runs-on: ubuntu-latest
steps:
# ... hazırlık ortamına dağıtım adımları ...
deploy-production:
if: github.ref == 'refs/heads/main'
environment: production # GitHub Environment kullanır
runs-on: ubuntu-latest
# Bu ortama dağıtım için manuel onay gerektirebilir
steps:
# ... üretim ortamına dağıtım adımları ...
Güvenlik İpuçları
* Least Privilege (En Az Yetki Prensibi): SSH anahtarları ve API token’larına yalnızca ihtiyaç duydukları minimum izinleri verin. Örneğin, Droplet dağıtımı için sadece dağıtım kullanıcısının home dizinine erişim izni olan bir SSH anahtarı kullanın.
* Anahtar Rotasyonu: Düzenli aralıklarla SSH anahtarlarınızı ve API token’larınızı değiştirin.
* GitHub Secrets: Hassas bilgileri asla kod deposunda saklamayın, her zaman GitHub Secrets’ı kullanın.
Downtime’ı Azaltma (Zero-Downtime Deployments)
Özellikle üretim ortamlarında, dağıtım sırasında hizmet kesintisini en aza indirmek önemlidir.
* Blue/Green Deployments: Yeni sürümü ayrı bir ortamda (green) dağıtın, test edin ve ardından trafiği bu yeni ortama yönlendirin. Eski ortam (blue) bir geri alma stratejisi olarak hazır tutulur.
* Rolling Updates: Yeni sürümleri adım adım dağıtarak, her seferinde sunucuların sadece bir kısmını güncelleyin. Yük dengeleyicilerle birlikte kullanıldığında, trafik her zaman güncel sunuculara yönlendirilir.
Sık Karşılaşılan Sorunlar ve Çözümleri
GitHub Actions ile DigitalOcean’a dağıtım yaparken karşılaşabileceğiniz bazı yaygın sorunlar ve bunların çözümleri:
1. SSH Bağlantı Sorunları:
* Hata: Permission denied (publickey).
* Çözüm: SSH özel anahtarınızın doğru şekilde GitHub Secret’a kopyalandığından ve Droplet’teki ~/.ssh/authorized_keys dosyasında doğru genel anahtarın bulunduğundan emin olun. Dosya izinlerini kontrol edin (chmod 600 ~/.ssh/authorized_keys, chmod 700 ~/.ssh).
* Hata: Host key verification failed.
* Çözüm: ssh-keyscan adımını iş akışınıza eklediğinizden emin olun veya SSH komutuna -o StrictHostKeyChecking=no parametresini ekleyin (ancak bu güvenlik riskleri taşıyabilir, dikkatli kullanın).
* Hata: Bağlantı zaman aşımına uğradı.
* Çözüm: Droplet’inizin IP adresinin doğru olduğundan ve güvenlik duvarının SSH portuna (22) erişimi engellemediğinden emin olun.
2. Ortam Değişkeni Eksiklikleri:
* Hata: Uygulamanız bir ortam değişkenini bulamıyor.
* Çözüm: Ortam değişkenlerinin GitHub Secrets’ta doğru tanımlandığından ve iş akışınızda env: bloğu içinde veya SSH komutları aracılığıyla uygulamaya iletildiğinden emin olun. Hassas uygulama sırları için Droplet’te .env dosyalarını veya App Platform’un kendi ortam değişkeni yönetimini tercih edin.
3. Build veya Bağımlılık Sorunları:
* Hata: npm install, composer install veya pip install gibi komutlar başarısız oluyor.
* Çözüm: Droplet’e gerekli çalışma zamanlarının (Node.js, PHP, Python) ve paket yöneticilerinin yüklendiğinden emin olun. .bashrc veya .profile dosyalarındaki PATH değişkenlerinin doğru ayarlandığını kontrol edin. GitHub Actions runner’ı üzerinde de bağımlılıkları yüklemek için adımlarınızın olduğundan emin olun.
4. DigitalOcean API İzin Hataları (App Platform için):
* Hata: doctl komutları yetkilendirme hatası veriyor.
* Çözüm: DIGITALOCEAN_ACCESS_TOKEN sırrının doğru ve geçerli olduğundan emin olun. Token’ın Write (Yazma) izinlerine sahip olması gerektiğini kontrol edin.
5. GitHub Actions Loglarını İnceleme:
* Genel Çözüm: Herhangi bir sorunla karşılaştığınızda, GitHub Actions arayüzündeki iş akışı çalıştırmasının loglarını dikkatlice inceleyin. Hata mesajları genellikle sorunun kök nedenini gösterir. Adım adım çıktıları kontrol ederek hangi adımın başarısız olduğunu ve nedenini anlayabilirsiniz.
Sonuç
GitHub Actions ve DigitalOcean’ın birleşimi, modern yazılım geliştirme süreçlerinde CI/CD’nin gücünü parmaklarınızın ucuna getirir. Bu makalede ele aldığımız Droplet’e SSH üzerinden dağıtım ve DigitalOcean App Platform’a entegre dağıtım senaryoları, uygulamalarınızı buluta otomatik olarak dağıtmak için size esnek ve güçlü çözümler sunar.
CI/CD pratikleri, kod kalitesini artırır, hata oranlarını düşürür, geliştirici verimliliğini yükseltir ve uygulamalarınızın pazara sunulma süresini önemli ölçüde hızlandırır. GitHub Actions’ın esnekliği ve DigitalOcean’ın kullanıcı dostu bulut altyapısı sayesinde, manuel dağıtım süreçlerinin getirdiği operasyonel yükü azaltabilir, geliştiricilerin daha çok inovasyona odaklanmasını sağlayabilirsiniz.
Gelişmiş teknikler ve en iyi uygulamalar (testler, rollback stratejileri, ortam yönetimi, güvenlik) ile CI/CD hattınızı daha sağlam ve güvenli hale getirebilirsiniz. Unutmayın ki otomasyon, sadece tekrarlayan görevleri ortadan kaldırmakla kalmaz, aynı zamanda yazılım geliştirme yaşam döngüsünün her aşamasında güvenilirliği ve tutarlılığı da artırır. Bu entegrasyonu projelerinize dahil ederek, daha hızlı, daha güvenilir ve daha verimli bir geliştirme deneyimi elde edeceksiniz.