capistranoでデプロイをしてもRailsアプリのコードが反映されない!とハマったので備忘録

状況は以下の通り

  • デプロイはcapistranoで行っている(リリースディレクトリに対するsymlinkの切り替えがリリースとなっている)
  • Railsアプリはpumaで動かしている
  • pumaはsupervisordで管理している
  • デプロイの際、pumaのpidに対してSIGUSR2を飛ばしてリスタートをかけている
  • が、Railsアプリのコードが反映されていない

supervisordのサービスの設定ファイルは以下の通り

pumaの設定はファイルはこんな感じ。

原因

supervisordのdirectoryでsymlinkを指定すると、起動するプロセスのディレクトリはsymlinkを展開した実際のディレクトリにcdします。つまり、/root/currentを指定すると/root/app1のディレクトリにcdすることになります。

コードで追うと以下の部分。supervisordのバージョンは3.3.4です。

指定したdirectoryの値でcdしてからexecveしています。

一方、pumaの起動ディレクトリは設定ファイルで指定されていない場合、カレントディレクトリになります。

capistranoはsymlinkでリリースを切り替えますが、@restart_dirは古いディレクトリの状態で切り替わらず変更が反映されないことになります。

解決策としては、設定ファイルのdirectoryにsymlinkのパスを設定するだけでOKです。これによって、pumaが起動されるときにdirectoryのsymlinkを解決することになります。再起動時も必ずsymlinkを経由してcdするため、新しくなったcurrentのリンク先を参照することになります。