Горячее развертывание приложений для Vagrant

Обратите внимание: хотя в этом вопросе я упоминаю Gradle/Groovy, это касается исключительно использования Vagrant и может также легко применяться к любой другой системе языка / сборки.

Я новичок в Vagrant и пытаюсь выяснить, как Vagrantfile s, когда их подталкивают к управлению исходным кодом, взаимодействуют со сборкой этого репо.

Скажем, у меня есть следующий репо, построенный Gradle:

src/
    main/
        groovy/
            <lots of groovy source>
    test/
        groovy/
            <lots of groovy test source>
build.gradle
settings.gradle

Теперь скажем, что без Vagrant я бы обычно клонировал этот репо и запускал gradle clean build запускать модульные тесты кода и, в конечном итоге, упаковать его в работающую программу (исполняемый файл JAR). Затем gradle run запускает приложение

Ну, во многих репозиториях GitHub я вижу Vagrantfile s совершено Поэтому очевидно, что это облегчает раскрутку виртуальной машины и запуск соответствующего приложения внутри. Я пытаюсь выяснить типичный "поток" включения Vagrantfile в мой репо выше, так что разработчики могут:

  1. Клон репо
  2. Сборка с Gradle
  3. Каким-то образом развернуть в Vagrant box
  4. Протестируйте работающий экземпляр приложения (работает внутри коробки)
  5. Настройте код} #4, #5 и #6 быстрых / быстрых циклов dev-test-tweak с использованием горячих повторных развертываний
  6. Re-тест

Взгляни на это Vagrantfile для сервера CAS (выбирается случайным образом). Я думаю, что именно здесь происходит волшебство с точки зрения развертывания и перезапуска сервера на коробке, но я проверил документы Vagrant для shell.inline и ничего конкретного не подошло.

Поэтому я спрашиваю: как мне "интегрировать" мой Vagrantfile с моей сборкой, такой, что сборка создает развернутое работающее приложение? Кроме того, как выглядят мои циклы запуска / развертывания-тестирования-повторного развертывания с блоками Vagrant (что я называю " горячим развертыванием ")?

1 ответ

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

ТЛ; др; Перейдите к разделу Создание Vagrantfile, если вы уже знакомы с тем, как работает Vagrantfile.

Давайте начнем с того, что делает пример Vagrantfile.

config.vm.box = "puppetlabs/centos-6.5-64-puppet"

Это говорит Vagrant, чтобы вытащить коробку, на которой все остальное построено. В Vagrant Cloud вы можете найти множество официальных и общественных материалов. Это из Puppetlabs, на базе 64-битной CentOS 6.5 с уже установленной Puppet.

config.vm.network "forwarded_port", guest: 8080, host: 8088

Это говорит Vagrant переадресовать порт 8088 на вашем хосте на 8080 на Vagrant box. Таким образом, доступ к http://127.0.0.1:8088/ на вашем хосте позволит получить доступ к порту 8080 на гостевой.

config.vm.provision :shell do |shell|

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

shell.inline = "command;
                command;"

Shell inline отправляет эти команды, разделенные точкой с запятой, в поле. Это делается для автоматизации команд, как если бы вы сами вводили их в сеансе SSH. У Vagrant Docs на Shell Provisioning есть несколько более продвинутых применений, где вы можете определить фактический файл для выполнения. Примечание. Ваш сценарий оболочки не должен пытаться запускать инструменты, которые еще не были установлены. (например, запуск сценария Python, где Python еще не доступен).

config.vm.provision "puppet" do |puppet|

Я не могу много комментировать раздел Puppet, так как я не пользователь Puppet (пока, наверное). Это установка некоторых значений Puppet.

shell.inline = "cd /vagrant && mvn clean package;
                  sudo cp target/cas.war /srv/tomcat/cas/webapps/;
                  sudo /sbin/service tomcat-cas restart"

Это также выполняет команды оболочки. В основном изменение каталога, очистка, копирование cas.war в каталог webapps, а затем перезапуск службы. Подробнее о /vagrant Общая папка позже. Теперь у нас достаточно, чтобы начать создавать собственный файл Vagrant. Я собираюсь сделать образец простым, чтобы сделать его общим.

Создание Vagrantfile

Скорее всего, вы захотите использовать Vagrant box, который уже соответствует вашим требованиям, но пока не будем этого делать. Однако вы можете найти множество уже созданных блоков в Vagrant Cloud. Я собираюсь показать вам, как получить (очень) простое приложение Python, работающее с использованием Flask.

  1. Выберите ваш любимый дистрибутив из доступных коробок Vagrant. Я собираюсь использовать ubuntu/trusty64 так как я использую это ежедневно. Все команды должны быть легко переведены в другие дистрибутивы.
  2. Создайте новый каталог для вашего проекта и откройте в нем окно оболочки / консоли.
  3. Используя консоль, инициализируйте ваш Vagrant box vagrant init ubuntu/trusty64, Это создаст базовый Vagrantfile для вас работать.
  4. Откройте свой Vagrantfile и раскомментируйте config.vm.network "forwarded_port", guest: 5000, host: 8080, Мы хотим, чтобы порт 8080 перенес нас в порт 5000 на гостевой машине. Совет: для вашего проекта будет разумно выбрать порт, который, скорее всего, еще не используется, чтобы избежать конфликтов с другими приложениями. 8080 может быть плохим выбором, 8089 будет лучше.
  5. Давайте добавим несколько скриптов для выполнения при подготовке. Поскольку Python поставляется с Ubuntu (и большинством других, которые я знаю), нам не нужно устанавливать Python, но нам нужны pip (менеджер пакетов Python) и Flask.

    config.vm.provision :shell do |shell|
        shell.inline = "cd /vagrant;
            sudo apt-get -y install python-pip;
            sudo pip install Flask;"
    end
    

    Это изменит каталог на общий ресурс Vagrant. Установите pip с помощью менеджера пакетов Ubuntu, затем установите Flask с помощью pip. Флаг -y автоматически устанавливает apt-get без запроса ответа "да / нет". Вам может понадобиться запустить Vagrant up --provision пару раз, чтобы все ваши команды были на 100% правильными.

    Примечание к общему ресурсу Vagrant. Общий ресурс Vagrant - это каталог, который синхронизируется между хостом и гостевым компьютером и будет доступен в /vagrant, Он включает в себя все файлы и каталоги в каталоге вашего проекта (где находится ваш Vagrantfile).

  6. Теперь у нас есть все инструменты, необходимые для запуска нашего приложения. В качестве примера я создал невероятно простое приложение Flask. Загрузите его в каталог вашего проекта из этого Gist и назовите его app.py

  7. Теперь мы сможем запустить приложение Python, расположенное в каталоге вашего проекта. Мне нравится держать разделы установки и работающие разделы отдельно. Так что добавьте еще один раздел, который запускает приложение. Примечание: & заставляет приложение разворачиваться в фоновом режиме, поэтому vagrant up можно завершить. Возможно, вы захотите сделать что-то более необычное, чем это с вашим приложением.

    config.vm.provision :shell do |shell|
      shell.inline = "/vagrant/app.py &"
    end
    
  8. Наконец, мы можем начать все, и Vagrant сделает свою магию. В вашей консоли, в каталоге вашего проекта (где находится ваш файл Vagrant). Бежать vagrant up,

  9. Момент истины. Откройте браузер (на хосте) и перейдите по http://127.0.0.1:8080/. Тебе следует увидеть Hello Vagrant Provisioned World!,

Это заботится о предоставлении вашего приложения. Автоматически, из Vagrantfile, который вы можете зафиксировать с помощью своего кода проекта.

Теперь, чтобы добраться до ваших начальных шагов, и как это вписывается.

Интеграция в ваш рабочий процесс разработки

Я перечисляю ваши шаги, интегрированные с Vagrant.

  1. Клонирование репозитория Этот шаг остается тем же, за исключением Vagrantfile, включенного в репозиторий, с предоставлением необходимых библиотек и инструментов, необходимых для вашего проекта.
  2. Бежать vagrant up в каталоге проекта. Это автоматически создаст и предоставит коробку и поделится вашим проектом с коробкой.
  3. Вы можете построить проект на этапах подготовки Vagrant, но если вы активно разрабатываете приложение, вы, возможно, не захотите этого делать.
  4. Протестируйте работающий экземпляр приложения (работающий внутри коробки). Просто введите SSH в коробку, войдите в каталог `/vagrant'и запустите ваше приложение.
  5. Настроить код} #4, #5 и #6 быстрых / быстрых циклов dev-test-tweak с использованием горячего повторного развертывания, поскольку ваш проект совместно используется хостом и гостем в режиме реального времени. Вы можете просто остановить приложение (если оно запущено) и снова запустить приложение на госте. Копирование не требуется.
  6. Re-тест

Это даст вам быстрые циклы развития, сохраняя среду неизменной. Новый разработчик может просто клонировать и vagrant up чтобы начать работу над проектом, не беспокоясь об окружающей среде и так далее.

Непрерывная интеграция - обширная тема. Вы все еще можете применить эти методы к своему репо и т. Д. Но я бы пропустил процесс развертывания CI при разработке. Я использую Jenkins и Capistrano для своих развертываний CI, но это слишком тяжелый вес для разработки. В производственной среде я не буду использовать Vagrant, поскольку он уже будет виртуализировать вашу виртуальную машину с двойной виртуализацией (если только вы не запускаете голое железо). Для производства я буду использовать Docker и рис.

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

Другие вопросы по тегам