Nowa wersja modułu wdrożona na produkcję powodowała błąd 500 na całym sklepie. DI compilation kończyło się błędem o brakującym interfejsie. Problem był w zmianie sygnatury konstruktora bez aktualizacji di.xml. Czas naprawy: 1 godzina.
Objawy
- Błąd 500 na całym sklepie po deployment
bin/magento setup:di:compilekończy się błędem- W logach:
Argument X passed to Constructor must implement interface Y - Problem tylko w środowisku produkcyjnym (staging działał)
Przyczyna
Zmiana sygnatury konstruktora klasy – dodanie nowej zależności – bez regeneracji wygenerowanego kodu DI. Na staging compilation był uruchamiany automatycznie, na produkcji deployment pominął ten krok.
Rozwiązanie
# Sprawdź błędy kompilacji bin/magento setup:di:compile 2>&1 | tail -50 # Wyczyść wygenerowany kod i skompiluj ponownie rm -rf generated/code generated/metadata bin/magento setup:di:compile # Jeśli błąd w konkretnym module: grep -r "ClassX" generated/code/ # Znajdź i usuń przestarzałe wygenerowane klasy # Checklist przed każdym deploymentem: # 1. bin/magento setup:upgrade # 2. bin/magento setup:di:compile # 3. bin/magento setup:static-content:deploy -f # 4. bin/magento cache:flush
# Deployment script - zawsze w tej kolejności #!/bin/bash set -e # zatrzymaj przy błędzie composer install --no-dev --optimize-autoloader bin/magento maintenance:enable bin/magento setup:upgrade --keep-generated bin/magento setup:di:compile bin/magento setup:static-content:deploy -f pl_PL en_US bin/magento cache:flush bin/magento maintenance:disable echo "Deployment completed successfully"
Wnioski
DI compilation musi być częścią każdego deployment pipeline. Użyj flagi set -e w skryptach deployment – jeśli compilation się nie uda, deployment się zatrzyma zamiast wdrożyć zepsuty kod. Testuj na staging z tym samym skryptem co na produkcji.
