Capistrano

パーフェクトRubyにおけるCapistranoをまとめた
パーフェクトRubyだとcapstrano 2.x系で説明している。
2015/10/24現在だとcapistrano 3.4.0が最新で、若干コマンドが異なる

## Capistranoとは
複数のサーバを操作する時に使えるツール。
コマンド一つでアプリケーションを構築することが可能
複数のリモートサーバに対して処理を行うことができるのでデプロイツールでもある。Rubyで記述されている。
ただし、POSIX準拠のシェルを備えたサーバに限定される
###### POSIX準拠のシェルとは
    IEEEが定めたUNIXベースのOSが備えるべき最低限の仕様
    (プロセス制御、権限管理、ファイル、ディレクトリなど多岐にわたる)

## ChefやAnsible, Dockerとの違い
   Chef: サーバの状態を管理する（ミドルウェアのインストールなど）
   Capistrano: アプリケーションコードやDBのテーブル定義など

## 運用イメージ
　複数のサーバに対して、git-hub等のリポジトリからソースコードを
　各サーバに反映するとか

## 最初にやること
- gem install capistrano
  - 以下のコマンドが利用できるようになる
    - capifyコマンド...設定ファイルの雛形を作るコマンド
    - capコマンド...設定ファイルの読み込みをするコマンド 

capifyコマンドを実行すると以下のファイルが作られる
  
  - Capfile 
    - タスクが記述されたファイルを読み込むのに必要なファイル
  - config/deploy.rb
    - デプロイの流れを記述するファイル
    - デフォルトでも十分な機能はあるが、このdeploy.rbに拡追記すれば拡張もできる
    - このデプロイをまとめたものを「デプロイレシピ」と呼ぶ

## デプロイレシピの書き方
deploy.rbの以下メソッドについて説明する。

- set
- role
- task

----
#### set
Capistranoのオプションを設定するのにsetを使う

###### オプションとは
ここでいうオプションは、リポジトリの指定やバージョン管理システムの指定、Capistrano内のローカル変数などのこと。これらを設定していくのがsetコマンド。

###### 使い方
setコマンドの第一引数にオプションとなるシンボルを、
第二引数に値を渡す。

```setコマンドの例
# デプロイを行うのに「application」「repository」「scm」はの指定は必須
set :application, "hoge_project"
set :repository, "git://hoge.git"
set :scm, "git"
set :use_sudo, true // sudo 権限で実行する

# ローカル変数の指定
:set :local_val, "val"
# puts で中身を確認できる
puts local_val # => "val"
```
----

#### role
デプロイするサーバを用途別にグルーピングするための設定
Capifyコマンドで作成した雛形ファイルには、
「web」「app」「db」がデフォルトで設定されている

##### 使い方
第一引数にグループを、
第二引数に値を渡す。

```roleコマンドの例
role :web, "hoge-web-server"
role :app, "hoge-app-server"
role :db, "hoge-db-maser", :primary => true
role :db, "hoge-web-slave"

set :deploy_to , "/var/www/html/hoge/#{application}/"
```
----

#### task
taskは実際に処理を記載したもの
Rakeと同じで

```
cap タスク名
```
でタスクごとに実行ができる

```taskコマンドの例
desc "This is a hoge task."
task :hello_capistrano do
  run 'echo "Hello Capistrano"'
end
```

Rakeと同じように以下のコマンドで、
タスク内容が表示される

```タスクの確認
cap -T # Rakeのタスクの確認と同じ
```

taskメソッドの第二引数に:rolesを渡すと、
実行するサーバを指定できる

```taskメソッドの第二引数に:rolesを渡す
desc "exec at web and app server"
task :hellocapistrano, :roles => [:web, :app] do
  run 'echo "Hello, web and app server"'
end
```

## デプロイの流れ
実際にどのようにCapistranoがデプロイしていくかを確認する
Capistranoにはあらかじめ利用できるタスクが存在する(P.476参照)
Webアプリケーション（Ruby on Rails）向けのdeployタスクがあるのでそれを利用する。
deployタスクを実行する前にセットアップタスク(タスク名deploy:setup)を実行しないといけない。

#### deploy:setup
deploy:setupコマンドが実行するのは、
setメソッドでdeploy_toを指定し、デプロイ先のディレクトリを設定していたが、そのディレクトリに「releases」と「shared」というディレクトリを作成する。

Capistranoが利用するディレクトリはこの「releases」と「shared」と「current」の3つのディレクトリを利用する。
###### releases 

* デプロイされるプログラム一式。 デプロイ毎にディレクトリが作成される。

###### shared

* アプリケーションの出力ログ
* tmpディレクトリ
* pidファイルへのシンボリックリンク 

###### current

* 現在アプリケーションとして稼働しているプログラム一式（releasesディレクトリ以下のデプロイされたシンボリックリンク）
* deployタスク実行時に生成される。

で、デプロイの流れの話に戻ると、
大きく分けると以下のようになる。
(1) ソースコードの取得
(2) bundle install
(3) 共有ファイルのシンボリックリンク差し替え
(4) 最新版ディレクトリ(current)のシンボリックリンクの差し替え
(5) サーバ再起動

#### タスク実施時の出力内容の制御
cap -vで出力内容を制御できる。
詳細出力を確認したい場合はcap -vvvを使う

#### transactionとrollback
Capistranoにはトランザクションとロールバック機能がある
**transaction**メソッドのブロック内に **on_rollback**メソッドを記述
例

```transactionとrollbackの例
desc 'rollback test'
task :has_error, :roles => :app do
  transaction do
  on_rollback { rub 'echo "has error"' #ロールバック処理}
  run 'command_does_not_exists "error?"'
end 
```
エラーが発生した場合on_rollback内の処理が実行される。

## パスワードの取り扱い
デプロイ処理によってはパスワードが必要な時がある。
デプロイレシピにパスワードを直接書くのはセキュリティ上よくないので、パスワードを入力するインターフェイスを提供することで回避する。

#### 使い方
**Capistrano::CLI.password_prompt**メソッドを使う

```Capistranoでパスワードを促す
set(:db_passwd) { Capistrano::CLI.password_prompt("DB Password:") }

desc "db connect"
task :db_connect, :roles => db {
  run "db_connect --user=pruby --password=#{db_passwd}"
}
```

## CaptureとStream
サーバからのレスポンスを受け取ることができる。
ログの収集などに使われる