Pull to refresh

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

Reading time 3 min
Views 76K
Чтобы избежать больших затрат на развертывание сред разработки и тестирования, приближенных к среде эксплуатации (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/).

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

Ссылки:
Tags:
Hubs:
+21
Comments 7
Comments Comments 7

Articles