программист
0,1
рейтинг
9 мая 2014 в 18:52

Разработка → PHPCI: Система непрерывной интеграции для PHP-проектов

PHP*
image

Совсем недавно вышла из бета-версии новая система непрерывной интеграции для PHP-проектов с открытым исходным кодом — PHPCI (текущая версия — 1.1.0), она вскользь упоминалась в дайджесте PHP №21.

Я уже какое-то время эксперементирую с этой системой, поэтому хочу представить вам небольшой ее обзор, тем более что на Хабре нет ни одной статьи о ней.

Сейчас PHPCI доступна в двух вариантах: аренда по подписке, а так же self-hosted установка из исходного кода.

Плагины


Система написана на PHP и для PHP, поэтому «из коробки» поддерживает внушительный перечень инструментов из мира PHP по средством плагинов:

а так же имеет несколько плагинов общего назначения или не связанных напрямую с PHP инструментами:

Проект довольно современный и требует версию PHP не ниже 5.3, использует PDO для подключения к базам данных и в целом, на мой взгляд, имеет простой и понятный исходный код, использующий пространства имен для классов и PSR-2 стиль для кода, что несомненно очень хорошо.

Плагины, как правило, довольно простые и небольшие по объему кода, поэтому написать собственный плагин для инструмента, который не поддерживаются в стандартной поставке, не составит большого труда.

Конфигурация проектов


Система имеет декларативный стиль описания конфигурации проектов (используется формат YAML), что довольно удобно, особенно для небольших проектов.

Файл конфигурации phpci.yml берется из корня репозитория проекта (или просто рабочей директории проекта, если речь идет о локальном источнике), так же есть возможность задать конфигурацию непосредственно в проекте PHPCI при его создании.

Ниже небольшой пример файла конфигурации phpci.yml:

build_settings:
    ignore: 
        - "vendor"
        - "tests"
setup:
    composer:
        action: "install"
test:
    php_unit:
        config:
            - "phpunit.xml"
        coverage: "logs/tests_coverage"
        args:     "--stderr"
    php_mess_detector:
        allow_failures: true
    php_cpd:
        allow_failures: true
    php_loc:
        allow_failures: true
    php_parallel_lint:
        allow_failures: true

Файл конфигурации имеет несколько корневых раздела:

  • build_settings — настройки сборки проекта (игнорирование директорий, настройки подключения к базам данных)
  • setup — раздел инициализации сборки проекта (установка зависимостей, выполнение запросов к базам данных, миграции для баз данных)
  • test — раздел тестирования готовой сборки проекта (над сборкой проекта запускаются различные плагины, которые возвращают успешный или нет результат, провал, как правило, приводит к провалу сборки, хотя для отдельных плагинов это не так и можно установить количество ошибок, приводящих к провалу всей сборки)
  • complete — раздел, вызываемый системой после тестирования независимо от его результата
  • success — раздел, вызываемый системой после тестирования только в случае успешной сборки и тестирования проекта
  • failure — раздел, вызываемый системой после тестирования только в случае провала сборки или тестирования проекта

Источники


Система поддерживает в качестве источника проектов: Github, Gitlab, Bitbucket, Git, Hg или локальную директорию. Svn пока не поддерживается (не уверен, что его поддержка вообще есть в планах).

Ложка дегтя


Несмотря на всю свою привлекательность, PHPCI совсем молод и много (пока) не умеет:
  • как я уже писал выше, он не умеет работать с Svn
  • не умеет разворачиваться на отличных от MySQL базах данных (хотя для операций в проектах уже есть плагин для PostgreSQL)
  • не умеет работать при сборке с реляционными базами данных MSSQL, OracleSQL, SQLite и т.д.
  • не умеет полностью разворачивать проект штатными средствами (хотя этого и можно добиться, используя Shell плагин)
  • не умеет работать с NoSQL базами данных

Резюме


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

Как установить систему можно узнать на странице в официальной wiki проекта.
Dmitriy Corpsee @Corpsee
карма
12,0
рейтинг 0,1
программист
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (21)

  • 0
    А есть какие-нибудь плагины или мануалы по интеграции с gerrit?
    • +1
      «Из коробки», к сожалению, нет. А мануалов, кроме официальной документации, я вообще никаких не видел.
      Проект слишком молодой еще, есть вариант, либо поэкспериментировать самому, либо создать реквест на эту фичу на гитхабе, вполне возможно, что кто-то реализует ее, проект сейчас довольно активно разрабатывается.
  • –1
    Честно говоря, так и не понял чем phpci лучше jenkins
    • +2
      А я и не утверждал, что лучше) Просто альтернатива, написанная на PHP.

      Для PHP проектов удобно то, что composer, phpunit и прочие стандартные для языка инструменты есть из коробки и настраиваются декларативно, плюс к тому PHPCI умеет парсить вывод некоторых утилит и рисовать графики и/или показывать статистику, опять же из коробки.

      В Jenkins я смогу собрать какую-то статистику phunit, php_mass_detect и подобного, не допиливая его руками, например? Допиливать опять же проще на языке который ты хорошо знаешь, для меня java таковым языком не является.
      • +1
        >В Jenkins я смогу собрать какую-то статистику phunit, php_mass_detect не допиливая его руками, например?
        Конечно. Плагины есть — настройка в ant-скрипте
        • –1
          Это и есть уже допиливание. Тут в том и соль, что для PHP в общем случае вообще ничего ставить не нужно, все основное работает сразу после установки.
          Но вообще, это дело вкуса конечно и привычки, мне например для маленьких проектов на PHP Jenkins — это прям очень оверхед, еще и с дополнительной зависимостью в виде java.
      • 0
        В Jenkins я смогу собрать какую-то статистику phunit, php_mass_detect и подобного, не допиливая его руками, например? Допиливать опять же проще на языке который ты хорошо знаешь, для меня java таковым языком не является.


        Да сможете, Sebastian Bergmann, то что разработчик PHPUnit, все это уже сделал для нас — остается только установить: jenkins-php.org/
        • 0
          не знал, спасибо
  • 0
    Проект сразу тоже понравился, даже контрибьютил немного, но потом перестал, когда столкнулся с тем, что PHPCI требует установки зависимостей тестируемого проекта на сервере. То есть, если мой проект использует Behat/PHPUnit/Codeception, то PHPCI не умеет взять эти либы из вендоров проекта, а обязан иметь установленными их на сервере, где сам хостится. Это в корне неправильно, я считаю, но авторы думают иначе.

    Подробнее данная проблема обсуждается здесь, с двумя core разработчиками: github.com/Block8/PHPCI/issues/231

    После этой проблемы поставил TeamCity и бед не знаю, Jenkins так же не имеет такой болезни. В общем, есть куда развиваться! Автору спасибо за обзор.
    • 0
      Вообще я с вами согласен, что зависимости должны искаться в том числе в самом проекте, если вообще не в первую очередь там.

      Но я понимаю зачем сделано так как сделано, эти плагины можно добавить в composer.json PHPCI прямо из админки, а потом установить разом для всех проектов, в этом в общем тоже есть своя прелесть, — например предсказуемость версий Behat/PHPUnit/Codeception. Все тестируется в одном окружении.

      К тому же это не совсем уж глобальная установка (хотя глобальная тоже будет работать), а установка зависимостей для плагинов внутри PHPCI. То есть это глобально для всех проектов в PHPCI, но не глобально для сервера в целом.

      В конечном итоге для меня лично это не настолько принципиально оказалось.

    • 0
      Опять же плагины для работы с этими утилитами могут быть завязаны на какие-то требования к версиям этих утилит, а если запускать утилиты непосредственно из проекта, то вполне может получится зоопарк версий и разной степени тяжести конфликты.

      Я бы на месте разработчиков в проекты бы заглядывал, но в самую последнюю очередь, после поиска в PHPCI и глобально)
  • 0
    Очень понравилось, сразу же заюзал, уже даже отправил несколько Pull Request. Но проблема в скудной документации. В частности как заюзать Interpolation? Надо подставлять в файликах номер билда и версию. Правда это можно сделать и средствами самого Mercurial. Какие есть настройки у build_settings? Где это все найти?
    • 0
      Вот здесь на страницах wiki отдельных плагинов в основном есть возможные опции (например для phpunit). Но надежнее посмотреть в исходники плагина, там прямо в конструкторе хорошо видно какие опции берутся из конфига.

      Документации пока мало, это верно, но тот факт что система на писана на PHP меня как раз и радует тем, что я всегда могу в исходниках посмотреть, когда документации не хватает.
      • 0
        Этот листинг функций (не документацию) я уже видел. К сожалению, тоже приходится лазить в исходники. Например, сейчас ищу как научить работать с приватным проектом на bitbucket.
        • 0
          Пока в общем надежнее в исходниках смотреть, тем более что меняются они быстрее чем документация)
  • 0
    Эмм, а сборки из нескольких веток в одну нет? В доке по конфигурации об этом ни слова. Грустно, нужная же штука.
    • 0
      Открыл тикет, посмотрим, что ответят.
      • +1
        правильно сделали :)
      • 0
        Если я вас правильно понял, то есть вот этот реквест. То есть можно будет держать несколькео проектов с разными дефолтными ветками.
        • 0
          Боюсь, неправильно поняли, там суть в том, что они хотят дефолтную ветку для сборки выбирать. А я хочу через запятую указать список веток, чтобы CI их смерджила в одну временную, и поверх нее уже исполнила все таргеты. Это полезно, если у вас есть, допустим, пять feature-веток, и вам их надо постоянно интегрировать.
          • 0
            Ога, понял, такой фичи нет. Там сейчас работа с ветками вообще в довольно зачаточном состоянии и вы правильно сделали, что создали ишью.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.