Continuous Delivery — это процесс доставки новых функций, обновлений, исправлений ошибок на сервера максимально быстро и безопасно, с минимальным количеством ручного труда. В данной статье будет рассмотрен пример настройки continuous delivery с помощью Jenkins.
Обычно, разработчики не задумываются о CI на начальных этапах разработки, т.к. процесс выкладки достаточно примитивен, команда разработки не большая и релизы происходят не часто. С ростом проекта увеличивается количество используемых инструментов, растет число серверов, на которых работает приложение, и требуется выполнить намного больше шагов вручную, чтобы выложить новые обновления на продакшен. Это также увеличивает потенциальное число ошибок, которое может допустить разработчик.
В этом случае на помощь приходят системы Continuous Delivery, в которых достаточно однажды настроить процесс выкладки, и затем можно запускать его сколько угодно, что экономит время разработчиков на собственно разработку, и исключает человеческие ошибки в процессе выкладки.
В этой статье будет рассмотрен простейший пример настройки Continuous Delivery с помощью Jenkins — одного из наиболее популярных сервисов для автоматизированной сборки и выкладки проектов.
Установка сервера Jenkins
Для установки Jenkins в Ubuntu потребуется выполнить следующие команды в консоли:
- Добавьте ключ jenkins в систему:
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
- Добавьте следующую строку в ваш /etc/apt/sources.list:
deb https://pkg.jenkins.io/debian-stable binary/
- Обновите список пакетов и установите Jenkins:
sudo apt-get update
sudo apt-get install jenkins
Если вы пользуетесь другой операционной системой, то вы можете найти инструкцию по установке на официальном сайте Jenkins: https://jenkins.io/download/.
После этого Jenkins будет доступен по адресу: http://localhost:8080. Далее нужно указать пароль, расположенный в указанном файле:
Далее будет предложено установить рекомендуемые плагины. Рекомендую установить их, т.к. многие из них действительно полезны, и у вас появится какое-то представление о возможностях, предоставляемых Jenkins.
И на последнем шаге вам нужно создать пользователя для авторизации в Jenkins:
Поздравляю! Вы только что установили Jenkins и можете начать автоматизировать сборку и доставку вашего кода на сервера!
Создание тестового проекта
Создадим новый проект с типом Pipline. Данный тип проекта позволяет разбирать процесс сборки и выкладки на сервера на отдельные этапы, которые можно при необходимости запускать даже параллельно. Это позволяет очень наглядно отобразить процесс сборки, время выполнения на каждом этапе и так далее.
Условимся, что наш код лежит в git-репозитории. Скрипт выкладки будет скачивать код, запускать unit-тесты, чтобы убедится, что наш релиз не ломает существующий код, подключаться на сервер по ssh и обновлять код на сервере.
Для описания этапов сборки используется специальный язык pipline script. Под полем ввода самого скрипта есть ссылка Pipeline Syntax, открыв которую вы увидите все операции доступные в pipline script, а так же удобный генератор, позволяющий создать необходимые операции с помощью форм. Ниже приведен пример такого скрипта, который выполняет функции, описанные в предыдущем параграфе:
node { stage ('Prepare environment') { git branch: 'master', url: 'https://github.com/RusinovIG/unirest-php.git' sh 'composer install --dev' } stage ('Code analyse') { sh 'echo “TODO: Run some lints”' } stage ('Unit tests') { sh 'vendor/bin/phpunit' } stage ('Deploy') { sh 'ssh test@server "cd ~/jenkins/test/ && git pull && composer install"' } }
Настройка выкладки вашего приложения завершена! Теперь на странице созданного pipline нужно запустить первую сборку, нажав на кнопку Build / Собрать сейчас (в зависимости от языковых настроек Jenkins). После успешного выполнения выкладки вы увидите время выполнения каждого этапа:
Вы только что собрали и выкатили код своего проекта на сервер в один клик. Далее можно настроить интеграцию с git, чтобы запускать выкладку кода при каждом новом коммите в ветку master. Таким образом выкладка кода будет полностью автоматизирована.
Поделитесь в комментариях, какими инструментами для Continuous Delivery пользуетесь вы?