مقدمة في CI/CD لمشاريع PHP باستخدام GitHub Actions
تطوير تطبيقات PHP الحديثة لا يمكن أن يتم بدون أتمتة. الاختبار اليدوي والنشر ليسا فقط بطيئين، بل محفوفان بالأخطاء أيضًا. CI/CD (التكامل المستمر / النشر المستمر) يحل هذه المشاكل عن طريق أتمتة فحص الكود وتسليمه إلى الخادم. أحد أشهر الأدوات لذلك هو GitHub Actions.
GitHub Actions هي منصة مدمجة لأتمتة سير العمل (workflows)، والتي تتيح لك تشغيل الاختبارات، المدققات البرمجية، عمليات البناء والنشر مباشرة من مستودعك على GitHub. في هذه المقالة، سنشرح كيفية إعداد خط أنابيب CI/CD كامل لمشروع PHP: من تشغيل الاختبارات البسيطة إلى النشر التلقائي على خادم الإنتاج.
سنستخدم مثالًا يعتمد على Laravel، ولكن جميع المبادئ تنطبق على أي إطار عمل PHP (Symfony, Yii, WordPress، إلخ). ستتعلم كيفية كتابة تهيئات YAML، استخدام مصفوفات الاختبار، تخزين التبعيات مؤقتًا، ونشر الكود بأمان.
الجزء الرئيسي
1. أساسيات GitHub Actions: هيكل سير العمل (workflow)
سير العمل (Workflow) هو عملية مؤتمتة يتم تشغيلها بناءً على حدث معين (push، pull request، إنشاء tag). يتم وصف كل سير عمل في ملف YAML، يتم تخزينه في الدليل .github/workflows/ من مستودعك.
الهيكل الأساسي للملف .github/workflows/ci.yml:
name: CI Pipeline
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: test: runs-on: ubuntu-latest
steps: - name: Checkout repository uses: actions/checkout@v4
- name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: mbstring, xml, bcmath, pdo_mysql coverage: xdebug
- name: Install dependencies run: composer install --no-progress --prefer-dist
- name: Run PHPUnit tests run: vendor/bin/phpunit --coverage-textدعنا نحلل العناصر الأساسية:
on— المشغلات: push إلى main/develop، pull request إلى main.jobs— مجموعة من المهام (jobs) التي يتم تنفيذها بالتوازي أو بالتسلسل.runs-on— نظام التشغيل للتشغيل (عادةًubuntu-latest).steps— سلسلة من الخطوات داخل المهمة (job).uses— إجراءات (actions) جاهزة من السوق (مثلshivammathur/setup-php).run— تنفيذ أمر shell.
2. تهيئة متقدمة: مصفوفة الاختبار والتخزين المؤقت
للمشاريع الكبيرة، من المفيد اختبار إصدارات متعددة من PHP والتبعيات في وقت واحد. يتم ذلك من خلال استراتيجية المصفوفة (matrix strategy). من المهم أيضًا تخزين مجلد vendor الخاص بـ Composer مؤقتًا لتسريع تنفيذ سير العمل.
مثال مع المصفوفة والتخزين المؤقت:
name: Advanced CI
on: [push, pull_request]
jobs: test: runs-on: ubuntu-latest strategy: matrix: php: [ '8.1', '8.2', '8.3' ] dependency-stability: [ prefer-stable, prefer-lowest ]
steps: - uses: actions/checkout@v4
- name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: mbstring, pdo, gd coverage: none
- name: Cache Composer packages uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-php-${{ matrix.php }}-composer-
- name: Install dependencies run: composer install --${{ matrix.dependency-stability }} --no-interaction
- name: Run test