четверг, 15 января 2015 г.

Magallanes & Composer

Понадобилось мне прикрутить к проекту инструмент для деплоя. Поскольку я использую php, я остановился на Magallanes. Я работаю через Composer, поэтому делаем так
php composer.phar require "andres-montanez/magallanes:*"
Выносим mage в корень проекта, для этого создаем файл mage следующего содержания:
#!/usr/bin/env php
<?php

$baseDir = __DIR__ . '/vendor/andres-montanez/magallanes';

define('MAGALLANES_VERSION', '1.0.3');
define('MAGALLANES_DIRECTORY', $baseDir);

require_once __DIR__ . '/vendor/autoload.php';

// Clean arguments
array_shift($argv);

// Run Magallanes
$console = new Mage\Console;
$exitCode = $console->run($argv);

exit((integer) $exitCode);
И разрешаем его запускать
chmod +x ./mage
Дальше делаем все по инструкции. Настраиваем проект
mage init --name="My fantastic app" --email="notifications@my.app"
Добавляем конфигурацию для деплоя
mage add environment --name="production" --enableReleases 
Собственно сам деплой
mage deploy to:production
Основные настройки проекта хорошо расписаны на сайте magephp.com, но есть пара моментов, с которыми мне пришлось разбираться.

После деплоя устанавливаем особые разрешения на файлы/папки

Это бывает нужно, чтобы веб-сервер имел право писать скажем логи.
#production
deployment:
  user: vlad
  from: ./
  to: /opt/www/promokashka_com
  excludes:
    - .idea
    - composer.phar
    - mage
    - node_modules
    - web/assets
    - runtime
    - config/_local.php

releases:
  enabled: true
  max: 10
  symlink: current
  directory: releases

hosts:
  - promokashka.com:2222

tasks:
  pre-deploy:
    - composer/install
    - composer/generate-autoload
  on-deploy:
  post-release:
    - filesystem/apply-facls:
        recursive:true
        acl_param: "o:rwx"
        folders: [ runtime, web/assets ]
Для установки разрешений используем команду filesystem/apply-facls.

После деплоя нужно создать символьную ссылку на каталог или файл. 

Может применяться, для линковки конфига с настройками доступа к базе данных.
#production
deployment:
  user: vlad
  from: ./
  to: /opt/www/promokashka_com
  excludes:
    - .idea
    - composer.phar
    - mage
    - node_modules
    - web/assets
    - runtime
    - config/_local.php

releases:
  enabled: true
  max: 10
  symlink: current
  directory: releases

hosts:
  - promokashka.com:2222

tasks:
  pre-deploy:
    - composer/install
    - composer/generate-autoload
  on-deploy:
  post-release:
    - filesystem/apply-facls:
        recursive:true
        acl_param: "o:rwx"
        folders: [ runtime, web/assets ]

    - filesystem/link-shared-files:
        linked_folders:
            - web/assets
            - runtime
        linked_files:
            - config/_local.php
        shared: shared
        linking_strategy: absolute
Тут я прилинковываю каталоги runtime, web/assets и файл config/_local.php

Использованием символьных ссылок для папок assets и runtime и файлов _local.php имеет интересное применение. Фактически это те части приложения, которые будут постоянны для всех релизов (или будут меняться редко). В assets можно хранить объединенные и сжатые версии css & js файлов и ОЧЕНЬ ЖЕЛАТЕЛЬНО чтобы старые версии какое-то время там присутствовали тоже. Каталог runtime часто служит как хранилище для лог файлов и через символьные ссылки лог файлы не будут теряться при деплое нового релиза. Однако для полного счастья нам потребуется механизм работы с этими постоянными данными. В стандартной поставке magallanes его нет, пришлось написать.

<?php
namespace Task;

use Mage\Task\AbstractTask;

class SharedCopy extends AbstractTask
{
    public function getName()
    {
        return 'Deploy shared files';
    }

    public function run()
    {
        $deployToDirectory = $this->getConfig()->deployment('to');
        $files = $this->getParameter('files', []);
        $shared = $this->getParameter('shared', 'shared');
        foreach ($files as $file) {
            $command =
                'scp ' . $this->getConfig()->getHostIdentityFileOption() . '-P ' . $this->getConfig()->getHostPort()
                . ' ' . $file . ' ' . $this->getConfig()->deployment('user') . '@' . $this->getConfig()->getHostName()
                . ':' . $deployToDirectory . '/' . $shared . '/' . preg_replace('/\/([^\/]*)$/', '', $file);
            $this->runCommandLocal($command);
        }

        return true;
    }
}

Применение для сжатых файлов css& js  которые будут лежать в assets
#production
deployment:
  user: vlad
  from: ./
  to: /opt/www/promokashka_com
  excludes:
    - .idea
    - composer.phar
    - mage
    - node_modules
    - web/assets
    - runtime
    - config/_local.php

releases:
  enabled: true
  max: 10
  symlink: current
  directory: releases

hosts:
  - promokashka.com:2222

tasks:
  pre-deploy:
    - composer/install
    - composer/generate-autoload
  on-deploy:
  post-release:
    - filesystem/link-shared-files:
        linked_folders:
            - web/assets
            - runtime
        linked_files:
            - config/_local.php
        shared: shared
        linking_strategy: absolute

    - shared-copy:
        files:
            - web/assets/all*
Однако это не будет работать, если магелан подключен через composer, нужно подправить автолоадинг composer'а
добавляем в composer.json 
    "autoload": {
        "psr-4":{ "Task\\" : ".mage/tasks"}
    }
и обновляемся командов 
php composer.phar update

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

Отправить комментарий