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@v4setup-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, phpstanComposer'ı Ö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-progressHizmet 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=10Sı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-progressMatris 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=maxGizli 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-1Dağı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=120sHı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
- PHP Uygulamasını Kapsayıcılaştırma
- Çok Aşamalı Derlemeler ve İyileştirme
- Yerel Yığınlar için Docker Compose
- GitHub Actions ile CI/CD