0Pricing
PHP Academy · Ders

GitHub Actions ile CI/CD

Her gönderimde PHP'yi otomatik olarak test edin ve dağıtın.

GitHub Actions ile CI/CD, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

PHP için CI/CD

Her gönderim sınanmalı, kod biçimi denetiminden geçirilmeli ve statik olarak analiz edilmelidir; ana dalda başarılı olduğunda da bir imaja dönüştürülüp dağıtılmalıdır. GitHub Actions, bu işlem hattını depo olaylarıyla tetiklenen yönetilen çalıştırıcılarda yürütür.

Gerçek bir MySQL hizmeti üzerinde PHPUnit çalıştıran, Composer'ı önbelleğe alan, PHPStan çalıştıran, bir Docker imajı oluşturan ve dağıtım yapan bir iş akışı oluşturacağız.

İş Akışının Anatomisi

Bir iş akışı .github/workflows/*.yml içinde bulunur. on: tetikleyicilerine, bir veya daha fazla jobs: işine ve her işte steps: adımlarına sahiptir. İşler, needs: ile birbirine bağlanmadıkları sürece yalıtılmış çalıştırıcılarda paralel yürütülür.

name: CI
on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

setup-php Eylemi

shivammathur/setup-php, belirli bir PHP sürümünü seçilen uzantılar ve araçlarla (Composer, PHPStan ve diğerleri) çalıştırıcıya yüklemenin standart yoludur; yalnızca sınama yapmak için imaj oluşturmaktan çok daha hızlıdır.

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          extensions: pdo_mysql, intl, redis, zip
          coverage: pcov
          tools: composer:v2, phpstan

Composer'ı Önbelleğe Alma

Bağımlılıkları her çalıştırmada yeniden indirmek dakikalar kaybettirir. Composer'ın dizinini composer.lock karmasına göre anahtarlayarak önbelleğe alın; böylece önbellek yalnızca bağımlılıklar değiştiğinde geçersizleşir.

      - name: Get Composer cache dir
        id: composer-cache
        run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

      - uses: actions/cache@v4
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: composer-

      - run: composer install --prefer-dist --no-progress

Hizmet Kapsayıcıları

İşler, çalıştırıcının 127.0.0.1 üzerinden erişebileceği gerçek bir MySQL veya Redis gibi hizmet kapsayıcılarını başlatabilir. Adımların veritabanı hazır olmadan çalışmaması için options aracılığıyla bir sağlık denetimi ekleyin.

  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.4
        env:
          MYSQL_DATABASE: app_test
          MYSQL_ROOT_PASSWORD: root
        ports: ['3306:3306']
        options: >-
          --health-cmd="mysqladmin ping -proot"
          --health-interval=5s --health-retries=10

Sınamaları ve Kapsamı Çalıştırma

Bağımlılıklar yüklü ve MySQL çalışır durumdayken PHPUnit'i çalıştırın. Sınama DSN'nizi 127.0.0.1:3306 adresine yönlendirin. Kapsam bilgisi oluşturun ve isteğe bağlı olarak bir eşik değerinin altında kalındığında derlemeyi başarısız yapın.

      - name: Run PHPUnit
        env:
          DATABASE_URL: "mysql://root:root@127.0.0.1:3306/app_test"
        run: vendor/bin/phpunit --coverage-clover=coverage.xml

      - name: Static analysis
        run: phpstan analyse src --level=8 --no-progress

Matris Derlemeleri

Kütüphaneler birden fazla PHP sürümünde başarılı olmalıdır. Bir strategy.matrix, işi her birleşim için bir tane olacak şekilde paralel çalıştırmalara dağıtır; ${{ matrix.php }} adımlara araya eklenir.

  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        php: ['8.2', '8.3', '8.4']
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}

İmaj Etiketini Hesaplama

Dağıtımların benzersiz ve izlenebilir bir imaj etiketine ihtiyacı vardır. Geleneksel seçim commit SHA'sıdır. Bu parçacık, bir referans ile SHA'yı kayıt deposu etiketine dönüştüren ve iş akışında ifade edeceğiniz etiket türetme mantığını gösterir.

<?php
// Mirrors what the workflow computes for the image tag
$ref = 'refs/heads/main';
$sha = '9f41efadc0de1234567890abcdef0000deadbeef';

$branch = str_replace('refs/heads/', '', $ref);
$shortSha = substr($sha, 0, 7);
$tag = sprintf('registry.example.com/app:%s-%s', $branch, $shortSha);

echo $tag . PHP_EOL;          // registry.example.com/app:main-9f41efa
echo 'is_main: ' . ($branch === 'main' ? 'yes' : 'no') . PHP_EOL;
?>

İmajı Derleme ve Gönderme

Ana dalda, BuildKit ve GitHub Actions önbelleğini kullanarak docker/build-push-action ile Docker imajını oluşturun. Önce gizli bir belirteçle kayıt deposunda oturum açın; kimlik bilgilerini hiçbir zaman doğrudan koda yazmayın.

  build:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          target: runtime
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Gizli Bilgiler ve OIDC

Kimlik bilgilerini, ${{ secrets.NAME }} olarak başvurulan depo/ortam gizli bilgileri içinde saklayın; bunlar günlüklerde maskelenir. Bulut dağıtımları için OIDC kullanmayı tercih edin: çalıştırıcı, permissions: id-token: write aracılığıyla AWS/GCP'den kısa ömürlü bir belirteç alır; böylece depoda uzun ömürlü anahtarlar bulunmaz.

  deploy:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      id-token: write     # enables OIDC
      contents: read
    steps:
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/deploy
          aws-region: eu-central-1

Dağıtım Adımı ve Ortamlar

Üretim dağıtımlarını bir GitHub environment arkasında, isteğe bağlı olarak zorunlu inceleyicilerle koruyun. Ardından dağıtım adımı, kullanıma alma işleminizi tetikler: bir Kubernetes dağıtımını veya ECS hizmetini günceller ya da SSH ile bağlanıp yeni imajı çeker.

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: production       # can require manual approval
      url: https://app.example.com
    steps:
      - name: Roll out
        run: |
          kubectl set image deployment/app \
            app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          kubectl rollout status deployment/app --timeout=120s

Hızlı Kontrol

Actions'ta OIDC'nin saklanan bulut anahtarlarına göre temel güvenlik avantajı nedir?

Özet

GitHub Actions'ta bir PHP CI/CD işlem hattı oluşturdunuz: push/PR tetikleyicileri, uzantılarla setup-php, kilit dosyasına göre anahtarlanan önbelleğe alınmış Composer, sağlık denetimli bir MySQL hizmet kapsayıcısı, PHPUnit + PHPStan, bir sürüm matrisi ve ardından GHA önbelleğini kullanan yalnızca ana dalda çalışan bir derleme-gönderme ile OIDC kimlik doğrulamalı ve ortam onayına bağlı bir dağıtım.

İlkeler: kilit dosyası karmalarına göre önbelleğe alın, hazır hizmetleri sağlık denetimleriyle koşullandırın, imajları SHA ile etiketleyin ve saklanan anahtarlar yerine OIDC'yi tercih edin.

Sıkça Sorulan Sorular

“GitHub Actions ile CI/CD” dersi ücretsiz mi?

Evet — “GitHub Actions ile CI/CD” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“GitHub Actions ile CI/CD” dersinde ne öğreneceğim?

Her gönderimde PHP'yi otomatik olarak test edin ve dağıtın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“GitHub Actions ile CI/CD” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. PHP Uygulamasını Kapsayıcılaştırma
  2. Çok Aşamalı Derlemeler ve İyileştirme
  3. Yerel Yığınlar için Docker Compose
  4. GitHub Actions ile CI/CD
← PHP Academy Sayfasına Dön