CapistranoのREADMEを読んで私が解釈したこと

[Capistrano公式ののREADME](https://github.com/capistrano/capistrano/tree/master/docs)を読んで解釈したことをまとめます。

## Capistranoとは
Capistranoはデプロイのためのフレームワークです。
Rubyで書かれていて、Railsアプリのデプロイに使われることが多いですが、JavaやPHPのデプロイに使うこともできます。

インストール使えるようになる`cap`コマンドを使って、デプロイを行います。

```
$ cd my-capistrano-enabled-project
$ cap production deploy
```

CapistranoはサーバーにSSH接続をして、デプロイに必要なスクリプトを実行します。
スクリプトは[Rake](https://github.com/ruby/rake)タスクを書いて自分で定義することも、Capistranoコミュニティが提供しているライブラリ(gemなど)を利用することもできます。

以下、Rakeタスクのサンプルです。

```ruby
task :restart_sidekiq do
  on roles(:worker) do
    execute :service, "sidekiq restart"
  end
end
after "deploy:published", "restart_sidekiq"
```

## 特長
#### ファイル構造が明確
デフォルトで生成されるファイルの構造が良い感じなので、どこにどんな記述を書くのか、迷うことがありません。

#### 複数環境へのデプロイ
qa環境、ステージング環境、本番環境など複数の環境へのデプロイの設定をする時、同じような設定を複数書くことなく、IPアドレスなどの環境固有の情報を記述するだけで済みます。

#### 同時デプロイ
複数環境へのデプロイを同時に行うことができます。

#### タグ付け
通常、アプリケーションには複数のサーバー(webサーバー、アプリケーションサーバー、DBサーバなど)があります。
それぞれのサーバーにタグ付けをし、どのタスクをどのタグのサーバーで実行するかを定義することができます。

#### コミュニティが活発
Capistranoはgemを使って拡張することができます。よく使うデプロイのタスクのほとんどがgemによって提供されているので、自分で記述する量が最小限で済みます。

#### シンプルなSSHによる接続
Capistranoでできる全てのタスクは、SSH接続で手動実行できるタスクです。
シンプルな構造になっています。

## 注意点
#### デプロイ後の操作
デフォルトでは、コードをデプロイすることしかできません。
例えばデプロイ時にサーバーを再起動する必要がある場合などには、別途タスクを記述するか、gemを探してインストールする必要があります。

#### 公開鍵認証を使ったSSH接続
Capistranoを動かすためには、予め秘密鍵と公開鍵を使ってサーバーにSSH接続できる状態になっている必要があります。

#### プロビジョニング
デプロイしたコードを動かすためには、予めサーバーに言語やデータベースやwebサーバーをインストールしておく必要があります。

#### `sudo`
デプロイ時に実行するコマンドの中に`sudo`が必要なコマンドがあると、設定が複雑になってしまいます。
できるだけ`sudo`を含めないようにしましょう。

#### Shells
基本的にサーバーではbash or shを使うことを想定しています。

## クイックスタート
#### 必要条件
* Ruby 2.0以上
* Git等のツールでバージョン管理をしている
* デプロイ先のサーバーにGit等のツールがインストールされている
* [Bundler](http://bundler.io)でGemを管理していることが推奨されている

#### インストール

Gemfileのdevelopmentグループに`require: false`を付けて記述

``` ruby
group :development do
  gem "capistrano", "~> 3.14", require: false
end
```
``` sh
$ bundle install
```

#### 設定ファイルを生成
``` sh
$ bundle exec cap install
```
以下のファイルが生成されます。

```
├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
            └── tasks
```

ステージング、本番以外の環境も必要な場合は、以下のようなコマンドを叩きます。

``` sh
$ bundle exec cap install STAGES=local,sandbox,qa,production
```
デフォルトでは最低限の設定しか書かれていないので、`deploy.rb`と`deploy`ディレクトリ内のファイルを、環境に合わせて編集しましょう。

### その他使えるコマンド
``` sh
# list all available tasks
$ bundle exec cap -T

# deploy to the staging environment
$ bundle exec cap staging deploy

# deploy to the production environment
$ bundle exec cap production deploy

# simulate deploying to the production environment
# does not actually do anything
$ bundle exec cap production deploy --dry-run

# list task dependencies
$ bundle exec cap production deploy --prereqs

# trace through task invocations
$ bundle exec cap production deploy --trace

# lists all config variable before deployment tasks
$ bundle exec cap production deploy --print-config-variables
```

## その他ドキュメント
#### ドキュメント
* GitHubの[docs](https://github.com/capistrano/capistrano/tree/master/docs)ディレクトリ
    * このディレクトリの記述を元に[Capistranoの公式サイト](http://capistranorb.com)が作られています。
* [Stack Overflow](http://stackoverflow.com/questions/tagged/capistrano)のcapistranoタグ
* [メーリングリスト](https://groups.google.com/forum/#!forum/capistrano) 
* [CodersClan](http://codersclan.net/?repo_id=325&source=link)

#### 関連リポジトリ
* [capistrano/sshkit](https://github.com/capistrano/sshkit) 
    * capistranoがSSH接続をする際の仕組みが記述されています。(taskの中で`execute`を実行する時、SSHKitが動いています。)
* [capistrano/rails](https://github.com/capistrano/rails)
    * Railsアプリをデプロイする時によく使われるgemです。
* [mattbrictson/airbrussh](https://github.com/mattbrictson/airbrussh) 
    * capistranoのログをフォーマットする時に使われます