Bu yazıda, CI/CD’nin ne olduğunu ve neden önemli olduğunu açıklayacağız. Sonunda, GitHub Actions iş akışınızın otomatik olarak her seferinde çalışmasını sağlayacak bir yapı oluşturacağız.
Her satırı açıklayacağım. Daha önce YAML yazmadıysanız sorun değil — sözdizimi, düzeni gördüğünüzde basit hale geliyor.
Adım 1: İş Akışı Dosyasını Oluşturma
Laravel projenizin kök dizininde aşağıdaki dizin yapısını oluşturun:
your-project/
└── .github/
└── workflows/
└── api-ci.yml.github klasörü, depoyuza ait kök dizinde yer almalıdır ( composer.json ile aynı seviyede). GitHub, iş akış dosyalarını özellikle .github/workflows/ dizininde arar.
Adım 2: Tetikleyici Bloğu
api-ci.yml dosyasını açın ve tetikleyici ile başlayın:
name: API CI
on:
push:
branches: [main, develop]
paths: ['api/']
pull_request:
branches: [main, develop]
paths: ['api/']
Bu ne yapar:
name:GitHub Actions arayüzünde görünen etikettir.on:iş akışının ne zaman çalıştığını tanımlar.push:+branches:—mainveyadevelopbranch’ine push yapıldığında çalışır.pull_request:— bu branch’leri hedefleyen bir PR açıldığında veya güncellendiğinde çalışır.paths:— yalnızcaapi/içindeki dosyalar değiştiğinde çalışır (tek bir Laravel uygulamanız varsa bunu atlayın, monorepo değilse).
Adım 3: İlk Görev
defaults: run: working-directory: api # Laravel uygulamanız kök dizindeyse burayı kaldırınjobs: tests: name: Tests (PHP 8.4) runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4 - name: Setup PHP 8.4 uses: shivammathur/setup-php@v2 with: php-version: '8.4' extensions: mbstring, pdo, pdo_mysql, bcmath, gd, zip, intl coverage: none tools: composer:v2</code></pre> <p><code>actions/checkout@v4</code>, deponuzun kodunu çalıştırıcıya indirir. Olmadan, sanal makinenin boş bir diski vardır.</p> <p><code>shivammathur/setup-php@v2</code>, PHP'yi kurmak için topluluk standartlarında bir eylemdir. Sürümü ve uzantıları belirttiğinizde işe yarar. <code>tools: composer:v2</code> satırı, Composer 2'nin kurulu olmasını sağlar.</p> <h2>Adım 4: Bağımlılık Önbellekleme</h2> <p>Önbellek olmadan, her CI çalışmasında Composer paketlerinizi baştan indiriyorsunuz. 80 bağımlılığı olan bir projede bu 2-3 dakika sürer. Önbellekleme ile bu, 15 saniye alır.</p> <pre><code> - name: Cache Composer dependencies uses: actions/cache@v4 with: path: api/vendor key: php-8.4-composer-${{ hashFiles('api/composer.lock') }} restore-keys: php-8.4-composer-</code></pre> <p><code>key</code>, <code>composer.lock</code> dosyasının bir hash’ini içerir. Kilit dosyanız değiştiğinde (bir paket eklediğinizde), önbellek anahtarı değişir ve CI yeni bağımlılıkları indirir. Hiçbir şey değişmediğinde, önbellekteki <code>vendor/</code> klasörü geri yüklenir.</p> <h2>Adım 5: Kurulum ve Test</h2> <pre><code> - name: Install dependencies run: composer install --no-interaction --prefer-dist --no-progress - name: Copy environment file run: cp .env.example .env - name: Generate app key run: php artisan key:generate - name: Run tests run: ./vendor/bin/pest</code></pre> <p><code>--no-interaction</code>, Composer'ın soru sormasını engeller. <code>--prefer-dist</code>, git reposunu klonlamak yerine zip arşivleri indirir (daha hızlıdır). <code>--no-progress</code> ise günlükleri temiz tutar.</p> <p><code>cp .env.example .env</code> adımı önemlidir: Laravel, bir <code>.env</code> dosyası olmadan çalışmaz. <code>env.example</code> dosyanız, uygulamanın başlangıçta okuduğu tüm değerler için makul varsayılanlara sahip olmalıdır.</p> <h2>Adım 6: Gönderin</h2> <pre><code>git add .github/workflows/api-ci.ymlgit commit -m "ci: add initial GitHub Actions workflow"
git push origin mainGitHub’daki deponuza gidin, Actions sekmesine tıklayın. İş akışının göründüğünü ve çalışmaya başladığını göreceksiniz. İçine tıklayın ve adımların gerçekte nasıl yürütüldüğünü izleyin.
Yeşil yanıyorsa — tebrikler. CI’niz var. Gelecek her push, bunu otomatik olarak çalıştıracaktır.
Yeni Kullanıcıların Sık Karşılaştığı Hatalar
“Process completed with exit code 1” hatası
key:generatesırasında
.env.exampledosyanızdaAPP_KEY=boş.APP_KEY=(boş değer) ekleyin vekey:generatebunu dolduracaktır.Testlerde “Class not found” hataları
Yerel olarakcomposer dump-autoloadçalıştırın ve sonucu commit edin. CI, autoload oluşturmayı da içerencomposer installçalıştırır, ancakcomposer.json‘da eski yollar varsa, bu hata burada ortaya çıkar.Yerelde geçen testler, CI’de başarısız oluyor
Testleriniz, yalnızca sizin bilgisayarınızda mevcut olan bir şeye — bir veritabanına, bir önbellek kaydına veya bir ortam değişkenine bağlanıyordur. Bunu düzgün bir şekilde Yazı 3 (MySQL) ve Yazı 5 (gizli bilgiler) ile çözüyoruz.Sonraki yazıda, testlerinizin gerçek bir veritabanı yerine SQLite ile çalışmasını sağlamak için bir MySQL hizmet konteyneri ekleyeceğiz.
Orijinal olarak dineshstack.com‘da yayımlanmıştır — kod örnekleri ve güncellemeler ile tam sürümünü oradan okuyun.
Kaynak: Orijinal Makale


