upgrede from 2.x.x

違い

  • Capistrano 3.x is multistage by default
  • Capifyファイルは新しくしたほうがいい

Gemfile

Capistrano2

group :development do
  gem "capistrano"
  gem "capistrano-ext"
  gem "capistrano_colors" # capistrano3に入っている
end

Capistrano3

group :development do
  gem "capistrano-rails"
end

ほか

gem "railsless-deploy" # rails以外に使うときに便利

Capify project with Capistrano 3

capistrano3がでたからもう一度整理

cd my-project
mkdir old_cap
mv Capfile old_cap
mv config/deploy.rb old_cap
mv config/deploy/ old_cap
cap install

cap installで以下のように構造が生成される

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

Capfile

Capistrano2

load "deploy"
load "deploy/assets"
Dir["vendor/gems/*/recipes/*.rb","vendor/plugins/*/recipes/*.rb"].each { |plugin| load(plugin) }
load "config/deploy"

Capistrano3

require "capistrano/setup"
require "capistrano/deploy"

require 'capistrano/rvm' # 必要によって
require "capistrano/bundler"
require "capistrano/rails/assets"
require "capistrano/rails/migrations"
require "whenever/capistrano"

Dir.glob("lib/capistrano/tasks/*.cap").each { |r| import r }

Multistage configuration

passenger restart setting

namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      execute :mkdir, '-p', release_path.join('tmp') # <= これを追加する
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end
  # ...
end

with Gemfile in rails

以前このようにしたが、 xxxxxxxxxx

group :deploy do
  gem 'capistrano'
  gem 'capistrano_colors'
  gem 'rvm-capistrano'
end

rvm-capistranoは古く、まだ、capistrano2.xに固定されているので、capistrano経由でrvmをinstallする必要がなければrvm-capistranoはいらない

まだ、capistrano_colorsはcapistranoにmergeされている。なのでこれでよし、

group :deploy do
  gem 'capistrano', '~> 3.2.0'
  gem 'capistrano-rvm'
end

formatting log(capistrano_colors)

https://github.com/capistrano/capistrano/wiki/Formatting-Logs

EC2 のauto scalingと組み合わせる場合

http://qiita.com/mychaelstyle/items/a550d4a0658c87c1ff30

auto scalingにより起動するインスタンス側にもcapistranoを仕込んで 起動時にソースコードをリリース用のブランチから自動で取得するように設定。

rvm with capistarno

http://rvm.io/integration/capistrano https://github.com/capistrano/rvm

capfile

# Capfile
require 'capistrano/rvm'
# deploy.rb or stage file (staging.rb, production.rb or else)
set :rvm_type, :user                     # Defaults to: :auto
set :rvm_ruby_version, '2.0.0-p247'      # Defaults to: 'default'
set :rvm_ruby_version, '2.0.0-p247@mygemset' # or
set :rvm_ruby_version, '2.0.0@mygemset' # or
set :rvm_custom_path, '~/.myveryownrvm'  # only needed if not detected(省略してもいい)
  • :auto (default): just tries to find the correct path. ~/.rvm wins over /usr/local/rvm
  • :system: defines the RVM path to /usr/local/rvm
  • :user: defines the RVM path to ~/.rvm

check configuration

cap production rvm:check

agent forwarding

agent forwarding setting

~/.ssh/config

Host *example.com
  ForwardAgent yes

remoteサーバの /etc/ssh/sshd_config

# /etc/ssh/sshd_config
AllowAgentForwarding yes

または AllowAgentForwarding noをコメントする

deploy.rb

set :ssh_options, {
   keys: %w(/home/user_name/.ssh/id_rsa),
   forward_agent: true, # ここを true
   auth_methods: %w(publickey password)
}

この設定したあと、テスト

cap production deploy:check

もし出来ない場合

1. ローカルmachineのssh-agentが稼動中なのか確認 (Your local ssh-agent must be running)

$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
/tmp/launch-kNSlgU/Listeners

2.キーがssh-agentで利用可能なのか確認 (Your key must be available to ssh-agent)

もし、上記の設定だけでだめなら以下の設定すること

ssh-add -L がなにも登録されてないなら ssh-add ~/.ssh/id_rsa -K

-Kはキーチェーンに保存しろってこと これをしないと毎回ssh-addしないとだめ

これで ssh keyを authentication agentに追加すること。 ここで追加するid_rsaはgit repositoryに登録しているものとする。

流れ

deploy
  deploy:starting
    [before]
      deploy:ensure_stage
      deploy:set_shared_assets
    deploy:check
  deploy:started
  deploy:updating
    git:create_release
    deploy:symlink:shared
  deploy:updated
    [before]
      deploy:bundle
    [after]
      deploy:migrate
      deploy:compile_assets
      deploy:cleanup_assets
      deploy:normalise_assets
  deploy:publishing
    deploy:symlink:release
    deploy:restart
  deploy:published
  deploy:finishing
    deploy:cleanup
  deploy:finished
    deploy:log_revision

task

sample

lib/capistrano/task/setup.capに置く

namespace :setup do

  desc "Upload database.yml file."
  task :upload_yml do
    on roles(:app) do
      execute "mkdir -p #{shared_path}/config"
      upload! StringIO.new(File.read("config/database.yml")), "#{shared_path}/config/database.yml"
    end
  end

  desc "Seed the database."
  task :seed_db do
    on roles(:app) do
      within "#{current_path}" do
        with rails_env: :production do
          execute :rake, "db:seed"
        end
      end
    end
  end

  desc "Symlinks config files for Nginx and Unicorn."
  task :symlink_config do
    on roles(:app) do
      execute "rm -f /etc/nginx/sites-enabled/default"

      execute "ln -nfs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{fetch(:application)}"
      execute "ln -nfs #{current_path}/config/unicorn_init.sh /etc/init.d/unicorn_#{fetch(:application)}"
   end
  end

end

SSHKit

capistrano3からはSSHKitを利用するようになっているので これは理解しておいで。

  • on(): specifies the server to run on
  • within(): specifies the directory path to run in
  • as(): specifies the user to run as
  • with(): specifies the environment variables to run with

参考

capistranoを利用してrake db:seed

http://easyramble.com/capistrano3-rake-db-seed.html

SSHKitの利用が必要

sample config

rvm install by user

rvm を rootでインストールせずに user単位でインストールすると 以下のようなコードがはいる。

capistranoでdeployするときにはそのユーザが使っているrvmがないのか確認しておいたほうがいい。

.bash_profile

# [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

.bashrc

```

* rootのrvmを使うなら`/home/user/.rvm`を削除するか、設定をコメントアウトするか、
* ユーザことに使うのが望ましいけど。

## sqlite3を使うときに注意(db fileのパス)

database.ymlにdefaultで書いているように `db/environment.sqlite3`にすると
capistranoでdeployするたびにdbfailが削除される。

なので他の場所を指定するのがいい。

例えば sharedとか。


# 基本的なコマンド

cap deploy:check cap deploy ```

results matching ""

    No results matching ""