読者です 読者をやめる 読者になる 読者になる

Develop with pleasure!

福岡でCloudとかBlockchainとか。

Capistranoを使ってRails以外のアプリケーションをデプロイ。

Ruby Capistrano

CapistranoRailsのデプロイツールとしてメジャーだけど、Rails以外のアプリケーションのデプロイもできる。

ただ、デフォルトの設定のままだと、デプロイ時に、ログファイルやPIDファイルの格納先へシンボリックリンクをはったり、publicフォルダ以下のimages、javascripts、stylesheetsフォルダに格納されてるリソースファイルに対しtouchコマンドを実行する。

Railsだと構成上、↑の処理をしてくれて便利だけど、Rails以外のアプリケーションでは↑のような構成も無いので、デプロイの途中でエラーになる。

そんなRails以外のアプリケーションでCapistranoを使う場合、↓のサイトで紹介されてるように、deploy.rb内で、該当するCapistranoのタスクをオーバーライドする必要がある。

CapistranoをRails以外で使う方法 - jesterseraの日記

cap deploy:updateすると↓のupdate_codeがコールされる。

task :update_code, :except => { :no_release => true } do
  on_rollback { run "rm -rf #{release_path}; true" }
  strategy.deploy!
  finalize_update
end

task :finalize_update, :except => { :no_release => true } do
  run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)

  # mkdir -p is making sure that the directories are there for some SCM's that don't
  # save empty folders
  run <<-CMD
    rm -rf #{latest_release}/log #{latest_release}/public/system #{latest_release}/tmp/pids &&
    mkdir -p #{latest_release}/public &&
    mkdir -p #{latest_release}/tmp &&
    ln -s #{shared_path}/log #{latest_release}/log &&
    ln -s #{shared_path}/system #{latest_release}/public/system &&
    ln -s #{shared_path}/pids #{latest_release}/tmp/pids
  CMD

  if fetch(:normalize_asset_timestamps, true)
    stamp = Time.now.utc.strftime("%Y%m%d%H%M.%S")
    asset_paths = %w(images stylesheets javascripts).map { |p| "#{latest_release}/public/#{p}" }.join(" ")
    run "find #{asset_paths} -exec touch -t #{stamp} {} ';'; true", :env => { "TZ" => "UTC" }
  end
end

ただ、今回はtouchコマンドだけを実行したく無かったので↑のfinalize_updateメソッドを見る限り、deploy.rb内で

set :normalize_asset_timestamps, false


と宣言すれば、touchコマンドは実行されなくなるので、エラー自体は無くなる。
この他にもやりたい処理がある場合は、↑のメソッドをオーバーライドする必要がある。