Практически на всех последних проектах применяем очень полезный и удобный инструмент для деплоя rocketeer

Для тех кто вообще не знаком с инструментами подобного класса - вкратце, это "штука" которая по SSH зайдет на удаленный хост и сделает на нем действия от вашего имени, необходимые для обновления/разворачивания проекта. 

Весь rocketeer собран в 1 большой phar, который предоставляет базовые действия в консоли: deploy, rollback, ignite и некоторые другие. Если вы используете composer - данная модель покажется очень удобной. А если не используйте - срочно начинайте )

Применение

Предположим у вас есть проект, проект конечно-же живет в git (или прости-господи svn), кладете в корень свежескачанный rocketeer.phar

В корне проекта выполняете

php rocketeer.phar ignite

Отвечаете на вопросы, получаете папку .rocketeer в корне проекта, в папке лежат конфиги деплоя.

Рихтуете конфиги напильником при необходимости, обычно все просто и понятно, урл гита, ssh доступ на хост деплоя, куда положить, какие папки проекта "расшарить".

В корне проекта выполняете

php rocketeer.phar deploy

Если все прошло удачно и без проблем (что конечно первый раз бывает редко) то идете по ссш убедиться что проект там развернут в указанной папке

Бинго!

Если все же что-то идет не так - в папке с конфигами есть logs папка, туда сохраняются все журнаты деплоев и для разбора полетов в первую очередь смотреть нужно их.

Image title

Физически rocketeer, используя SSH, заходит на удаленный хост и с него делает git clone. После чего пытается композером установить зависимости и выполнить скрипты, заданные в конфиге.

Нюансы

  • Rocketeer хорошо дружит с composer, потому на сервере он должен быть установлен глобально.
  • Rocketeer вынимает проект из гита, указанной remote ветки, потому что не пушнуто то не задеплоится
  • Rocketeer умеет некоторые папки проекта сделать "расшаренными", это значит что они между деплоями не меняются, удобно для папок аплоада контента, папок логов и тп. Тут нюанс важный, git не создает физически пустые папки при клоне, потому папки которые вы шарите должны содержать хоть один файл

Достоинства rocketeer

  1. Компактный - 1 phar
  2. Из коробки работает с composer
  3. Простой - в целом дефолтный конфиг годится для 90% случаев
  4. Поддерживает несколько окружений, можете деплоить на прод, на стейджинг, на ливтест и все это описывается одним конфигом
  5. Работает на винде. С оговорками

Недостатки rocketeer

  1. Скудная документация, она вроде есть но информации в ней минимум
  2. Однопоточность - если вам нужно задеплоить код на 12 серверов то rocketeer будет делать это строго по очереди и в одном потоке, в итоге абсолютно легко получить время деплоя десятки минут на крупных проектах. Благо что все эти минуты можно просто пить кофе
  3. Что еще хуже, релизные симлинки на версии rocketeer ставит по очереди, задеплоил 1 сервер, обновил на нем релиз, пошел на второй. В итоге у вас проект может 10 минут жить с разными версиями на серверах, что часто недопустимо.
  4. На винде работает не на 100% ) На windows команда ignite работает аж никак, делает вид что создает дефолтные конфиги но по факту не сохраняет, надеюсь скоро исправят, пока приходится руками делать и/или копировать между проектами
  5. Внутри код написан в четком соответствии с названием инструмента, осознать эти rocket-science получается далеко не всегда

Резюме - кому rocketeer подходит:

  1. небольшим проектам на 1-3,4 сервера
  2. проектам у которых версионность кешей завязана на полный путь релиза, и с-но конфликты версий кода маловероятны

Кому не подходит - действительно большим проектам, обычно на таких проектах механизмы автодеплоя идут другими способами

И на последок, пару хитов которые нервы поберегут:

Если используется fpm - нужно делать так, в противном случае opcache не будет подхватывать код новой версии после деплоя:

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

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

'on' => [

        // Stages configurations
        'stages'      => [

        ],
        // Connections configuration
        'connections' => [
            'production' => [
                'env' => 'production',
                'remote' => [
                    'root_directory' => '/home/ubuntu/project/',
                ],
            ]
        ],

    ]

Тут также устанавливается переменная env, к которой потом можно получить доступ в хуках rocketeer, ниже после деплоя накатываются миграции project5

// Tasks to execute after the core Rocketeer Tasks
    'after'  => [
        'setup'   => [],
        'deploy'  => [
            function($task) {

$env = $task->rocketeer->getOption('env');

                $output = $task->runForCurrentRelease('php app/run.php --env='.$env.' propel-migrate');

                $task->toOutput($output);
            }
        ],
        'cleanup' => [],
    ],

Возможности rocketeer очень обширны, надеюсь разработчиков возьмет под крыло кто-то вроде Фабьена и проект получит полную исчерпывающую документацию.