Сборка и развертывание приложения Zend Framework PHP в Jenkins

Я создаю задание jenkins для сборки и развертывания php-приложения Zend Framework 2. В моем скрипте Ant Ant я определил работу lint для проверки файлов php.

Задание на сборку не выполнено, потому что lint обнаружил ошибку в файле библиотеки ZF2.

Это вывод, сгенерированный lint:

[apply] PHP Fatal error:  Constructor Zend\Captcha\Factory::factory() cannot be static in /var/lib/jenkins/workspace/XXX/vendor/zendframework/zendframework/library/Zend/Captcha/Factory.php on line 90
[apply] Errors parsing /var/lib/jenkins/workspace/XXX/vendor/zendframework/zendframework/library/Zend/Captcha/Factory.php

Кто-нибудь знает, почему проверка Zend/Captcha/Factory.php fails?

Задача ANT выглядит следующим образом:

    <target name="lint" description="Perform syntax check of sourcecode files">
  <apply executable="php" failonerror="true">
   <arg value="-l" />

   <fileset dir="${basedir}/">
    <include name="**/*.php" />
    <modified />
   </fileset>

   <fileset dir="${basedir}/tests">
    <include name="**/*.php" />
    <modified />
   </fileset>
  </apply>
 </target>

1 ответ

Решение

Ваша проблема в том, что Zend Framework требует php 5.3.3 или новее. Так как ваша коробка Jenkins использует 5.3.2, это создает множество проблем. Одним из них, по-видимому, является ваша ошибка.

Я думаю, что вы не заметили ошибку раньше, потому что в системе разработки у вас установлена ​​5.3.3+. Попробуйте обновить свою среду тестирования до более новой версии php, которая устранит эту конкретную проблему.

Обновить

Чтобы немного пояснить мой ответ, в php 5.3.3 есть одно нарушение обратной совместимости, которое возвращается в вашу среду. Проверьте этот журнал изменений и особенно это утверждение:

Обратно несовместимое изменение:

Методы с тем же именем, что и последний элемент имени класса в пространстве имен, больше не будут рассматриваться как конструктор. Это изменение не влияет на классы без пространства имен.

<?php
namespace Foo;
class Bar {
    public function Bar() {
        // treated as constructor in PHP 5.3.0-5.3.2
        // treated as regular method in PHP 5.3.3
    }
}
?>

Это не влияет на миграцию из 5.2.x, потому что пространства имен были введены только в PHP 5.3.

В случае Zend\Captcha\Factoryесть метод factory() что статично, так что вы можете позвонить Zend\Captcha\Factory::factory(), На php 4 и 5 до 5.3.2 этот метод также анализируется как конструктор для фабрики. И конструкторы не могут быть статичными.

Линтер даст вам фатальную ошибку в этом случае.

Другие вопросы по тегам