【自動デプロイ】Capistranoの要約

# 概要
- Ruby製のデプロイ自動化ツール
- GitHubのリポジトリクローンから始まる煩わしい作業を担ってくれる

# 手順
- CapistranoのGemをインストール
- Capistranoによって生成されたファイルへデプロイに関する設定を記述
- Unicornの設定（Capistrano導入によって本番環境に設置されたアプリ階層が深くなるため）
- Nginxの設定（Capistrano導入によって本番環境に設置されたアプリ階層が深くなるため）
- Unicornのkillした後、自動デプロイ実行


# 構成
- Capfile
    - ライブラリ管理に用いられる
    - よくあるrequireでディレクトリを指定するもの
    - 記述イメージ
    
```capfile
# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# Includes tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails/tree/master/assets
#   https://github.com/capistrano/rails/tree/master/migrations
#
# require 'capistrano/rvm' #rvmならこちらを外す
require 'capistrano/rbenv' #rbenvならこちらを外す
set :rbenv_type, :system # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.1.0' #rubyのバージョンを指定
# require 'capistrano/chruby'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
```
- deploy.rb
    - デプロイの設定を記述するファイル
    - バージョン、GitHubクローン元、ミドルウェアのバージョン、sshに関する情報を記述する
    - 記述イメージ

```
set :application,'test'
#レポジトリURL
set :repo_url, 'git@bitbucket.org:xxxxxx/test.git'
#対象ブランチ masterに固定
set :branch, 'master'
#デプロイ先ディレクトリ フルパスで指定
set :deploy_to, '/var/www/test'
#バージョン管理方法 subverion, git, mercurial, cvs, bzrなど
set :scm, :git
#情報レベル info or debug
set :log_level, :debug
#sudoに必要 これをtrueにするとssh -tで実行される
set :pty, true
#sharedに入るものを指定
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets}
#capistrano用bundleするのに必要
set :default_env, { path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" }
#5回分のreleasesを保持する
set :keep_releases, 5 

#タスク定義
namespace :deploy do #タスクnamespace
    #desc 'タスク説明'
    #task :restart do #タスク定義 
        #ここにタスク処理内容を記述
    #end
  #after :finishing, 'deploy:cleanup' #task実行タイミングを指定できます。詳細は下記
  #http://capistranorb.com/documentation/getting-started/flow/
    #サンプルにunicorn再起動タスク
    desc 'Restart application'
    task :restart do
      invoke 'unicorn:restart' #lib/capustrano/tasks/unicorn.cap内処理を実行
    end
  after :finishing, 'deploy:cleanup'
```
- production.rb（staging.rb）
    - デプロイの設定を記述するファイル2
    - IPアドレス、サーバーユーザー名、ロール、sshに関する情報を記述すうr

### デプロイ後に作成されるディレクトリの概要
- releasesディレクトリ
    - デプロイされたアプリを格納する場所
    - バージョン管理されており、指定した回数分のデプロイ履歴を保存、その範囲内であれば任意のバージョンに戻ることができる
- currentディレクトリ
    - 読んで字の如く、最新のデプロイが格納されている場所
- sharedディレクトリ
    - バージョンに関係なく共通して参照されるファイルが格納される場所
    - ログやtmpが代表格


# Unicornの設定
- unicorn.rbで設定しているアプリの階層を1段深くする


# NginXの設定
- rails.conf（/etc/nginx/conf.d/rails.conf）で設定しているアプリの階層を1段深くする


# 自動デプロイの実行
注意：
- 自動デプロイ前にUnicornをkillすること（自動デプロイにサーバーUP機能が搭載されているため）
- エラーログの取得等、アプリの階層が1段深くなっている



- 自動デプロイの実行（ローカルアプリディレクトリで行うこと）

```
% bundle exec cap production deploy
```

- DBとNginxの再起動（EC2インスタンスで行うこと）

```
$ sudo systemctl restart mariadb 
$ sudo systemctl restart nginx
```