Webistrano - це фронтенд написаний на ROR до ruby-програми Capistrano. Це зручна адмін-панель до управління процесом виливки коду: за допомогою Webistrano можна зручно управляти етапами деплою проектів, надавати певні права користувачам, повертатись на попередні релізи у разі появи проблем та ін.
На жаль, проект більше 5 років не підтримується розробником - тому чим далі, тим буде складніше його установити, адже ніхто не тестує його роботу з останніми бібліотеками Ruby. Наразі краще пошукати альтернативи Webistrano або ж просто користуватись лише консольним інтерфейсом Capistrano, що звісно не додає зручності.
На жаль, проект більше 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
# 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)
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.
Для зберігання данних щодо проектів 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</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):
# 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, можна почитати тут.
Посилання:
Немає коментарів:
Дописати коментар