mazeltov7のweb断片

備忘録的なテキトーなことを書きます。(技術記事はQiitaに移行しました http://qiita.com/mazeltov7 )

Capistrano3から一時撤退するという話

デプロイ環境を整えるべく、2013年6月にリリースされた新しいバージョンでCapistrano3を設定しようと試みました。
結果、一時撤退するという話なので、身のある内容ではないです。ほぼ自分用のメモ。

主に以下を参考にしました。
https://github.com/capistrano/capistrano
公式ドキュメント
capistrano 3.x系を使ってrailsをデプロイ
Capistrano3で快適デプロイ生活!!
Capistrano 3への手引き
Capistrano 3を使ってみる
SSH認証キーをBitbucket/GitHubに設定しよう![Mac簡単手順](bitbucket連携)
https://github.com/capistrano/rails
https://github.com/capistrano/rbenv

まず、gemを入れた。

group :development do
  gem 'capistrano', '~> 3.0.1'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv', github: "capistrano/rbenv"
end

で、

$ bundle install
$ rbenv rehash # gemでbundle installしたやつを効かせる(capコマンドなど)
$ bundle exec cap install #これで必要なファイルとかインストールされる
$ bundle exec cap -T #コマンド類はこれで確認できる

Capfile

require 'capistrano/setup'

require 'capistrano/deploy'

require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

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

production.rb

set :stage, :production
set :branch, 'master'

role :all, %w{admin@appname.com}

server 'appname.com', user: 'username', port: 'port_number', roles: %w{web app db}, my_property: :my_value

deploy.rb

set :application, 'appname.com'
set :repo_url, 'git@bitbucket.org:user/myapp.git'
set :user, 'username'

set :branch, 'master'

set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.0.0-p247'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
set :rbenv_roles, :all # default value

 set :deploy_to, '/usr/share/nginx/www/appname'

 set :keep_releases, 5


namespace :deploy do


  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      # execute :touch, release_path.join('tmp/restart.txt')

    end
  end

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end

  after :finishing, 'deploy:cleanup'

end

この状態でとりあえず、以下コマンドで動かしてみた。

$ bundle exec cap production deploy:check #確認
$ bundle exec cap production deploy #これでこけまくる

何やら、mkdirしたりするときなどにパーミッションが欲しいのだけど、そこでこけたりしてるみたい。
バージョン3から、それまで使われていたset :use_sudoやdefault_run_optionsが使えなくなってる。
で、公式ドキュメント(http://www.capistranorb.com/documentation/getting-started/authentication-and-authorisation/)を見ると、passwordless sudoが良いとあるので、やってみる。
visudoで
username ALL=NOPASSWD:ALL (あえて全コマンドで)
として、やってみるが、効いてないっぽい。ここでvisudo裏ワザっぽいリンク発見。(リンク忘れてしまったw)曰く、visudoの一番下に書くと効くらしい、とのことでやってみると効いた。

がこれでも、
ユーザーのsudoをパスワードレスにはできてるぽいんだけど、そもそも、cap deployしてるときに
sudo実行してくれてない!?とかで、permission deniedされる事案発生。
そもそも、homeディレクトリではsudo無しでmkdirできるけど、appのディレクトリではsudoでないとmkdirできない。→sudo無しでmkdirできるようパーミッションいじるか、capistranoでsudoさせるようにするか、、いずれにせよやり方わからんーーーーー

http://stackoverflow.com/questions/20615484/when-capistrano3-does-mkdir-permission-denied?noredirect=1#comment30852649_20615484
http://qa.atmarkit.co.jp/q/3386
stackoverflow、qa@itを駆使したが解決しなそうなので、一旦撤退…

インフラ周りできる人に会った際に聞いてみよう。

この辺やったあと、nginx連携とか、puma連携とかあったのに、、道は長し。。
https://github.com/puma/puma
https://github.com/ivalkeen/capistrano-nginx
https://github.com/puma/puma/blob/master/docs/nginx.md