Статьи

Ускоренный курс: непрерывное развертывание с семафором CI

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

Семафор CI логотип

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

Начиная

Мы можем легко загрузить наши файлы на сервер с помощью настольного клиента с открытым исходным кодом, такого как Filezilla. Те, кто использовал это, знают, что этот процесс является громоздким и раздражающим, поскольку он не позволяет нам автоматизировать процесс развертывания, и мы всегда заканчиваем тем, что загружаем весь проект, даже если мы изменили только его часть. В качестве альтернативы, мы могли бы сделать git pull на сервере, и наше приложение мгновенно перешло в последнее состояние, но этот рабочий процесс не работает в современном мире, где мы должны постоянно поставлять программное обеспечение нашим конечным пользователям без ошибок.

В этой статье мы рассмотрим процесс развертывания приложения Laravel на сервере Digital Ocean через конвейер непрерывной доставки с использованием Semaphore . Исходный код приложения присутствует на Github .

Создать проект на семафор

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

Создать проект

Затем мы должны выбрать учетную запись, в которой находится наш репозиторий. Если вы не подключили своего поставщика репозитория исходного кода к семафору, вы можете сделать это на этом шаге. Семафор изначально поддерживает Bitbucket и Github.

Выберите аккаунт

Если вы подписали вышеупомянутое репо, вы можете выбрать его на этом шаге:

Выберите репозиторий

Мы выберем master ветку для нашего случая:

Выберите филиал

Как только мы выберем ветку, Семафор начнет анализировать проект.

Анализ проекта

Семафор попытается клонировать репозиторий на своем сервере и получить метаинформацию, чтобы начать работу. Для нашего примера проекта была определена следующая метаинформация:

Результат после анализа проекта

Мы выберем версию PHP 7 в качестве нашей предпочтительной версии PHP и продолжим.

Настроить сборки

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

Наша первая сборка

После настройки соответствующих настроек, мы можем нажать Build на экране выше. Ход сборки будет напечатан на экране.

Build Progress

К сожалению! Наша сборка не проходит из-за неудачных тестов. Это указывает на проблему с нашим кодом.

Ошибка сборки

В этом случае проблема заключается в конфигурации нашей сборки. Типичное приложение Laravel требует файла среды в корне с необходимыми параметрами конфигурации. Мы еще не настроили файл в нашем проекте. Давайте создадим файл среды в корне нашего проекта.

Перейдите в Настройки проекта -> Файлы конфигурации и создайте файл среды для нашего проекта следующим образом:

Файл конфигурации

Мы можем либо перейти в основную ветку, либо пересобрать из самого пользовательского интерфейса Семафора, чтобы снова начать процесс сборки. Сейчас мы начнем перестройку с самого интерфейса, нажав кнопку «Перестроить» справа от последней неудачной сборки.

Перестройка из пользовательского интерфейса

Семафор начнет перестройку нашего репозитория, установив необходимые зависимости и запустив тесты с помощью PHPUnit . Мы видим, что наша сборка успешно проходит.

Сборка пройдена

Распараллелить ваши сборки

Массовые тестовые группы — это факт любого проекта выше среднего размера. Недостатком такого впечатляющего покрытия тестов является то, что для сборки требуется огромное количество времени. В таких сценариях распараллеливание необходимо.

Основы, лежащие в основе распараллеливания, заключаются в том, чтобы разделить наши тестовые наборы на более мелкие группы, которые можно выполнять параллельно. Вы можете разделить на группы на основе аналогичных функциональных требований или независимых служб или любого другого логического параметра, который лучше всего подходит для вашего проекта. Я бы предпочел сгруппировать их в схожие функциональные требования.

В нашем приложении я написал два простых тестовых класса для страницы входа и страницы регистрации . Давайте запустим параллельные тестовые сборки в семафоре. Ниже приведен код для этих двух тестов:

 #LoginTest.php class LoginTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testLoginPage() { $this->visit('/login') ->see('Login Now'); } } в систему #LoginTest.php class LoginTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testLoginPage() { $this->visit('/login') ->see('Login Now'); } } 
 //RegisterTest.php class RegisterTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testRegisterPage() { $this->visit('/register') ->see('Register Now'); } } 

Теперь мы можем настроить параллельное задание в наших настройках сборки для запуска этих двух тестов по отдельности. Вы можете узнать больше о конфигурации параллельных тестов в документации Семафор .

Настройки сборки параллельных заданий

Давайте перейдем к master branch чтобы запустить процесс сборки.

 git push origin master 

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

Параллельные сборки

Наши тесты выполняются параллельно, как показано на скриншоте выше.

Непрерывное развертывание

Наконец, давайте настроим процесс развертывания для нашего проекта. Мы развернем наш репозиторий на сервере Digital Ocean (убедитесь, что вы настроили Droplet с сервером, указанным на home/USER/default прежде чем продолжить — хорошее руководство здесь ). Давайте пройдемся по каждому из шагов:

Мы выберем вариант общего развертывания, так как будем запускать собственные команды для развертывания.

Выберите Развертывание

Мы можем выбрать «Автоматически» или «Вручную» для стратегии развертывания. Мы выберем «Автоматическое развертывание». Это будет запускать автоматическое развертывание всякий раз, когда мы отправляемся в нашу master ветку и проходим сборку.

Автоматическое развертывание

Здесь нам нужно выбрать ветку, которую мы хотим развернуть. Мы выберем master ветку.

Отделение развертывания

Мы введем наши пользовательские команды развертывания, которые мы хотим, чтобы Semaphore выполнил для нас. Первая команда собирает открытые ключи хоста SSH наших серверов, чтобы избежать запроса авторизации во время развертывания.

Команды развертывания

Вставьте закрытый ключ вашего пользователя развертывания в текстовую область, указанную ниже. Это позволит Semaphore получить доступ к нашему серверу Digital Ocean и выполнить команды развертывания.

Закрытый ключ для сервера

Введите желаемое имя сервера и продолжайте:

Имя сервера

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

Первое развертывание

Поздравляем! Первое развертывание было завершено без ошибок.

Развертывание прошло успешно

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

Сайт развернут

Примечание . В случае сбоя сборки любое развертывание, настроенное для запуска на ваших серверах, не будет запущено. Развертывание запускается только после успешной сборки.

Отныне, когда вы переходите в основную ветку, Semaphore будет создавать ваш проект, запускать ваши тесты и автоматически развертываться. Давайте сделаем тестовый толчок и посмотрим процесс.

Автоматическая сборка и развертывание

Наш проект был успешно построен и развернут на нашем сервере.

Альтернативы с открытым исходным кодом

Семафор является платным сервисом, но дает хорошую отдачу. Если оплата за CD сейчас не входит в ваш бюджет, Gitlab — это альтернатива платформе Semaphore с открытым исходным кодом. Функциональность более или менее идентична, но недостатком является то, что вам нужно все настроить вручную, а производительность может быть серьезной проблемой.

Вывод

Теперь у нас есть приложение PHP, развернутое на сервере Digital Ocean с непрерывным конвейером доставки. Всякий раз, когда вы нажимаете на определенную ветку или кто-то отправляет запрос на извлечение, сборка запускается автоматически. Семафор позаботится обо всех неприятностях и сообщит вам статус вашей сборки.

Обратите внимание, что это всего лишь простой вводный курс по перечисленным выше понятиям — создание ресурсов, таких как JS и CSS, и развертывание с нулевым временем простоя также возможно как с семафорами, так и с пользовательскими решениями, и об этом мы расскажем в следующем посте. В то же время, вы можете заглянуть в наш прошлый урок о Deployer — инструменте, который может помочь вышеуказанному стеку в достижении этого.

Как вы разворачиваете свои проекты PHP? Вы использовали семафор? Как вы к этому относитесь? Использование каких-либо других бесплатных или платных альтернатив? Дайте нам знать!