Пользователь
0,0
рейтинг
26 марта 2012 в 15:18

Разработка → Быстрое развертывание среды разработки

Чтобы избежать больших затрат на развертывание сред разработки и тестирования, приближенных к среде эксплуатации (development stage vs production stage parity), всё большую популярность приобретает виртуализация сред.

В этой статье я расскажу, как создавал соответствующую репродуцируемую среду разработки на примере своего проекта runit-man с использованием Vagrant.

Для начала нам потребуется установить VirtualBox и сам Vagrant. Важно отметить, что VirtualBox крайне желательно устанавливать вместе с расширениями гостевой системы (Guest Extensions) той же версии, иначе развертывание будет нестабильным. Поскольку я веду разработку под MacOS X, то важным оказался тот факт, что соответствующие гостевые расширения для последней версии VirtualBox отсутствуют. Поэтому пришлось поставить VirtualBox 4.1.0 совместно с Vagrant 1.0.1.

Далее использовал образ ОС Ubuntu (мне в принципе было безразлично, какой ОС пользоваться на этом этапе) под именем lucid32.
vagrant box add lucid32 http://files.vagrantup.com/lucid32.box


Затем перешел в каталог проекта runit-man, и выполнил vagrant init.

На целевой системе нам нужно будет развернуть runit, проект runit-man с ветки master исходного репозитория и запустить сервис runit-man на порту 14500, который нужно пробросить на порт 14500 основной операционной системы для удобства тестирования через браузер.

Любой образ системы, подготовленный для использования вместе с Vagrant, уже включает в себя ruby, и готов для развертывания посредством Chef, Puppet или с помощью иного инструментария.

Наиболее простым способом для меня было использование Chef в режиме Solo, который не требует инсталляции сервера Chef.

Соответственно, создал папку cookbooks, где создал сборник рецептов provisioning.

Теперь Vagrantfile приобрел следующий вид:
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant::Config.run do |config|
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "lucid32"

  # Forward a port from the guest to the host, which allows for outside
  # computers to access the VM, whereas host only networking does not.
  config.vm.forward_port 14500, 14500

  # Enable provisioning with chef solo, specifying a cookbooks path (relative
  # to this Vagrantfile), and adding some recipes and/or roles.
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks"
    chef.add_recipe "provisioning"
  end
end


Для развертывания runit я положил в каталог cookbooks сборник рецептов runit (скачанный с GitHub).

Соответственно нам надо указать, что сборник provisioning зависит от сборника runit (cookbooks/provisioning/metadata.rb):
maintainer       "Akzhan Abdulin"
maintainer_email "akzhan.abdulin@gmail.com"
license          "MIT License"
description      "runit-man development VM"
version          "0.1"

depends "runit"


Самое время развернуть пустую инсталляцию через vagrant up и начать пошагово описывать рецепт provisioning::default, предварительно опробуя все в SSH (vagrant ssh).

Для этого нам нужно будет доставить необходимые гемы через Bundler, установить Git и развернуть репозиторий и сервис runit-man (cookbooks/provisioning/recipes/default.rb):
package "git-core"

gem_package "bundler"

git "/home/runit-man" do
  repository "git://github.com/Undev/runit-man.git"
end

bash "bundle" do
  code "cd /home/runit-man && bundle install --without development"
end

runit_service "runit-man"


Определение runit_service автоматически поставит runit и создаст сервис runit-man, используя предоставленные нами шаблоны.

run-скрипт (cookbooks/provisioning/templates/default/sv-runit-man-run.erb):
#!/bin/bash
exec 2>&1
export PATH="$PATH:/opt/ruby/bin"
exec ruby /home/runit-man/local-run.rb --rackup 'bundle exec rainbows -c rainbows.conf -p 14500'

log-run-скрипт (cookbooks/provisioning/templates/default/sv-runit-man-log-run.erb).
#!/bin/bash
mkdir -p /var/log/runit-man
exec svlogd -tt /var/log/runit-man


На этом начальное развертывание среды закончено (в моем случае мне нужна была среда для проверки runit-man в различных граничных случаях, разработка в этой среде не ведется, поэтому пакеты для ведения разработки не ставились).

Теперь можно выполнить vagrant destroy -f; vagrant up и проверить работу сервиса runit-man (http://localhost:14500/).

Дополнительный бонус: этим же набором сборников рецептов можно пользоваться и для развёртывания сред эксплуатации.

Ссылки:
Акжан @akzhan
карма
25,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (7)

  • 0
    Интересная утилита, сам пользуюсь виртуальными машинами. Но по старинке — сам ставлю, сам настраиваю…
    Возникли вопросы: в чем преимущество использования Vargant если мне нужна например Ubuntu+Eclipse+Плагины определенные к нему+… Это мне нужно найти или готовый box файл с таким конфигом (тяжело найти то что подходит на 100% все равно потом напильником доработать придется) или проще не парится, а поставить чистую систему+доставить нужно ПО один раз, положить образ в надежное место и потом простым копированием образа разворачивать любимую среду на нужной машине.
    box-файл с операционкой после распаковки, в файловой системе представляется так же и обычная виртуальная машина для VirtualBox?
    • 0
      А если это надо сделать для команды? Нюанс в повторяемости.

      Да, виртуальные машины Vagrant после vagrant up будут обычными настроенными виртуалками VirtualBox.
      • 0
        Ну и, конечно, помимо повторяемости еще важно удобство использования (поддержка, расширение и т.д.).
        • 0
          Не совсем чувствую пока ньюанса, опять же что мешает эталонный образ подправить/обновить/расширить и всей команде переписать? или фишка в том, что подправили box файл, выложили в локальную сетку, а вся команда ведя vargant up (ну или другую команду для старта с проверкой репозитария на счет обновления box-файла) получается обновленную среду?
          • 0
            Не только. Как минимум, мне очень удобно настраивать виртуальные машины через Vagrantfile (форвардинг, шаринг папок, формирование набора виртуальных машин для одного продукта).

            И кукбуки очень удобно описывают процесс подготовки окружения. Это лучше, чем shell-скрипт, по-моему.

            Кстати, именно Vagrant используется для работы агентов Travis CI.
  • 0
    Отличная статья, Акжан. Спасибо!
  • 0
     Это же просто мечта. Большое спасибо за наводку!

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