Почему возникает ошибка PHPStan на Gitlab-pipeline для WordPress-проекта?

Ссылка скопирована
1 ответ

Есть Wordpress-проект на Bedrock, докеризован, локально ядро WP тянется как composer-зависимость
В числе зависимостей есть PHPStan, локально отрабатывает корректно (No Errors), как только запускается Gitlab-pipeline - падает в красное с множеством ошибок вида

Function add_filter invoked with 2 parameters, 0 required

Function add_filter invoked with 2 parameters, 0 required

- хотя и согласно спецификации, и согласно упоминаниям в ядре все вызовы функций корректные. Чем может быть вызвано подобное падение?

p.s. Иногда получается "позеленить" пайплайн пересборкой образа и повторным запуском джобы с PHPStan - без дополнительных коммитов, т.е. проблема не в коде

Дополнительно:

версия php локально и в CI одинаковая?

  • На локальной машине 8.1.20, в контейнере локально 8.1.19, в контейнере в гитлабе 8.1.19. По сути, локальная версия машины здесь не роляет, в контейнерах версия одинаковая, а поведение разное
  • Почему возникает ошибка PHPStan на Gitlab-pipeline для Wordpress-проекта?

    Проблему удалось решить. Пока я был в отпуске выяснилось две вещи:

    1. Наши девопсы обновили гитлаб-раннеры с версии 15.8.* до 15.11.*, в связи с чем PHPStan приобрёл довольно странную особенность поведения (п2):
    2. Теперь PHPStan привередлив к синтаксису поля scanDirectories и не поддерживает формат директорий вида ./directory/, но поддерживает directory/

    Так что решение проблемы было в замене содержимого конфиг-файла phpstan.neon с:

    parameters:   scanDirectories:     - ./wp-content/mu-plugins/     - ./wp-content/plugins/

    parameters: scanDirectories: - ./wp-content/mu-plugins/ - ./wp-content/plugins/

    на:

    parameters:   scanDirectories:     - wp-content/mu-plugins/     - wp-content/plugins/

    parameters: scanDirectories: - wp-content/mu-plugins/ - wp-content/plugins/

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Mobile-редакция Ответ

    PHPStan на GitLab pipeline для WordPress-проекта чаще всего падает не из-за GitLab, а из-за того, что в CI нет полного окружения WordPress: не установлены зависимости Composer, не подключены stubs для WordPress/WooCommerce/ACF, другой PHP version, другой autoload или анализируется код, который локально подгружается через WordPress hooks.

    Типовые причины:

    • Function get_field not found, Class WC_Product not found — нет stubs для плагинов.
    • Call to undefined function add_action — не подключены WordPress stubs.
    • Локально PHP 8.1, в pipeline PHP 8.2/8.3 — разные правила типов и deprecated-поведение.
    • CI запускает PHPStan из другой папки и не видит vendor/autoload.php.
    • В pipeline анализируются временные, vendor или сгенерированные файлы.

    Для WordPress обычно ставят szepeviktor/phpstan-wordpress и подключают его в phpstan.neon:

    composer require --dev phpstan/phpstan szepeviktor/phpstan-wordpress

    composer require --dev phpstan/phpstan szepeviktor/phpstan-wordpress

    includes:
        - vendor/szepeviktor/phpstan-wordpress/extension.neon
     
    parameters:
        level: 5
        paths:
            - wp-content/themes/your-theme
            - wp-content/plugins/your-plugin
        excludePaths:
            - */vendor/*
            - */node_modules/*

    includes: - vendor/szepeviktor/phpstan-wordpress/extension.neon parameters: level: 5 paths: - wp-content/themes/your-theme - wp-content/plugins/your-plugin excludePaths: - */vendor/* - */node_modules/*

    В .gitlab-ci.yml важно сначала установить зависимости и запускать ту же команду, что локально:

    phpstan:
      image: php:8.2-cli
      script:
        - apt-get update && apt-get install -y git unzip
        - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
        - php composer-setup.php --install-dir=/usr/local/bin --filename=composer
        - composer install --no-interaction --prefer-dist
        - vendor/bin/phpstan analyse -c phpstan.neon

    phpstan: image: php:8.2-cli script: - apt-get update && apt-get install -y git unzip - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" - php composer-setup.php --install-dir=/usr/local/bin --filename=composer - composer install --no-interaction --prefer-dist - vendor/bin/phpstan analyse -c phpstan.neon

    Правильная диагностика: взять точный текст ошибки из GitLab job log и воспроизвести команду локально в чистой папке после composer install. Если ошибка только в CI, сравните PHP version, переменные окружения, working directory и список установленных dev-зависимостей.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно