Edited at

Capistranoで簡単デプロイ

More than 1 year has passed since last update.


概要

capistranoを使ったデプロイ方法のメモ。

gitからソースを取得して本番に反映させるだけなので、ruby以外のプロダクトでも利用可能。


環境


  • Capistrano Version: 3.5.0 (Rake Version: 11.2.2)

  • ruby 2.3.1p112


capistranoのインストール

Gemfileを作成


Gemfile

source 'https://rubygems.org'

gem 'capistrano', '~> 3.5'


インストール

$ bundle install --path vendor/bundle

$ bundle exec cap install


capistranoの設定

最低限の設定のみ行う。

全体の設定ファイル。


config/deploy.rb

# レポジトリ設定

set :repo_url, 'https://user_name:pass_word@github.com/user_name/web_app.git'
# シンボリックリンクにするディレクトリ
set :linked_dirs, fetch(:linked_dirs, []).push('log')
# デプロイ先でのソースのバージョンの保持数
set :keep_releases, 5
# コマンド実行時にsudoをつけるか
set :use_sudo, false

環境ごとの設定ファイル。下記はproduction用。


config/deploy/production.rb

# deploy先のサーバー情報

role :web, %w{user@server.com}
# deployするディレクトリの場所
set :deploy_to, '/home/user/source'

set :ssh_options, {
port: 22,
forward_agent: true,
# ssh秘密鍵の場所
keys: ['~/.ssh/id_rsa']
}



taskの作成

deploy後に実行するタスクを作成する場合。

ここではデプロイ後にメールを送信するタスクを作成してみる。


lib/capistrano/tasks

namespace :mail do

desc 'send mail after deploying.'
task :send do
on roles(:all) do
# コマンドの標準出力結果を取得
output = capture "hostname"
execute "echo #{output} | mail -s 'subject' 'user@mail.com'"
end
end
end

# deploy後に実行する場合
after 'deploy:finishing', 'mail:send'



デプロイ

$ bundle exec cap production deploy


ssh keyのforwarding設定

git cloneするための秘密鍵を、デプロイ先のサーバーに設置せず、capistranoサーバーに設置してforwardingする方法。


鍵を作成する

$ ssh-keygen -t rsa -b 4096

この鍵の公開鍵をGitに登録する。

また、capistranoサーバーの~/.ssh/に秘密鍵を設置する。

つまり、capistranoでデプロイ先にssh接続するための鍵と、デプロイ先でgit cloneするための鍵は共通になる。


ssh-add

capistranoサーバーでssh-addする。

こちらは、deployサーバーにsshでログインする度に実行する必要があるので、~/.bash_profileなどに記載しておくとよい。

$ eval `ssh-agent`

$ ssh-add ~/.ssh/id_rsa
$ ssh-add -l


capistranoのconfig設定

config/deploy/development.rbに作成した秘密鍵のパスを定義する。


config/deploy/development.rb

server '192.168.33.13', user: 'cap', roles: %w{app}

set :ssh_options, {
port: 22,
forward_agent: true,
keys: ['~/.ssh/id_rsa'],
}

set :deploy_target, 'app'
set :branch, :master


以上


参考