Capistrano

自動デプロイツール

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

コメント