LoginSignup
216
219

More than 5 years have passed since last update.

はじめてのCapistrano

Last updated at Posted at 2012-09-18

Capistranoを使うととデプロイが簡単だという話を良く聞くけれど、
Capistranoを使うことが難しかったのでメモ。

Getting Started

インストール

$ gem install capistrano

実行する

設定ファイルを作成するコマンド

$ capify .

を実行すると、

[working_dir]/Capfile
[working_dir]/config
[working_dir]/config/deploy.rb

が作成される

タスクの基本

config/deploy.rbを空にして以下を記述する

config/deploy.rb
# localhost の ssh を許可しておくこと
task :list, :hosts => "localhost" do
    run "ls"
end

terminalで以下を実行する

$ cap list #=> localhostのファイル一覧が出力される

パスワードを問われるのはSSHで接続しているため

:hostをまとめる

デフォルトでは、全てのサーバー・全てのロールが実行される。
ロールを設定するのは局所的な動作を期待するため。

config/deploy.rb
# :hostsをまとめることができる
role :local, "localhost"

task :list do
    run "ls"
end

複数サーバーを設定する

config/deploy.rb
# 複数のサーバーに実行することができる
role :local, "localhost", "anotherhost"

task :list do
    run "ls"
end

複数ロールを設定する

config/deploy.rb
# 複数ロールを持つことができる
role :local, "localhost"
role :another, "anotherhost"

task :list, :roles => :local do
    run "ls"
end

task :list_another, :roles => :another do
    run "ls"
end

タスクの説明

config/deploy.rb
role :local, "localhost"

# コマンド一覧に表示される説明
desc "Echo the server's host name"
task :echo_hostname do
    run "echo `hostname`"
end
$ cap -vT #=> コマンド一覧

...
cap deploy:web:enable        # Makes the application web-accessible again.
cap echo_hostname            # Echo the server's host name
cap invoke                   # Invoke a single command on the remote servers.
...

コマンドを直接実行

cap invoke COMMAND="echo 'Hello World'" #=> Hello, Wrold

デプロイ設定

アプリケーション名を設定

config/deploy.rb
set :application => "myapplication"

リポジトリの設定

config/deploy.rb
# リポジトリの場所を指定する
set :repository, "ssh://localhost/var/git/myapplication.git"
# リポジトリの種類を指定する
set :scm, :git

デプロイ先の指定

config/deploy.rb
set :deploy_to, "/var/www/rails/"

role :app,  "localhost",                    # アプリケーションサーバー
role :web,  "localhost",                    # Webサーバー
role :db,   "localhost", :primary => true   # DBサーバー

DBはmaster/slaveがあればprimaryでコントロールできる
全て同じ場合は次のような書き方もできる。

config/deploy.rb
server "localhost", :app, :web, :db, :primary => true

実行ユーザーの設定

config/deploy.rb
set :user, "foo"

リポジトリユーザーの設定

config/deploy.rb
set :scm_username, "foo"

スーパーユーザー権限で実行の設定

config/deploy.rb
set :use_sudo, false #=> defaultではtrue

deployコマンド

cap deploy                # Deploys your project.
cap deploy:check          # Test deployment dependencies.
cap deploy:cleanup        # Clean up old releases.
cap deploy:cold           # Deploys and starts a `cold' application.
cap deploy:create_symlink # Updates the symlink to the most recently deployed...
cap deploy:migrate        # Run the migrate rake task.
cap deploy:migrations     # Deploy and run pending migrations.
cap deploy:pending        # Displays the commits since your last deploy.
cap deploy:pending:diff   # Displays the `diff' since your last deploy.
cap deploy:restart        # Blank task exists as a hook into which to install...
cap deploy:rollback       # Rolls back to a previous version and restarts.
cap deploy:rollback:code  # Rolls back to the previously deployed version.
cap deploy:setup          # Prepares one or more servers for deployment.
cap deploy:start          # Blank task exists as a hook into which to install...
cap deploy:stop           # Blank task exists as a hook into which to install...
cap deploy:symlink        # Deprecated API.
cap deploy:update         # Copies your project and updates the symlink.
cap deploy:update_code    # Copies your project to the remote servers.
cap deploy:upload         # Copy files to the currently deployed version.
cap deploy:web:disable    # Present a maintenance page to visitors.
cap deploy:web:enable     # Makes the application web-accessible again.
cap invoke                # Invoke a single command on the remote servers.
cap shell                 # Begin an interactive Capistrano session.

Namespace

Capistrano 2.x以降、全てのタスクはネームスペース化されており、モジュールとして分離できます。ここに処理をはさみ込むこともできます。

config/deploy.rb
# デプロイ時に rake resque:work を動かすgodスクリプトを呼ぶ
namespace :deploy do
  task :start, :roles => :app do
    run "god start resque-worker"
  end

  task :restart, :roles => :app do
    run "god restart resque-worker"
  end

  task :stop, :roles => :app do
    run "god stop resque-worker"
  end
end
216
219
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
216
219