@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

Capistranoでunicornを再起動する

Capistranoを使って、unicornをリスタートしようとして、ちょっとハマってしまいました。
unicorn.pidの存在確認をして、存在していればそのファイルを読み込んでプロセスをKILLしてから、起動のコマンドを打つつもりでした。
なので、元はこんな感じです。

  task :start do
    run "cd #{current_path} && bundle exec unicorn_rails -c #{current_path}/config/unicorn.conf -E #{rails_env} -D"
  end

  task :stop do
    if File.exist? "#{shared_path}/pids/unicorn.pid" then
      run "kill -s QUIT `cat #{shared_path}/pids/unicorn.pid`"
    end
  end

  task :restart do
    stop
    start
  end

File.exist?でファイルの存在確認すればいいよね?と思っていた時期がありました。
実際に、試してみたらうまくいったこともあったんですよ!たまたまでしたけれども。たまたまローカルにファイルがあったからなんですけれども。
で、File.exist?だと、ローカルのファイルを見に行ってしまい、サーバのファイルは見ませんので、当然のことながらファイルは無いと判定されてしまい、startでコケるんですよね。
そんなわけで、ちゃんとサーバ側のファイルを確認するようにしなければいけないよ、というお話です。
修正したのはこんな感じです。

  task :start do
    run "cd #{current_path} && bundle exec unicorn_rails -c #{current_path}/config/unicorn.conf -E #{rails_env} -D"
  end

  task :stop do
    invoke_command("if [ -e '#{shared_path}/pids/unicorn.pid' ]; then echo -n 'true'; fi") do |ch, stream, out|
      if out == 'true' then
        run "kill -s QUIT `cat #{shared_path}/pids/unicorn.pid`"
      end
    end
  end

  task :restart do
    stop
    start
  end

Stackoverflowさまさまですね。
ruby - How can you check to see if a file exists (on the remote server) in Capistrano? - Stack Overflow

あけましておめでとうございます

遅くなりましたが、新年のエントリを。
一昨年の年末に会社を辞めて、昨年からフリーランスとしてやっていました。確定申告を終えてからじゃないと何とも言えませんが、それなりに充実していたと思います。
フロントエンドゴリゴリやってみたり、インフラをやってみたり、PHPやってみたり、Rubyやってみたりと、いろいろやったなぁと思います。どれもまだ中途半端なわけですが。
今年も引き続きがんばっていきますので、よろしくお願いいたします。

capistranoのbundler/capistranoでsshがタイムアウトする

bundler/capistranoでbundle installをかけています。
AWSのEC2で動かすとタイムアウトになって困った。
sshd_configのClientAliveIntervalを設定すればいいらし。
設定方法はこちらを参考にしました。
ssh の接続維持 - snbhsmt_log
そして、sshdを再起動すればいいですね。
sshdの再起動方法はこちらを参考にしました。
http://open-groove.net/linux/sshd-restart/
sshdの起動に失敗したままSSH接続切っちゃうと次から繋げられなくなっちゃうからね。

RailsAdminとconcern modulesを共存させる

RailsAdminって便利ですね。管理が非常に楽になります。
RailsAdminを使っていたところに、concern modulesを組み込んでみました。
すると、今まで動いていたRailsAdminが動かなくなるという現象が発生しました。

RuntimeError in RailsAdmin::MainController#dashboard
Circular dependency detected while autoloading constant Concerns::Hogehoge

Extracted source (around line #6):
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end

Rails.root: /path/to/railsapp

Application Trace | Framework Trace | Full Trace
config/initializers/quiet_assets.rb:6:in `call_with_quiet_assets'
Request

ぐぐったら、こちらに行き着きました。
Circular dependency detected while autoloading constant · Issue #1697 · sferik/rails_admin · GitHub

config/initializers/rails_admin.rbに次の定義を行えば解決出来るとのことです。

# Include specific models (exclude the others):
Rails.application.eager_load!
config.included_models = ActiveRecord::Base.descendants.map!(&:name)

で、実際に解決しました。
RailsAdminではデータベースのテーブルの管理が出来るのですが、その対象をActiveRecordのクラスを見て設定しているようです。
app/modelsの中のファイルを見ているのですが、app/models/concernsの中身も見てしまいます。
そこで、ActiveRecordのサブクラスだけですよ。と指定しているんですね。
とりあえず解決してめでたしめでたしでした。