10分でできる! Capistrano3とりあえず入門


Capistrano3を入れて、簡単なタスクを実行するまでやります。
とりあえず動かして感覚掴みたい人向け。

# Capistrano概要
Ruby製デプロイツールです。

ただ、デプロイツールと言ってもその実態は**SSH先の環境ごとに一連のRakeタスクを実行するだけ**です。
つまり必要な作業は

- 鍵の作成、デプロイ先への登録
- 環境ごとの設定
- 実行したいタスク(任意のrubyまたはシェルコマンド)の記述

だけです。とっても簡単!


# 環境
以下環境で行いました
Ruby 2.1.1
Rails 4.0.3



# 鍵の作成

```bash
$ cd ~/.ssh/
# 鍵名capistrano(なんでもいいです)、パスフレーズ無しで作成
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): capistrano
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
...
```
今回はとりあえず実行ということでlocalhostにsshしようと思うので自身の`~/.ssh/authorized_keys`に先ほど作成した公開鍵を書き込みます

```bash
$ cat ~/.ssh/capistrano.pub >> ~/.ssh/authorized_keys
```



# インストール
Capistrano3からはRails依存を辞め、bundlerやmigrateなどの各種機能をモジュールとして切り離しています。

Gemfileにcapistranoを追記

```ruby:Gemfile
group :development do
  gem 'capistrano'
end
```

インストールしてひな形作成までします。

```bash
# capistranoインストール
$ bundle install

# ひな形作成
# cap はCaistranoの実行コマンド
$ 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
各種ライブラリを`require`する場所です。
最初からたくさんの`require`がコメントアウトされていますが、今回は関係ないので**このままでOK!**

## config/deploy/環境名.rb
環境ごとの設定を記述します。

ひな形では`staging.rb`と`production.rb`が生成されます。
ただRailsのデフォルトの環境はdevelopmentです。
なので今回はとりあえず`staging.rb`をコピって`development.rb`を作成。

ここにdevelopment環境での設定を記述していきます。
~~が、今回は初期値のままでいきます。~~
localhostにsshする際の設定をしていきます。

```ruby:development.rb
# 今ログインしているユーザをvagrantとした時の設定
# 'vagrant'とssh_optionsの鍵名'capistrano'は適宜自分の環境での名前に置き換えて下さい
role :app, %w{vagrant@localhost}
role :web, %w{vagrant@localhost}
role :db, %w{vagrant@localhost}

server 'localhost', user: 'vagrant', roles: %w{web app}, ssh_options: { keys: %w(~/.ssh/capistrano) }
```

- **role**
アプリケーションサーバー、Webサーバー、DBサーバーでの各`ユーザ@ホスト名(or IPアドレス)`を記述しておきます。
タスクを記述する際に`role`によって実行するタスクを振り分けて書くことができます。

- **server**
作業対象となるサーバーの情報を記述します。
この場合localhostにwebとappのロールを付与して、vagrantユーザでログインするといった記述になってます。

### config/deploy.rb
各環境で共通の設定を記述します。

gitのリポジトリのurlや出力するログレベルなどなどを書きますが、**とりあえずこのままで。**

# タスクの作成
どこに記述してもいいんですが今回は`development.rb`に以下を記述します。

```ruby:development.rb
desc 'my first capistrano task' # 無くてok
task :first_task do
  run_locally do
  	# executeでシェルコマンド実行
    execute "echo hello wolrd"
  end
end
```

これ実はただのRakeタスクです。
`:first_task`が実行時のタスク名。
でその中のブロック、ここでは`run_locally`というのが、このタスクをどこで実行するかを示しています。
(他には例えば`on role(:web)`とすると`web`ロールを持つサーバーで実行されます。)

~~基本的にはさっき`server`で指定したサーバーにsshでログインして、そこでタスクを処理していくのですが、
`run_locally`とすることでsshせず`cap`コマンドを実行した場所(localhost)でタスクが走ります。~~

`run_locally`にするとlocalhostにsshしてcapistranoを実行します。


# Capistrano実行!
`bundle exec cap 環境名 タスク名`で実行します!

```ruby
$ bundle exec cap development first_task
INFO [c812a6d9] Running /usr/bin/env echo hello wolrd on localhost
DEBUG [c812a6d9] Command: echo hello wolrd
DEBUG [c812a6d9] 	hello wolrd
INFO [c812a6d9] Finished in 0.005 seconds with exit status 0 (successful).
```

色々出力されますが、どこかにhello worldと表示されてば成功です!

# 変更履歴
### 2016/03/09
環境を追記しました
当時Railsは4.0.3でした

### 2015/02/04
ssh周りを追記しました。
localhost(run_locally)で動かすときもlocalhostにsshして実行するがありました。