CI/CD: Wdrażaj Kod Bez Strachu
Deployment przez FTP to przepis na katastrofę. Dowiedz się, jak zbudować profesjonalny pipeline z GitHub Actions i Deployer PHP, który automatycznie testuje, kompiluje i wdraża Twoje Magento 2 – bez przestojów.
~80%
incydentów produkcyjnych pochodzi z błędnych wdrożeń
0s
downtime przy Deployer – atomic symlink swap
<5min
pełny pipeline od push do produkcji
Magento 2 to złożona platforma – każde wdrożenie wymaga kompilacji DI, generowania statycznych plików, migracji bazy danych i czyszczenia cache. Ręczna realizacja tych kroków to pewna droga do błędów i nieprzewidywalnego stanu produkcji. Dobrze skonfigurowany pipeline CI/CD eliminuje zmienność ludzką i sprawia, że każde wdrożenie jest powtarzalne, audytowalne i odwracalne.
GitHub Actions – automatyczne testy i build
GitHub Actions to darmowe środowisko CI wbudowane w repozytorium. Każdy push na branch main lub develop automatycznie uruchamia pipeline: instalację zależności, testy jednostkowe PHPUnit, analizę statyczną PHPCS i – w razie sukcesu – deployment przez Deployer na serwer docelowy.
Pro Tip: Kompletny plik .github/workflows/deploy.yml
Gotowy workflow GitHub Actions dla Magento 2: testy → PHPCS → deployment przez Deployer. Sekrety SSH i klucze trzymaj w GitHub Secrets, nigdy w repozytorium.
# .github/workflows/deploy.yml
name: Magento CI/CD
on:
push:
branches: [main]
jobs:
test-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with: { php-version: '8.3' }
- run: composer install --no-interaction --prefer-dist
- run: vendor/bin/phpunit -c dev/tests/unit/phpunit.xml.dist --testdox
- run: vendor/bin/phpcs --standard=Magento2 app/code/Vendor/
- name: Deploy via Deployer
env:
DEPLOY_KEY: $${{ secrets.SSH_PRIVATE_KEY }}
run: |
echo "$DEPLOY_KEY" > /tmp/deploy_key && chmod 600 /tmp/deploy_key
vendor/bin/dep deploy production -vvv
Deployer PHP – zero-downtime deployment
Deployer (deployer.org) to najlepszy narzędzie do wdrażania Magento 2. Działa na zasadzie atomic symlink swap: nowa wersja aplikacji jest przygotowywana w osobnym katalogu releases/, a po zakończeniu wszystkich kroków (composer install, static deploy, setup:upgrade) serwer produkcyjny przez zmianę symlinku current/ natychmiast przełącza się na nową wersję. Cały proces trwa milisekundy i jest w pełni odwracalny – rollback to jeden rozkaz.
Konfiguracja Deployer dla Magento 2 (deploy.php)
Deployer ma oficjalny przepis dla Magento 2 (deployer/magento2-deployer). Poniżej minimalna konfiguracja produkcyjna z zachowaniem współdzielonych plików i katalogów.
// deploy.php – konfiguracja Deployer dla Magento 2
require 'recipe/magento2.php';
host('production')
->setHostname('1.2.3.4')
->setRemoteUser('deploy')
->setIdentityFile('/tmp/deploy_key')
->setDeployPath('/var/www/sklep');
set('shared_files', ['.env', 'app/etc/env.php']);
set('shared_dirs', ['var', 'pub/media', 'pub/static']);
set('writable_dirs', ['var', 'pub/media', 'pub/static', 'generated']);
set('keep_releases', 5); // trzymaj 5 ostatnich release’ów
// Niestandardowe zadania w pipeline:
after('deploy:failed', 'deploy:unlock'); // odblokuj przy błędzie
# Deployment na produkcję (wywołanie z GitHub Actions lub ręcznie):
vendor/bin/dep deploy production -vvv
# Natychmiastowy rollback do poprzedniej wersji:
vendor/bin/dep rollback production
PHPUnit i analiza statyczna – jakość kodu przed wdrożeniem
Każdy commit do main powinien przejść przez trzy warstwy kontroli jakości: testy jednostkowe (PHPUnit), analizę statyczną (PHPStan/Psalm) i styl kodowania (PHP_CodeSniffer z Magento2 standard). Pipeline nie powinien wdrażać, jeśli którykolwiek krok zwróci błąd. To gwarantuje, że na produkcji ląduje wyłącznie kod, który przeszedł pełną inspekcję.
Testy i analiza statyczna – komendy CLI
Pełen zestaw komend, które powinny być wywoływane w pipeline przed każdym deploymentem.
# Testy jednostkowe PHPUnit z raportem testdox:
vendor/bin/phpunit -c dev/tests/unit/phpunit.xml.dist --testdox --colors=always
# Testy integracyjne (wymagają bazy danych testowej):
vendor/bin/phpunit -c dev/tests/integration/phpunit.xml.dist
# Analiza statyczna PHPStan (poziom 5 = dobry punkt startowy):
vendor/bin/phpstan analyse app/code/Vendor/ --level=5 --no-progress
# Standardy kodowania Magento 2 (PHPCS):
vendor/bin/phpcs --standard=Magento2 --extensions=php app/code/Vendor/
# Automatyczna naprawa stylu kodu (PHP CS Fixer):
vendor/bin/php-cs-fixer fix app/code/Vendor/ --dry-run --diff
Kroki wdrożenia Magento 2 w pipeline
Kolejność kroków w deployment pipeline ma znaczenie – zła kolejność może doprowadzić do chwilowego wyświetlania błędów na produkcji. Poniższy przepis zapewnia, że serwer jest w trybie konserwacji w czasie najbardziej ryzykownych operacji.
1. maintenance:enable
Uruchom tryb konserwacji przed jakimkolwiek krokiem dotykającym bazy. Użyj --ip aby zachować dostęp dla dev.
2. composer install --no-dev
Zainstaluj zależności produkcyjne. Nigdy nie commituj katalogu vendor/ do repozytorium.
3. setup:upgrade + compile
Migracje bazy i kompilacja DI. Najbardziej czasochłonne kroki – w Deployer wykonywane na nowym release przed swap.
4. static-content:deploy
Generowanie JS/CSS dla wszystkich locale. Użyj flagą -j4 (parallel threads) dla przyspieszenia.
5. symlink swap (Deployer)
Atomic swap: current/ zaczyna wskazywać na nowy release. Zero-downtime – użytkownicy nie widzą przerwy.
6. cache:flush + maintenance:disable
Wyczyść Redis i Varnish, wyłącz tryb konserwacji. W Deployer użyj after('deploy', 'magento:cache:flush').
Najczęstsze błędy w pipeline CI/CD
Deployment zawiesza się na static:deploy
Za mało pamięci PHP w GitHub Actions. Ustaw memory_limit=-1 lub podziel deploy na osobne locale.
Rollback nie cofa migracji bazy
Deployer cofa pliki, ale nie migracje DB. Zawsze pisz migracje wstecznie zgodne lub rób backup przed deploymentem.
Błąd "deploy:lock" blokuje kolejne wdrożenia
Poprzedni deployment się nie udał, ale nie zwolnił blokady. Uruchom: dep deploy:unlock production.
env.php nadpisywany przez Deployer
Brak app/etc/env.php w shared_files. Plik jest usuwany przy każdym deploymencie. Konfiguracja znika z produkcji.
Sekrety w historii commitów
Klucze API lub hasła commitowane do repozytorium. Używaj GitHub Secrets i .gitignore dla env.php.
Testy integracyjne nie działają w CI
Brak serwisu MySQL w GitHub Actions workflow. Dodaj: services: mysql: image: mysql:8.0 w pliku YAML.
Pełna lista komend wdrożeniowych Magento 2
Kolejność ma znaczenie. Te komendy w tej kolejności – nic nie pójdzie nie tak na produkcji.
# 1. Tryb konserwacji (zachowaj IP dewelopera):
php bin/magento maintenance:enable --ip=TWOJE_IP
# 2. Zależności produkcyjne:
composer install --no-dev --optimize-autoloader --no-interaction
# 3. Migracje + kompilacja DI:
php bin/magento setup:upgrade --keep-generated
php bin/magento setup:di:compile
# 4. Pliki statyczne (parallel, wszystkie locale):
php bin/magento setup:static-content:deploy -f pl_PL en_US de_DE -j4
# 5. Uprawnienia + cache:
find var generated pub/static pub/media app/etc -type f -exec chmod g+w {} + 2>/dev/null
php bin/magento cache:flush
# 6. Wyłączenie konserwacji:
php bin/magento maintenance:disable
CI/CD to inwestycja, która zwraca się przy pierwszym unikniętym incydencie produkcyjnym. W Mage24.pl każdy projekt produkcyjny otrzymuje od nas skonfigurowany pipeline GitHub Actions + Deployer z automatycznym rollbackiem, testami i monitoringiem wdrożeń.
Chcesz wdrożyć CI/CD w swoim sklepie?
Skonfigurujemy GitHub Actions, Deployer PHP i testy automatyczne – Twoje wdrożenia będą bezpieczne i powtarzalne.