PHP tabanlı bir otomasyon sisteminiz var ve her yeni sürümde manuel adımlar yüzünden zaman kaybediyorsunuz. Testler bir türlü bitmiyor, sunucuya çıkış stresli geçiyor, üstelik bir geri alma işlemi gerekirse saatler harcıyorsunuz. Bu yazıda PHP otomasyon sistemleri için CI/CD süreçlerini nasıl kurgulamanız gerektiğini, hangi araçları seçeceğinizi ve sık yapılan hataları konuşacağız.
CI/CD, yazılım geliştirme ve dağıtım süreçlerini otomatikleştiren bir yaklaşım. Özellikle otomasyon sistemlerinde, iş mantığının doğru çalışması kritik olduğundan, bu süreçleri sağlam bir temele oturtmak büyük fark yaratır. Bu rehberde, PHP’ye özgü araçlardan ve pratik örneklerden yararlanarak adım adım ilerleyeceğiz.
PHP Projelerinde CI/CD Neden Farklıdır?
PHP, yorumlanan bir dil olduğu için derleme adımı yoktur. Bu, CI sürecinin daha çok statik analiz, test ve bağımlılık yönetimine odaklanması gerektiği anlamına gelir. Ayrıca PHP ekosisteminde Composer gibi bağımlılık yöneticileri ve PHPUnit gibi test araçları standarttır.
Öte yandan, PHP uygulamaları genellikle Apache veya Nginx gibi web sunucularında çalışır. Dağıtım sürecinde ortam farklılıkları (geliştirme, test, üretim) ciddi sorunlara yol açabilir. Bu yüzden ortam yapılandırmasını kodda tutmak ve sürecin her aşamasında tutarlılığı sağlamak önemlidir.
Temel CI/CD Kavramları ve PHP Karşılıkları
CI (Continuous Integration), geliştiricilerin kod değişikliklerini sık sık bir ana dalda birleştirmesini ve her birleştirmede otomatik testlerin çalıştırılmasını ifade eder. CD (Continuous Delivery/Deployment) ise bu testleri geçen kodun otomatik olarak bir sunucuya veya ortama dağıtılmasını sağlar.
PHP’de bu süreçleri uygularken kullanabileceğiniz araçlar şunlardır:
- Statik Analiz: PHPStan, Psalm veya PHP_CodeSniffer gibi araçlar kod kalitesini kontrol eder.
- Test: PHPUnit veya Codeception ile birim testleri, entegrasyon testleri ve kabul testleri yazılabilir.
- Bağımlılık Yönetimi: Composer, paket kurulumu ve güncellemesini otomatikleştirir.
- Derleme (Build): PHP’de derleme yerine genellikle bağımlılıkların yüklenmesi, asset dosyalarının derlenmesi (örneğin Sass, JavaScript) ve veritabanı migrasyonlarının hazırlanması işlemleri yapılır.
- Dağıtım: Deployer, Capistrano veya SSH tabanlı betiklerle sunucuya dosya kopyalama, cache temizleme ve hizmet yeniden başlatma işlemleri gerçekleştirilir.
PHP CI/CD Pipeline Örneği
Basit bir pipeline adımları şu şekilde olabilir:
- Kod deposundan değişiklik çekilir.
- Composer install ile bağımlılıklar yüklenir.
- PHPStan veya Psalm ile statik analiz yapılır.
- PHPUnit ile testler koşulur.
- Testler geçerse, üretim ortamına dağıtım başlatılır.
Bu adımlar, GitHub Actions, GitLab CI, Jenkins veya Bitbucket Pipelines gibi araçlarla otomatikleştirilebilir.
Doğru CI/CD Aracını Seçme
Piyasada birçok CI/CD aracı var ve seçim yaparken projenizin ihtiyaçlarını göz önünde bulundurmalısınız. İşte bazı popüler seçenekler:
| Araç | Barındırma | Güçlü Yönler | Dikkat Edilecekler |
|---|---|---|---|
| Jenkins | Kendi sunucunuz | Esnek ve eklenti zengini | Yönetim maliyeti yüksek |
| GitLab CI | Bulut veya kendi sunucunuz | GitLab ile entegre, iyi pipeline tanımı | Kaynak kullanımı |
| GitHub Actions | Bulut | GitHub deposuyla kolay entegrasyon | Dakika limitleri olabilir |
| Bitbucket Pipelines | Bulut | Bitbucket kullanıcıları için kolay | Daha az esneklik |
| CircleCI | Bulut | Hızlı ve basit | Yapılandırma seçenekleri sınırlı |
Küçük bir projede GitHub Actions yeterli olabilirken, kurumsal bir ortamda Jenkins’in sunduğu eklentiler ve özelleştirme avantaj sağlayabilir. Ancak Jenkins’i yönetmek için ekstra efor gerekir. Kendi sunucunuzda çalıştıracağınız bir araç istiyorsanız GitLab CI’yi değerlendirebilirsiniz.
Pipeline’ınızı Tasarlarken Dikkat Etmeniz Gereken Adımlar
CI/CD sürecinizi oluştururken her aşamayı ayrıca düşünmek gerekir. Aşağıda PHP otomasyon sistemleri için kritik adımları ve örneklerini bulacaksınız.
1. Kod Kalitesi ve Statik Analiz
Statik analiz, kodun çalıştırılmadan hataları yakalamanızı sağlar. PHP’de en yaygın kullanılan araçlardan biri PHPStan. Seviye ayarı yaparak başlayabilirsiniz (örneğin seviye 5 veya 6). PHPStan, tip hatalarını, yanlış fonksiyon çağrılarını ve bazı mantıksal sorunları tespit eder.
Örnek bir komut satırı:
vendor/bin/phpstan analyse src --level=6
Bu komutu pipeline’ınızın ilk adımına ekleyerek, testlere başlamadan önce kodun belirli bir kalite standartını karşıladığından emin olabilirsiniz. Ayrıca PHP_CodeSniffer ile kod standartlarını (PSR-12 gibi) kontrol edebilirsiniz.
2. Otomatik Testler
PHPUnit, PHP dünyasının standart test çerçevesidir. Otomasyon sistemlerinizde, iş mantığını test etmek için birim testleri yazmak önemlidir. Ayrıca veritabanı etkileşimlerini test etmek için entegrasyon testleri de ekleyebilirsiniz.
Testleri pipeline’da çalıştırmak için önce test veritabanının hazırlanması gerekir. Örneğin, bir SQLite dosyası veya ayrı bir MySQL veritabanı kullanabilirsiniz. Testlerin hızlı olmasına dikkat edin; yavaş testler geliştiricilerin süreci yavaşlatmasına neden olur.
Örnek pipeline adımı:
vendor/bin/phpunit --configuration phpunit.xml --testsuite unit
3. Ortam Değişkenleri ve Yapılandırma Yönetimi
CI/CD sürecinde ortam değişkenlerini (API anahtarları, veritabanı bağlantıları) güvenli bir şekilde yönetmek gerekir. Bu değişkenleri depoda saklamak güvenlik riski oluşturur. Bunun yerine, CI/CD aracınızın sağladığı “secrets” veya “environment variables” özelliğini kullanın.
Örneğin, GitHub Actions’ta `Settings > Secrets` bölümüne `DB_PASSWORD` gibi değişkenleri ekleyebilirsiniz. Pipeline dosyasında bu değişkenlere `${{ secrets.DB_PASSWORD }}` şeklinde erişebilirsiniz.
PHP tarafında, `.env` dosyaları kullanıyorsanız (örneğin Dotenv kütüphanesi ile), bu dosyaları CI/CD sürecinde oluşturmayı veya ortam değişkenleriyle beslemeyi unutmayın.
4. Bağımlılık Yönetimi ve Composer
Composer ile bağımlılıklar yüklenirken, `composer.lock` dosyasının sürüm kontrolünde tutulduğundan emin olun. Bu dosya, tutarlı bağımlılık sürümlerini sağlar. Pipeline’da `composer install –no-dev` yerine `composer install` komutunu kullanarak test aşamasında geliştirme paketlerini de yükleyebilirsiniz.
Performans için, Composer’ın önbelleğe alma özelliğini kullanabilirsiniz. CI/CD aracınızda önbellek ayarı yaparak her pipeline çalıştığında bağımlılıkları yeniden indirmek zorunda kalmazsınız.
5. Veritabanı Migrasyonları
Otomasyon sistemleri genellikle veritabanı kullanır ve dağıtım sırasında migrasyonların çalıştırılması gerekebilir. Bu işlemi pipeline içinde otomatikleştirmek, manuel unutma riskini ortadan kaldırır.
Örneğin, PHP’de Phinx veya Doctrine Migrations kullanabilirsiniz. Pipeline’da test aşamasında `vendor/bin/phinx migrate -e testing` gibi komut çalıştırabilirsiniz. Üretim dağıtımında ise ayrı bir adım olarak migrasyonları çalıştırmak güvenli olabilir; ancak bu adımı dikkatli planlamalısınız ki veri kaybı yaşanmasın.
Dağıtım (Deployment) Stratejileri
CD süreci büyük ölçüde dağıtım stratejinize bağlıdır. PHP projelerinde yaygın olarak kullanılan birkaç strateji vardır.
FTP/SFTP ile Basit Dağıtım
Küçük projelerde FTP veya SFTP ile dosyaları sunucuya kopyalamak yeterli olabilir. Ancak bu yöntem, dosya tutarlılığı ve geri alma açısından risklidir. Yine de otomasyon sistemleri için, bu yöntemi kullananlar vardır; ancak güvenilir bir CI/CD için daha iyi yöntemler önerilir.
Deployer ile Sıfır Kesinti (Zero-downtime) Dağıtım
Deployer, PHP tabanlı bir dağıtım aracıdır. SSH üzerinden sunucuya bağlanır, dosyaları kopyalar, sembolik linkleri günceller ve cache temizler. Bu sayede kısa bir süre içinde yeni sürüm yayına alınır ve eski sürüme hızlıca dönülebilir.
Deployer ile dağıtım adımları `deploy.php` dosyasında tanımlanır. Örnek bir görev:
task('deploy', function () {
// dosyaları kopyala
// php artisan migrate --force gibi komutlar
// symlink oluştur
});
Deployer, geri alma işlemlerini de kolaylaştırır. Eğer bir sürümde sorun çıkarsa, önceki sembolik linke geri dönebilirsiniz.
Konteynerleştirme ve Kubernetes
Son yıllarda PHP uygulamaları da Docker konteynerları içinde çalıştırılmaya başlandı. CI/CD sürecinde Docker image oluşturup registry’ye push edebilir, ardından Kubernetes veya Docker Swarm üzerinde dağıtım yapabilirsiniz. Bu yöntem ölçeklenebilirlik ve ortam tutarlılığı sağlar, ancak ek yönetim karmaşıklığı getirir.
Eğer otomasyon sisteminiz mikroservis mimarisindeyse, her servis için ayrı pipeline ve dağıtım stratejisi düşünmeniz gerekir.
Güvenlik ve CI/CD: Dikkat Edilmesi Gerekenler
CI/CD süreçleri, kod tabanınıza ve sunucularınıza erişim imkanı sağladığı için güvenlik açısından kritiktir. İşte dikkat etmeniz gereken bazı noktalar:
- Secret yönetimi: Şifreler ve API anahtarları gibi hassas verileri asla depoya koymayın. CI/CD aracının secret özelliklerini kullanın.
- Erişim kontrolü: Pipeline’da kullanılan servis hesaplarının yalnızca gerekli izinlere sahip olduğundan emin olun. Örneğin, dağıtım aşamasında kullanılan SSH anahtarının yalnızca ilgili sunucuya erişimi olsun.
- Bağımlılık taraması: Composer bağımlılıklarında bilinen güvenlik açıklarını taramak için `composer audit` veya üçüncü parti araçlar kullanabilirsiniz. Bu taramayı pipeline’ın bir adımı olarak eklemek iyi bir uygulamadır.
- Artifact imzalama: Üretim dağıtımlarına geçmeden önce, paketlerin veya image’ların doğruluğunu doğrulamak için imzalama yapabilirsiniz.
CI/CD Hataları ve Kaçınma Yolları
CI/CD süreçlerinde sık karşılaşılan hataları bilmek, sürecinizi daha sağlam kurmanıza yardımcı olur. İşte birkaç örnek:
- Testleri ihmal etmek: Bazı ekipler test yazmadan pipeline kuruyor. Bu durumda CI/CD yalnızca dağıtım hızınızı artırır, ancak kaliteyi garanti etmez. En azından kritik iş mantığını kapsayan testler yazmalısınız.
- Ortam farklılıklarını göz ardı etmek: Geliştirme ortamında çalışan testler, üretim ortamında farklı ayarlardan dolayı başarısız olabilir. Ortamları mümkün olduğunca benzer hale getirmek için Docker gibi araçlar kullanın.
- Uzun süren pipeline’lar: Her değişiklikte 20 dakika süren bir pipeline, geliştiricilerin süreci atlamasına neden olabilir. Pipeline’ı hızlandırmak için paralel çalışan adımlar tasarlayın ve gereksiz adımları kaldırın.
- Dağıtım geri almayı düşünmemek: Yeni bir sürümde sorun çıkarsa, geri alma stratejiniz hazır olmalı. Aksi takdirde sorun çözmek için uzun kesintiler yaşayabilirsiniz.
- Manuel adımları otomatikleştirmemek: Bazı ekipler testlerin ardından “manuel onay”dan sonra dağıtım yapar. Bu, CD’nin avantajlarını azaltır ancak bazı durumlarda gereklidir. Yine de onayı yalnızca kritik ortamlar için tutun.
CI/CD’yi PHP Otomasyon Sisteminize Entegre Etmenin Adımları
Şimdi, bu bilgileri pratiğe dökmek için adım adım bir plan yapalım. Bu planı kendi projenize uyarlayabilirsiniz.
- Mevcut süreci analiz edin. Hangi manuel adımlar var? Testler nasıl çalıştırılıyor? Dağıtım nasıl yapılıyor? Bağımlılıklar nasıl yönetiliyor?
- Test altyapısını oluşturun. PHPUnit veya tercih ettiğiniz test çerçevesiyle temel testleri yazın. En azından kritik modüller için testler ekleyin.
- Statik analiz araçlarını kurun. PHPStan veya Psalm’ı projeye dahil edin ve minimum kalite seviyesini belirleyin.
- Pipeline’ı yazın. CI/CD aracınızın yapılandırma dosyasını oluşturun. İlk başta yalnızca test ve analiz adımlarını ekleyin.
- Dağıtım sürecini otomatikleştirin. Deployer veya SSH tabanlı betiklerle dağıtım adımlarını ekleyin. İlk denemelerde bir test sunucusuna dağıtım yapın.
- Geri alma prosedürünü belirleyin. Sembolik link yöntemi veya image tag’leri ile eski sürüme dönüşün nasıl olacağını planlayın.
- İzleme ve bildirim ekleyin. Pipeline başarısız olduğunda e-posta veya mesaj ile ekip üyelerine bildirim gönderin. Dağıtım sonrası uygulama sağlığını izleyin.
Bu adımları tamamladığınızda, ekibiniz her değişikliği güvenle ana dalda birleştirebilir ve üretime çıkarabilir hale gelecektir.
Sık Karşılaşılan Zorluklar ve Pratik Çözümler
PHP projelerinde CI/CD kurarken bazı zorluklarla karşılaşabilirsiniz. İşte bunların üstesinden gelmek için bazı öneriler:
Yavaş Testler
Otomasyon sistemlerinde veritabanına bağımlı testler yavaş olabilir. Çözüm olarak, testlerde SQLite kullanmak veya test veritabanını her testten önce hızlıca sıfırlamak işe yarar. Ayrıca, HTTP istekleri yapan testleri mümkün olduğunca azaltın ve mock kullanın.
Composer Bağımlılık Çakışmaları
Farklı ortamlarda bağımlılık sürümleri farklı olabilir. Bu yüzden `composer.lock` dosyasını sürüm kontrolünde tutun ve CI’daki PHP sürümünü projenizle uyumlu hale getirin.
Sunucu Konfigürasyon Farkları
Geliştirme ve üretim sunucularındaki PHP ayarları (extension’lar, ini dosyaları) farklı olabilir. Bu farkları minimumda tutmak için Docker veya sanal ortamlar kullanmak en iyisidir.
Scaling ve Plugin Eksiklikleri
Küçük ekipler için bazı CI/CD araçları aşırı karmaşık gelebilir. Basit bir GitHub Actions workflow, ihtiyacın çoğunu karşılar. Ölçek büyüdükçe daha kapsamlı araçlara geçiş yapabilirsiniz.
Örnek GitHub Actions Workflow
İşte PHP için basit bir GitHub Actions örneği:
name: PHP CI/CD
on:
push:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Install dependencies
run: composer install --no-progress --prefer-dist
- name: Run PHPStan
run: vendor/bin/phpstan analyse src --level=6
- name: Run PHPUnit
run: vendor/bin/phpunit
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy to production
run: |
# deploy script using SSH keys stored in GitHub Secrets
sshpass -p "${{ secrets.SERVER_PASSWORD }}" ssh user@server "cd /var/www/html && git pull origin master && php artisan migrate --force"
Bu örnekte, test işi başarılı olursa deploy işi çalışır. SSH anahtarlarını GitHub Secrets’a koyduğunuzdan emin olun.
Özet: CI/CD Sürecinizde İlerleme Kaydedin
PHP otomasyon sistemlerinde CI/CD kurmak, başlangıçta zaman alıcı görünse de uzun vadede size büyük kazanç sağlar. Otomatik testler sayesinde hataları erken yakalar, dağıtım sürecini hızlandırır ve geri alma işlemlerini kolaylaştırırsınız.
Şimdi ilk adımı atabilirsiniz: projenizin test altyapısını güçlendirmekle başlayın. Ardından basit bir pipeline kurun ve zamanla geliştirin. Sürekli iyileştirme, CI/CD’nin doğasında vardır; mükemmel bir kurulum yapmak için acele etmeyin.
Unutmayın: CI/CD yalnızca araçlardan ibaret değildir; aynı zamanda ekip kültürü ve disiplin gerektirir. Küçük, sık değişiklikler yapın ve her zaman testleri yeşil tutmaya çalışın. Bu alışkanlıklar, otomasyon sisteminizin güvenilirliğini artıracaktır.