Edited at

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

More than 3 years have passed since last update.

Capistrano3を入れて、簡単なタスクを実行するまでやります。

とりあえず動かして感覚掴みたい人向け。


Capistrano概要

Ruby製デプロイツールです。

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

つまり必要な作業は


  • 鍵の作成、デプロイ先への登録

  • 環境ごとの設定

  • 実行したいタスク(任意のrubyまたはシェルコマンド)の記述

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


環境

以下環境で行いました

Ruby 2.1.1

Rails 4.0.3


鍵の作成

$ 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に先ほど作成した公開鍵を書き込みます

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


インストール

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

Gemfileにcapistranoを追記


Gemfile

group :development do

gem 'capistrano'
end

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

# 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.rbproduction.rbが生成されます。

ただRailsのデフォルトの環境はdevelopmentです。

なので今回はとりあえずstaging.rbをコピってdevelopment.rbを作成。

ここにdevelopment環境での設定を記述していきます。

が、今回は初期値のままでいきます。

localhostにsshする際の設定をしていきます。


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に以下を記述します。


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 環境名 タスク名で実行します!

$ 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して実行するがありました。