PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

GitHub Actions – pipeline dla PHP, matrix testów, deploy na staging przez SSH

by Henryk Tews / wtorek, 14 września 2021 / Opublikowano w Środowiska

Każdy deploy robiony ręcznie przez SSH to potencjalne źródło błędu. GitHub Actions pozwala zautomatyzować testy, analizę statyczną i wdrożenie – bezpłatnie dla publicznych repozytoriów, z hojnym limitem dla prywatnych. Pokazuję jak zbudować pipeline CI/CD dla projektu PHP i modułu Magento 2 od zera.

Podstawy GitHub Actions

Pipeline definiujesz w pliku YAML w katalogu .github/workflows/. Każdy workflow ma triggery (co go uruchamia), joby (co robi) i kroki (jak to robi):

# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-22.04

    steps:
      - name: Checkout kodu
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          extensions: mbstring, intl, zip, bcmath, soap, gd
          coverage: xdebug

      - name: Cache Composer dependencies
        uses: actions/cache@v3
        with:
          path: vendor
          key: composer-${{ hashFiles('composer.lock') }}

      - name: Install dependencies
        run: composer install --no-interaction --prefer-dist

      - name: Run PHPUnit
        run: vendor/bin/phpunit --coverage-clover coverage.xml

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v3
        with:
          file: coverage.xml

Matrix – testowanie na wielu wersjach PHP

jobs:
  test:
    runs-on: ubuntu-22.04

    strategy:
      matrix:
        php-version: ['7.4', '8.0', '8.1']
        # Każda wersja PHP to osobny job uruchamiany równolegle

    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP ${{ matrix.php-version }}
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          extensions: mbstring, intl, zip

      - run: composer install --no-interaction
      - run: vendor/bin/phpunit

Pełny pipeline dla modułu Magento 2

# .github/workflows/magento-module-ci.yml
name: Magento 2 Module CI

on:
  push:
    branches: [main, develop]
  pull_request:

jobs:
  static-analysis:
    name: Analiza statyczna
    runs-on: ubuntu-22.04

    steps:
      - uses: actions/checkout@v4

      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          extensions: mbstring, intl, zip, bcmath

      - name: Cache Composer
        uses: actions/cache@v3
        with:
          path: vendor
          key: composer-${{ hashFiles('composer.lock') }}
          restore-keys: composer-

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

      - name: PHP CS Fixer - sprawdzenie stylu kodu
        run: vendor/bin/php-cs-fixer fix --dry-run --diff

      - name: PHPStan - analiza statyczna
        run: vendor/bin/phpstan analyse src --level=6 --no-progress

      - name: PHP Copy Paste Detector
        run: vendor/bin/phpcpd src --min-lines=5

  unit-tests:
    name: Testy jednostkowe
    runs-on: ubuntu-22.04
    needs: static-analysis

    strategy:
      matrix:
        php-version: ['8.0', '8.1']

    steps:
      - uses: actions/checkout@v4

      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          extensions: mbstring, intl, zip, bcmath
          coverage: xdebug

      - name: Cache Composer
        uses: actions/cache@v3
        with:
          path: vendor
          key: composer-${{ matrix.php-version }}-${{ hashFiles('composer.lock') }}

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

      - name: PHPUnit
        run: |
          vendor/bin/phpunit \
            --coverage-clover coverage.xml \
            --log-junit junit.xml

      - name: Publikuj wyniki testów
        uses: mikepenz/action-junit-report@v3
        if: always()
        with:
          report_paths: junit.xml

  deploy-staging:
    name: Deploy na staging
    runs-on: ubuntu-22.04
    needs: [static-analysis, unit-tests]
    if: github.ref == 'refs/heads/develop'

    steps:
      - uses: actions/checkout@v4

      - name: Deploy przez SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.STAGING_HOST }}
          username: ${{ secrets.STAGING_USER }}
          key: ${{ secrets.STAGING_SSH_KEY }}
          script: |
            cd /var/www/magento-staging
            git pull origin develop
            composer install --no-dev --optimize-autoloader
            bin/magento setup:upgrade
            bin/magento setup:di:compile
            bin/magento setup:static-content:deploy pl_PL en_US -f
            bin/magento cache:flush

Sekrety i zmienne środowiskowe

Klucze SSH, tokeny API i dane dostępowe przechowujesz w GitHub Secrets (Settings – Secrets – Actions). Nigdy nie wklejaj ich bezpośrednio w YAML:

- name: Composer auth dla repo.magento.com
  run: |
    composer config http-basic.repo.magento.com \
      ${{ secrets.MAGENTO_PUBLIC_KEY }} \
      ${{ secrets.MAGENTO_PRIVATE_KEY }}

Automatyczne sprawdzanie kompatybilności PHP

- name: PHP Compatibility Check
  run: |
    composer require --dev phpcompatibility/php-compatibility
    vendor/bin/phpcs \
      --standard=PHPCompatibility \
      --runtime-set testVersion 8.0-8.1 \
      src/

Cache dla przyspieszenia pipeline

Największe oszczędności czasu daje keszowanie zależności Composera. Klucz cache oparty na composer.lock gwarantuje że przy braku zmian zależności pipeline pobierze je z cache zamiast instalować od zera:

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

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

Podsumowanie

GitHub Actions to za darmo to co kiedyś wymagało płatnego Jenkins CI lub skomplikowanej konfiguracji. Dla modułu Magento 2 minimalny użyteczny pipeline to: PHPStan na poziomie 5+, PHPUnit dla testów jednostkowych i deploy przez SSH po merge do main. Każde PR automatycznie sprawdzane przez CI eliminuje klasę błędów które wcześniej wychodziły dopiero na staging lub produkcji.

About Henryk Tews

Co możesz przeczytać następne

DDEV zaawansowany – mutagen, własne serwisy, hooks, współdzielona konfiguracja w teamie
Docker od zera – Dockerfile, nginx, docker-compose, Xdebug 3.x
XAMPP vs DDEV vs Warden – pełne porównanie w tabeli
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}