自動デプロイツール
Gemをインストール
gemfileに以下を追記。
group :development, :test do
gem 'capistrano'
gem 'capistrano-rbenv'
gem 'capistrano-bundler'
gem 'capistrano-rails'
gem 'capistrano3-unicorn'
end
bundle installする。
次のコマンドも行う。
capistranoのインストール(というかconfigファイルの作成なのかな?)
bundle exec cap install
以下が生成される。
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified
Capfile
Capistrano関連のライブラリのうちどれを読み込むかを指定
deploy.rb 共通設定
production.rb 本番環境用
staging.rb staging用
デプロイのための情報を記載する。
capfileを以下のように編集
require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
deploy.rb
- アプリケーション名
- gitのレポジトリ
- 利用するSCM
- タスク
- それぞれのタスクで実行するコマンド
などを記載する。
以下のように編集する。
# config valid only for current version of Capistrano
# capistranoのバージョンを記載。固定のバージョンを利用し続け、バージョン変更によるトラブルを防止する
lock '<Capistranoのバージョン>'
# Capistranoのログの表示に利用する
set :application, '自身のアプリケーション名'
# どのリポジトリからアプリをpullするかを指定する
set :repo_url, 'git@github.com:<Githubのユーザー名>/<レポジトリ名>.git'
# バージョンが変わっても共通で参照するディレクトリを指定
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')
set :rbenv_type, :user
set :rbenv_ruby, '<このアプリで使用しているrubyのバージョン>' #例 2.5.1
# どの公開鍵を利用してデプロイするか
set :ssh_options, auth_methods: ['publickey'],
keys: ['<ローカルPCのEC2インスタンスのSSH鍵(pem)へのパス>'] ※例:~/.ssh/key_pem.pem
# プロセス番号を記載したファイルの場所
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }
# Unicornの設定ファイルの場所
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5
# デプロイ処理が終わった後、Unicornを再起動するための記述
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
task :restart do
invoke 'unicorn:restart'
end
end
git@github.com:ユーザ名/リポジトリ名.git
DSL(Domain Specific Language)
ドメイン固有言語。
capistrano内で記載されるset :名前, 値 などの記法もこの種のもの。
setは変数の定義なようなもので、fetch 名前 とすることで値を取り出せる。
deploy.rb内に記述されているdesc ‘◯◯’やtask:XX doなどもcap deploy時に実行される。
Capistranoによる自動デプロイ後のディレクトリ構成について
capistranoでデプロイを実行すると
releases、current、sharedディレクトリ等のディレクトリが作られる。
/var/www/project内に以下のフォルダが作成される。
capistranoを使わない場合と比べてcurrentディレクトリ下に配置される分だけ階層が深くなる。
releaseディレクトリ
過去のデプロイバージョンが保存される。
deploy.rbのset :keep_releases, 5
で指定しているのが保存するバージョン数。
上記の場合過去5つ分まで保存する。
currentディレクトリ
デプロイされた最新のものがここに格納される。
sharedディレクトリ
バージョンが変わっても共通で参照されるディレクトリが格納される。
具体的には、log、public、tmp、vendorディレクトリが格納される。
unicorn.rbとnginx設定ファイルを修正
config/unicorn.rb
app_path = File.expand_path('../../', __FILE__)
worker_processes 1
working_directory app_path
pid "#{app_path}/tmp/pids/unicorn.pid"
listen "#{app_path}/tmp/sockets/unicorn.sock"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"
↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓
# ../が一つ増えている
app_path = File.expand_path('../../../', __FILE__)
worker_processes 1
# currentを指定
working_directory "#{app_path}/current"
# それぞれ、sharedの中を参照するよう変更
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
sudo vim /etc/nginx/conf.d/rails.conf
upstream app_server {
server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;
}
root /var/www/<アプリケーション名>/public;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓
upstream app_server {
server unix:/var/www/<アプリケーション名>/shared/tmp/sockets/unicorn.sock;
}
root /var/www/<アプリケーション名>/current/public;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
root /var/www/<アプリケーション名>/current/public;
}
変更後はnginxの再起動
sudo service nginx reload
sudo service nginx restart
mysqlも立ち上げておく。
∵MySQLが立ち上がっていないとデプロイが失敗
sudo service mysqld restart
unicornを停止させる
cd /var/www/アプリ名
kill -QUIT `cat tmp/pids/unicorn.pid` #Unicornの停止
自動デプロイさせる
bundle exec cap production deploy
コメント