Phing. Автоматическая сборка проекта

Если вам надоело каждый раз при деплое проекта выполнять однообразные команды типа git clone, php install.php, подключаться к серверу по ftp/ssh и выполнять разные скрипты непосредственно на нем, то вам определенно нужна автоматическая сборка проекта.

Именно о такой сборке средствами Phing я и хочу сегодня поговорить.

Phing – система сборки проектов для PHP, использующая для сборки XML сценарий.
Его плюсы

  • Простой XML сценарий для сборки
  • Огромный набор инструментов для разных задач
  • Легко расширяемая система с помощью классов PHP
  • Кроссплатформенный – работает на UNIX, Windows, Mac OSX
  • Не требует внешних зависимостей
  • Разработан для PHP

Ну что ж, разберемся что это за зверь и с чем его едят.

Установка

Начинается все с достаточно просто установки.

PEAR

$ pear channel-discover pear.phing.info
$ pear install [--alldeps] phing/phing

Composer 

{
    "require-dev": {
        "phing/phing": "2.*"
    }
}

После установки мы можем его запустить набрав в командной строке

$ phing

Теперь приступим к настройке – phing использует сценарий XML, который описывается в файле build.xml

Настройка

Структура файла следующая

  1. Корневой тэг – в нем описывается название проекта, базовая директория, и задание, выполняющееся первым. Содержит в себе весь проект
  2. Настройки – логины, пароли, и все все все
  3. Задание – в нем описывается название задание, и зависимости от других заданий. Содержит в себе команды для выполнения
  4. Сами команды – Выполняют какое либо действие будь то клонирование репозитория, или простой вывод сообщения.

В начале разметим структуру нашего build.xml

<project name="make_project" basedir="/var/www/flash" default="build">
    <property file="build.properties" />

    <target name="build">

        <!-- Команды для выполнения -->

    </target>
</project>

Как видите – в первой строке мы задали название проекта (name), базовую директорию, из которой будут выполняться все действия (basedir) и задание, которое будет выполнено первым (default)

После этого мы загружаем файл с настройками (о установке настроек – позже), и создаем первое задание с названием build

Теперь, перейдя в директорию с нашим файлом, и запустив phing мы увидим следующее

Buildfile: /var/www/flash/build.xml
Warning: target 'build' has no tasks or dependencies
 [property] Loading /var/www/flash/build.properties
 [property] Unable to find property file: /var/www/flash/build.properties1... skipped

make_project > build:


BUILD FINISHED

Total time: 0.0345 seconds

Супер – все работает.
Первый warning сообщает нам о том что заданий в цели build не найдено, а второй сообщает о том, что файл с настройками не может быть загружен. Попробуем исправить.
Для начала создадим какое нибудь задание. Пусть просто выводит стандартное сообщение – Hello World!

<project name="make_project" basedir="/var/www/flash" default="build">
    <property file="build.properties" />

    <target name="build">

        <echo>Hello world!</echo>

    </target>
</project>

Хорошо, теперь у нас в выводе убралась строчка с предупреждением, и добавилась надпись

    [echo] Hello World!

Но ведь для таких бесполезных целей Phing нам не нужен. Он должен выполнять свое назначение – автоматическую сборку проектов.

Чаще всего развертывание проекта происходит на удаленном сервере, и именно но это я и сделаю упор в данной статье. Основной таск с которым мы будем работать – SshTask

Рассмотрим пример моего рабочего проекта – нам необходимо подключиться по ssh, и выгрузить определенную ветку на хост.
Вроде ничего сложного.

Для начала поговорим о переменных в Phing. Они объявляются следующим образом

<property name="LOGIN" value="admin"/>

Тут все достаточно просто – название переменной и ее значение.

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

В динамическом заполнении переменных нам поможет таск PropertyPromtTask. Объявляется он следующим образом

<propertyprompt propertyName="SSH.LOGIN" promptText="Введите логин SSH" />

Если теперь запустить сборку то мы увидим следующее

Введите логин SSH [] ?

Теперь Phing ожидает пока мы введем логин, после чего он занесет наши данные в переменную SSH.LOGIN
Для того чтобы задать значение по умолчанию, мы должны установить атрибут defaultValue

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

<property name="GIT_URL" value="git://git.ru"/>
<property name="EXPORTDIR" value="/var/www/"/>
<property name="HOST" value="site.ru"/>
<property name="DEBUG" value="false"/>
  • GIT_URL – адрес репозитория
  • EXPORTDIR – путь до места, куда будем клонировать
  • HOST – хост для подключения по ssh
  • DEBUG – отладка (ниже опишу более подробно)

В цели build получим все необходимые данные

<property name="GIT_URL" value="git://git.ru"/>
<property name="EXPORTDIR" value="/var/www/"/>
<property name="HOST" value="site.ru"/>
<property name="DEBUG" value="false"/>

<target name="build">

    <!-- Ввод данных авторизаций -->
    <echo>Доступы SSH</echo>
    <propertyprompt propertyName="SSH.LOGIN" promptText="Введите логин SSH"/>
    <propertyprompt propertyName="SSH.PASSWORD" promptText="Введите пароль SSH"/>
    <echo>Доступы GIT</echo>
    <propertyprompt propertyName="GIT.LOGIN" promptText="Введите логин GIT"/>
    <propertyprompt propertyName="GIT.PASSWORD" promptText="Введите пароль GIT"/>
    <echo>Ветка для выгрузки</echo>
    <propertyprompt propertyName="REVISION" promptText="Введите ветку" defaultValue="master"/>

</target>

И, наконец, выгрузим проект

<!-- Собираем и выгружаем проект -->
<echo>Клонируем репозиторий (ветка ${REVISION})</echo>
<ssh username="${SSH.LOGIN}" password="${SSH.PASSWORD}" host="${HOST}" command="

    rm -rf ${EXPORTDIR};
    git clone https://${GIT.LOGIN}:${GIT.PASSWORD}@${GIT_URL} -b ${REVISION} ${EXPORTDIR};
    rm -rf ${EXPORTDIR}.git;

" display="${DEBUG}" />

Вот мы и подошли к SshTask. Он принимает следующие параметры

  • username – имя пользователя
  • password – пароль
  • host – адрес для подключения
  • command – команда для выполнения (если их несколько, то нужно разделять 😉
  • display – выводить на экран вывод выполненных команд (дебаг)

Вот и все – мы только что выгрузили репозиторий с помощью простой команды – phing

У Phing есть множество тасков, в том числе и GitCloneTask, но я сознательно использую SshTask, так как он работает в несколько раз быстрее.

Конфигурация

Мы совсем забыли про наш файл с конфигурациями, а зря. Вед если конфигов будет много, то их будет очень неудобно хранить, редактировать и просматривать в файле build.xml
Именно поэтому я как и обещал разберу загрузку конфигураций из файла на примере нашего кода.
Мы уже задали 4 переменных, и теперь надо их перенести в файл конфигов.

Для начала создадим его – build.properties

Теперь вместо наших 4 строк добавим в начало

<property file="build.properties" />

Атрибут file указывает на то, что параметры следует брать из файла.
Конфиги же, лежат в этом файле в формате

ключ1 = значение1
ключ2 = значение2
....
ключN = значениеN

Теперь заполним этот файл нашими данными

# настройки по умолчанию
DEBUG = false
EXPORTDIR = /var/www/
HOST = site.ru
GIT_URL = git://git.ru

Вот и все – теперь переменные будут подтягиваться не из build.xml, а из файла с настройками, где они смотрятся гораздо лучше.

[Всего голосов: 0    Средний: 0/5]

Добавить комментарий

Ваш e-mail не будет опубликован.