Translate

неділя, 11 січня 2015 р.

Deploy with Webistrano (Capistrano)


Webistrano - це фронтенд написаний на ROR до ruby-програми Capistrano. Це зручна адмін-панель до управління процесом виливки коду: за допомогою Webistrano можна зручно управляти етапами деплою проектів, надавати певні права користувачам, повертатись на попередні релізи у разі появи проблем та ін.

На жаль, проект більше 5 років не підтримується розробником - тому чим далі, тим буде складніше його установити, адже ніхто не тестує його роботу з останніми бібліотеками Ruby. Наразі краще пошукати альтернативи Webistrano або ж просто користуватись лише консольним інтерфейсом Capistrano, що звісно не додає зручності.

Для Ubuntu 14.04 LTS установка і налаштування проходить наступним чином. Перш за все встановимо необхідні пакети зі стандартних репозиторіїв:

# apt-get install ruby ruby-dev gem rubygems-integration libmysqlclient-dev ruby1.9.1-dev make git mysql-server

Призначення кожного пакету, я думаю, зрозуміле. Наступний крок - установка Rails:

# gem install rdoc mysql2
# gem install rails --no-ri --no-rdoc

Встановлюємо Capistrano, бекенд до Web:

# gem install capistrano

Створюємо окремого користувача, від імені якого і буде відбуватись виливка коду:

# useradd --system -U -d /home/webistrano webistrano

Встановлюємо Webistrano. Для цього необхідно склонувати git-репозиторій проекту:

# cd /home/webistrano
# git clone git://github.com/peritor/webistrano.git .
# chown -R webistrano:webistrano /home/webistrano

Як варіант можна встановити форк Webistrano, що має декілька корисних додаткових фіч: архів старих проектів, можливість указувати імена для хостів та давати доступи на окремі проекти.

Для зберігання данних щодо проектів Webistrano використовує MySQL. Створимо окремого користувача та базу:

mysql> create database webistrano;
mysql> create user 'webistrano'@'%' identified by 'my_password';
mysql> grant all privileges on  `webistrano` . * to 'webistrano'@'%';

Тепер можна створити конфігураційні файли Webistrano, просто скопіювавши і відредагувавши присутні приклади. Тож копіюємо:

# cp /home/webistrano/config/webistrano_config.rb.sample /home/webistrano/config/webistrano_config.rb
# cp /home/webistrano/config/database.yml.sample /home/webistrano/config/database.yml

І редагуємо, вказавши користувача та новостворену базу:

# vim /home/webistrano/config/database.yml
...
production:
  adapter: mysql
  database: webistrano
  username: webistrano
  password: my_password
  socket: /var/run/mysqld/mysqld.sock
...

В webistrano_config.rb знаходяться параметри поштового SMTP-серверу та деякі емейл адреси.

Запускаємо міграцію для бази даних:

# cd /home/webistrano
# sudo -u webistrano rake db:migrate RAILS_ENV=production

Першу помилку, що я отримав була:

rake aborted!
Bundler::VersionConflict: Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
    bundler (~> 1.0.10) ruby

  Current Bundler version:
    bundler (1.7.11)

Для чого необхідно підправити Gemfile, вказавши версію bundler:

# vim /home/webistrano/Gemfile
...
gem 'bundler', "~>1.7.11"
...

Запускаємо bundle:

$ bundle install

Using rake 10.4.2
Using activesupport 2.3.11
Using rack 1.1.6
Using actionpack 2.3.11
Using actionmailer 2.3.11
Using activerecord 2.3.11
Using activeresource 2.3.11
Using highline 1.6.21
Using net-ssh 2.9.2
Using net-scp 1.2.1
Using net-sftp 2.1.2
Using net-ssh-gateway 1.2.0
Using capistrano 2.6.0
Using erubis 2.7.0
Using exception_notification 2.3.3.0
Using mocha 0.9.8
Using mysql 2.9.1
Using open4 0.9.3
Using rails 2.3.11
Using syntax 1.0.0
Using bundler 1.7.11
Your bundle is complete!
It was installed into ./vendor/bundler

Знову повторюємо міграцію:

# sudo -u webistrano rake db:migrate RAILS_ENV=production

І якщо отримуємо таке:

rake aborted!
ERROR: 'rake/rdoctask' is obsolete and no longer supported. Use 'rdoc/task' (available in RDoc 2.4.2+) instead.

То дізнаємось версію rake:

$ gem list | grep rake
rake (10.4.2)

І додаємо версію rake до Gemfile:

# vim /home/webistrano/Gemfile
...
gem "rake", "10.4.2"
...

Виконуємо ті ж дії:

$ bundle update rake
$ bundle install

Повторюємо:

# sudo -u webistrano rake db:migrate RAILS_ENV=production

І я отримав ще одну помилку:

rake aborted!
ERROR: 'rake/rdoctask' is obsolete and no longer supported. Use 'rdoc/task' (available in RDoc 2.4.2+) instead.

Редагуємо Rakefile:

# vi /home/webistrano/Rakefile
...
#require 'rake/rdoctask'
require 'rdoc/task'
...

Мігруємо:

# sudo -u webistrano rake db:migrate RAILS_ENV=production

І фіксимо останню помилку:

NameError: undefined method `symlink' for class `Capistrano::Configuration::Namespaces::Namespace'

Видаляємо:

$ rm -rf /home/webistrano/config/initializers/capistrano_namespace_rake_fix.rb

Мігруємо востаннє:

# sudo -u webistrano rake db:migrate RAILS_ENV=production

Ура! Вдалось. 

Встановлюємо Passenger - бекенд до Apache для обробки рубі-скриптів:

# gem install passenger

# apt-get install build-essential libcurl4-openssl-dev libssl-dev apache2-mpm-worker apache2-threaded-dev libapr1-dev libaprutil1-dev

# passenger-install-apache2-module

Тиснемо Enter, обираємо Ruby і починається компіляція модулю, що займе біля 15 хвилин. Вкінці програма радить як активувати модуль для Apache і виводить приклади конфігураційних файлів. Використовуючі ці приклади, описуємо та активуємо модуль:

# vim /etc/apache2/mods-available/passenger.load

LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-4.0.57/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
PassengerRoot /var/lib/gems/1.9.1/gems/passenger-4.0.57
PassengerDefaultRuby /usr/bin/ruby1.9.1 
</IfModule>

# a2enmod passenger
# a2enmod rewrite

Та створюємо віртуалхост для Webistrano:

# vim /etc/apache2/sites-available/webistrano.conf

<VirtualHost *:80>
ServerName webistrano.local
# !!! Be sure to point DocumentRoot to 'public'!
DocumentRoot /home/webistrano/public
<Directory /home/webistrano/public>
# This relaxes Apache security settings.
AllowOverride all
# MultiViews must be turned off.
Options -MultiViews
# Uncomment this if you're on Apache >= 2.4:
Require all granted
</Directory>
</VirtualHost>

# a2ensite webistrano

Apache сам себе не перезавантажить:

# service apache2 restart

Нарешті :


 Логінемось (пароль і логін - admin):



Webistrano встановлено. Наразі необхідно описати наш тестовий проект. Виливати ми будемо звичайний Drupal, котрий скачаємо з офіційного репозиторію проекта.

Тиснемо New Project:


 І заповнюємо/додаємо/видаляємо змінні як на зображенню нижче:


Необхідно не забувати про ssh-ключі, використовуючи які Webistrano буде вливати код на віддалений хост.

Створюємо новий Stage:



Для окремого Stage можна оголосити окремі параметри та змінні, котрі можуть переоголошувати змінні оголошені в проекті. Також тут можна оголосити окремі рецепти: додаткові інструкції, які необхідно запускати під час деплою.

Додаємо новий хост:



І додаємо його до нашого проекту:


Поки все - запускаємо деплой:


Деплой в процесі, з логів можна побачити на якому він саме етапі:


В процесі деплою може з'явитись така помилка:

Net::SSH::AuthenticationFailed: Authentication failed for user webistrano@192.168.1.36

Щоб її уникнути треба встановити gem net-ssh:

# vi /home/webistrano/Gemfile
...
gem "net-ssh", "~> 2.9.2"
...

І встановлюємо новий пакет:

# rm -rf Gemfile.lock
# bundle install

Тепер про рецепти. Як я вже казав, рецепти - це інструкції, які виконуються під час виливки коду. Наприклад, лінкування статичних файлів, зміна прав на директорію/файли, очистка кешів і тп. Для того, щоб оновити код Drupal-проекту без його перевстановлення, необхідно прилінкувати попередній settings.php, директорію files, теми (якщо вони є). Я використовую такий рецепт:

namespace :drupal do
  desc "symlink_files"
  task :symlink_files do
    run "ln -s /home/webistrano/drupal_project/shared/files  #{deploy_to}/current/sites/default/files"
    run "ln -s /home/webistrano/drupal_project/shared/settings.php  #{deploy_to}/current/sites/default/settings.php"
    run "ln -s /home/webistrano/drupal_project/my_first/shared/themes/nexus  #{deploy_to}/current/sites/all/themes"
  end
end

after 'deploy:symlink','drupal:symlink_files'

З командами ніби зрозуміло. Останній рядок задає порядок виконання інструкцій. 'deploy:symlink' - це лінкування останньої версії коду в current (про це я згадаю трішки нижче), далі, після виливки коду, будуть виконані наші операції описані в рецепті. 


Так от, кожний наступний реліз виливається в директорію, що іменується як дата виливки, наприклад, 20150111044517. Останній реліз лінкується в current приблизно таким чином:

$ ls -l /home/webistrano/drupal_project/
total 8
lrwxrwxrwx  1 webistrano webistrano   49 Jan 11 05:46 current -> /home/webistrano/drupal_project/releases/20150111044517
drwxrwxr-x 22 webistrano webistrano 4096 Jan 11 05:46 releases
drwxrwxr-x  4 webistrano webistrano 4096 Jan  8 13:05 shared

В директорії shared я зберігаю settings.php та files, які і лінкую в директорію з станнім релізом.

Рецепт необхідно активувати для конкретного стейджу в Used recipes:


Наступні деплої вже будуть відбуватись з рецептом Config links.

Про основні параметри та змінні, з якими працює Webistrano, можна почитати тут.

Посилання:

Немає коментарів:

Дописати коментар