Vagrant — единое окружение для разработки

Преамбула

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

В современном мире WEB-разработки, разработчики уже давно перестали устанавливать окружение для разработки: PHP, WEB-сервер, СУБД и т.д. на свой локальный компьютер, на котором производят разработку.

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

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

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

В четвертых, состояние окружения вашего рабочего компьютера скорее всего не совпадает и не может совпадать с состоянием окружения вашего боевого (продакшн) сервера. Ведь у вас же Windows со всеми его причудами в конфигурировании, а на боевом сервере что-то однозначно другое.

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

Избежать этого хаоса вам поможет виртуализация окружения разработки. Вам нужна виртуальная машина, которая бы разворачивалась по заданному вами сценарию, чтобы ее можно было развернуть одним кликом на любом компьютере под любой операционной системой. Пока вы будете пить кофе, ваша виртуальная машина будет готова. Также вам нужны какие-то средства для быстрого и простого управления такой виртуальной машиной (запуск, остановка, реконфигурация). И еще было бы здорово, если бы в файловой системе этой виртуальной машины был каталог, который отображался с каталога вашей локальной машины. Например, чтобы каталог локальной машины D:\myProjects, где хранятся ваши проекты, соответствовал каталогу виртуальной машины /var/myProjects или подобному. Еще хотелось бы иметь возможность выполнять настоящую отладку с использованием PHP-xDebug, причем приложение должно выполняться в виртуальной среде, на виртуальной машине, а управлять им вы могли с локальной. Уже нравится? Идем дальше!

Vagrant

Всего этого и много чего еще можно добиться используя виртуализацию с использованием Vagrant. О Vagrant в интернете написано очень много. Смысла дублировать здесь никакого нет, иначе статья будет не мини, как обещалось в начале, а макси.

Скажу лишь несколько слов. Vagrant — это надстройка над гипервизорами (виртуальными машинами), такими как vmWare, VirtualBox, Parallels и другими. Для Vagrant существуют готовые образы операционных систем, называемых «коробками» (boxes). Часто авторы коробок собирают их для поддержки в разных гипервизорах. Мне по душе гипервизор VirtualBox, потому что я начал работать с Vagrant еще тогда, когда поддерживался только он, да и до сих пор больше всего коробок выпускаются именно под VirtualBox. Сейчас же вы можете выбрать гипервизор на свой вкус, главное, чтобы он поддерживался той коробкой, которую вы собираетесь использовать.

Использование Vagrant решает проблему идентичности состояния окружения разработки, не зависимо от операционной системы на хост-машине (так называется ваш локальный компьютер). Гостевая операционная система, выполняемая на виртуальной машине, всегда будет одна и также. К сожалению, Vagrant рассчитан только на обеспечения идентичности состояния при разработке. На сервер невозможно установить Vagrant (точнее, конечно, возможно, но лучше этого не делать), так как виртуализация с использованием Vagrant работает на уровне виртуальной машины, что, очевидно, не подходит для продакшена. Оставлю здесь для себя и для вас небольшую ремарку: о том, как добиться идентичности состояния при разработке и в продакшене я (когда нибудь) напишу отдельную статью про Docker.

Чтобы развернуть коробку в виртуальную машину, нужен файл конфигурации, в котором описаны все параметры развертывания. Такой файл называется Vagrantfile и написан он с применением синтаксиса Ruby (на котором и написан Vagrant). Я не стану заставлять вас писать такой файл вручную. Чаще всего вы можете найти уже готовый файл в описании установки вашей коробки, в который нужно внести руками лишь некоторые изменения. Но все это индивидуально для каждой коробке. В любом случае Вы найдете инструкции по развертыванию виртуальной машины на ее основе в инструкциях к ней. На всякий случай еще раз повторю ссылку на хранилище коробок.

Как установить и попробовать

Устанавливаем

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

Давайте для начала, чтобы уж точно всё получилось, остановимся на гипервизоре VirtualBox. Это замечательный бесплатный гипервизор от Oracle, который очень быстро и просто устанавливается и сразу же работает без танцев с бубном.

Перед тем как начать установку, убедитесь, что путь к вашей домашней папки, а также путь к файлам ваших проектов не содержат кириллических символов. Если всё же кириллические символы есть, то нужно создать два каталога, например D:\VagrantHome и D:\VirtualBoxMachines. В первом будут находиться файлы Vagrant, а во втором файлы виртуальных машин VirtualBox. Теперь создайте переменную окружения с именем VAGRANT_HOME и значением D:\VagrantHome. Перезагрузитесь.

Теперь можно скачать и установить VirtualBox. После установки откройте окно приложения и перейдите в Файл—Настройки—Общие. Если вы создавали каталог, подобный D:\VirtualBoxMachines, то укажите путь к нему здесь, где «Папка для машин по умолчанию». После этого окно приложения можно закрыть.

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

Последнее, что пригодится — это git. Это клиент, необходимый для работы с системой контроля версий git. Если вы еще не знакомы с этим, обязательно ознакомьтесь, зачем это и для чего. Вам понравится.

Во время установки будьте осторожны. Раз уж мы с вами разрабатываем на PHP, то наши файлы не зависимо от операционной системы должны иметь окончания строк вида \n или LF. Это значит, что нам не нужно автоматически преобразовывать концы строк в файлах нашего исходного кода. Поэтому во время установки git, когда будет предложено выбрать, как обрабатывать окончания строк на экране установки «Configuring the line ending conversions», выбирайте второй вариант «Checkout as-is, commit Unix-style line endings.» и git не будет изменять окончания строк в \r\n, как это принято для разработки в других языках программирования.

Описанные процедуры были больше для Windows, однако вы можете точно так же установить VirtualBox и Vagrant в других операционных системах. Смысл тот же.

Разбираемся в коробках

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

Одна виртуальная машина на один проект

Если Вы разрабатываете (или только хоттите начать разрабатывать) на фреймворке Yii2, то шаблоны приложений (базовый и расширенный) уже содержат файл конфигурации Vagrantfile, который использует коробку bento/ubuntu-16.04. Вся конфигурация: развертывание (provision), конфигурация nginx и конфигурация самой виртуальной машины описаны в различных файлах, находящихся в каталоге vagrant в корне приложения.

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

В файле Vagrantfile вы найдете параметр config.vm.synced_folder, который указывает каталоги для отображения (синхронизации). В данном случае, текущий каталог хост-машины (вашего компьютера) отображается на каталог /app на виртуальной. Все файлы, которые находятся у вас в текущем каталоге, также незамедлительно доступны на виртуальной машине в каталоге /app.

Если в Вашем проекте появляется необходимость в использовании нового расширения PHP, либо в какой-то другой зависимости, то вам достаточно добавить ее в файл vagrant/provision/once-as-root.sh, который представляет собой сценарий установки и настройки виртуальной машины. Как только Вы это сделаете и отправите измененный файл в репозиторий — ваши коллеги получат все эти изменения и введя всего одну команду перенастроят свои виртуальные машины. Таким образом вам не придется рассказывать и запоминать что куда установить и как настроить — все сохранено в сценариях автоматического развертывания виртуальной машины.

Одна виртуальная машина на все проекты

Еще один способ использования виртуализации — использовать одну виртуальную машину для всех ваших проектов. Именно такой подход применен в отдельной виртуальной машине от авторов Laravel, которая называется Homestead. Стоит отметить, что Homestead также может быть развернута в качестве виртуальной машины для одного проекта, подобно описанному выше варианту, но мы ниже рассмотрим именно вариант использования одной машины для всех проектов. Как запустить Homestead для одного проекта, читайте в документации.

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

Чтобы воспользоваться данной коробкой, вам необходимо загрузить файлы из репозитория и создать пару RSA-ключей (открытый и закрытый).

Работу именно с Homestead мы рассмотрим далее как пример.

Другие

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

Пробуем

Итак. VirtualBox и Vagrant у нас установлены. Теперь пришло время начать их использовать. Мы договорились, что будем использовать коробку Laravel/Homestead. Инструкция по ее развертыванию доступна здесь. Я же дальше опишу простые шаги.

Еще раз договоримся, что все наши проекты красиво лежат в каталоге D:\myProjects, разложенные по папочкам. Именно на этот каталог мы будем опираться далее. Вы же должны заменить его на свой.

Далее необходимо будет вводить команды в командную строку. Однако, я рекомендую использовать вместо привычной командной строки интерпретатор git-bash, который идет в комплекте с git под Windows. Запустите его и перейдите в каталог с проектами, выполнив команду

cd /D/myProjects

(обратите внимание на слеши на путь с использованием буквы диска). Теперь необходимо сначала скачать саму коробку, а затем скачать с репозитория набор конфигурационных файлов развертывания для нее. Выполняем:

vagrant box add laravel/homestead
git clone https://github.com/laravel/homestead.git Homestead

Итак, коробка загружена, конфигурация тоже. Теперь необходимо запустить инициализацию этой конфигурации (скрипт просто скопирует файлы на свои места). Затем установим плагин, позволяющий автоматически управлять host-файлом на вашей локальной машине. Выполните:

cd Homestead
git checkout v5.4.0
./init.sh
vagrant plugin install vagrant-hostmanager

После этого в вашем домашнем каталоге должен появиться каталог .homestead, содержащий файл Homestead.yaml — это конфигурационный файл в формате YAML, который вы должны открыть любым редактором кода и отредактировать. Давайте посмотрим, что там внутри. Я покажу уже отредактированный файл, который использую я в тестовой конфигурации. Вы же можете обратиться к документации по конфигурированию Homestead для более подробной информации.

---
ip: "192.168.22.2"
memory: 2048
cpus: 2
provider: virtualbox

folders:
    - map: d:\myProjects
      to: /home/vagrant/www

sites:
    - map: hmvc.app
      to: /home/vagrant/www/hmvc/public
    - map: yiibasic.app
      to: /home/vagrant/www/yii2basic/web

databases:
    - homestead

Здесь видно, что IP адрес виртуальной машины 192.168.22.2, ей выделено 2 Гб ОЗУ и 2 ядра процессора. Провайдер (гипервизор) — VirtualBox.

Далее следует список каталогов локальной системы folders, отображаемых на каталоги виртуальной машины. У меня такой один — каталог d:\myProjects (указан в директиве map) отображается на каталог /home/vagrant/www (указан в директиве to) внутри виртуальной машины. То есть все файлы и каталоги внутри него будут автоматически доступны внутри виртуальной машины по указанному пути.

Далее список сайтов sites. Указывается URL сайта в директиве map, а также путь к корневому каталогу этого сайта внутри виртуальной машины в директиве to.

В самом низу примера — базы данных databases. Я использую одну базу данных с именем homestead.

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

После того, как конфигурационный файл составлен, просто запускаем виртуальную машину. Возвращаемся в интерпретатор git-bash и, находясь в каталоге /D/myProjects/Homestead выполняем команду vagrant up.

Первый запуск этой команды приведет к развертыванию виртуальной машины из коробки и конфигурированию ее согласно файлам конфигурации. Чтобы остановить виртуальную машину, находясь в каталоге /D/myProjects/Homestead, выполните vagrant halt. Последующие запуски виртуальной машины будут происходить значительно быстрее, так как уже будет готовый образ виртуальной машины, развернутый из коробки и настроенный.

Если вы что либо меняете в файле конфигурации, то достаточно запустить развертывание принудительно, выполнив команду vagrant provision. Все изменения в конфигурации будут применены к текущей виртуальной машине.

Homestead позволяет легко производить конфигурирование сайтов, добавлять задачи в планировщик, выполнять проброс портов и много чего еще. Чтобы узнать об этом подробней, обратитесь к официальной документации.

Глобальный доступ для управления Homestead

Так как описанный способ использования виртуальной машины Homestead подразумевает глобальную установку для использования всеми проектами на локальной машине, то хотелось бы иметь возможность управления данной виртуальной машиной не из каталога d:\myProjects\Homestead, а из любого места.

Это очень легко настроить. Обратитесь к данному пункту документации, чтобы узнать как это сделать для разных операционных систем.

Заключение

Использование виртуальных машин в разработке WEB-приложений значительно экономит время и силы для настройки окружения и поддержания его в актуальном состоянии на нескольких рабочих станциях. Разработчик не тратит время на настройку веб-сервера под Windows, которая иногда требует шаманского опыта и не тратит нервы на устранение непрекращаемого потока ошибок. Особенно, если вы только что решили, что хотите начать заниматься разработкой, вам не стоит тратить нервы на развертывание окружения в Windows.

Разница в потребляемых ресурсах виртуальной машины и того варианта, если бы вы развернули окружение локально в Windows, стремится к нулю. Удобство от использования виртуальной машины стремится к максимуму. Дополнительным опытом при использовании такого способа разработки будет пассивное изучение нормальных операционных систем, вроде Debian или Ubuntu.

Манипуляции с виртуальными машинами производятся либо через командную строку, либо через нажимание кнопочек в IDE PhpStorm (в меню Tools-Vagrant). Основные команды управления:

vagrant up — запускает виртуальную машину. Если виртуальная машина еще не построена, то сначала строит ее (при необходимости скачивает образ коробки).

vagrant halt — останавливает виртуальную машину.

vagrant reload — перезагружает виртуальную машину.

vagrant ssh — открывает ssh соединение с виртуальной машиной.

vagrant provision — производит перепостроение виртуальной машины (например, если изменили файлы конфигурации).

Остальные команды можно узнать введя vagrant help.

Удачного использования!

Vagrant — единое окружение для разработки: 3 комментария

Добавить комментарий