Мобильная
версия

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, а из файла с настройками, где они смотрятся гораздо лучше.

Теги: #phing, #деплой, #автоматическая сборка

Ваша оценка:

Рейтинг: 9.8 (Оценок: 2)

Комментарий:

Copyright © DOC_tr 2015-2017 г. Все права защищены
Яндекс.Метрика
Перейти к мобильной версии