よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

OpsWorksでRailsをデプロイする際にasset:precompileを実施する方法

OpsWorksでRailsアプリケーションを運用するために知っておくべきことを数回に渡り本ブログで紹介していきます。

今回はOpsWorksのデプロイフックを利用する方法です。

Railsでは、JavaScriptCSSを結合して圧縮することで、ブラウザがウェブページを描画するために必要となるリクエスト数を削減する仕組み(Asset Pipeline)が用意されています。

この仕組みを利用するには、rake asset:precompile というタスクを実行する必要がありますが、OpsWorksのRailsアプリケーションのデフォルトのデプロイ処理ではこのタスクを実行してくれません。

しかし、OpsWorksにはデプロイフックという仕組みが用意されています。

それではその仕組の利用方法を紹介します。


まず、${RAILS_ROOT}にdeployというディレクトリを作成し、その中にbefore_migrate.rbという名前で以下のようなファイルを作成し、リポジトリに送信しておいてください。


${RAILS_ROOT}/deploy/before_migrate.rb

Chef::Log.info("Running deploy/before_migrate.rb")
env = node[:deploy][:アプリケーション名][:rails_env]
current_release = release_path

execute "rake assets:precompile" do
  cwd current_release
  command "bundle exec rake assets:precompile"
  environment "RAILS_ENV" => env
end


上記ソースコード内のアプリケーション名のところは、AppsレイヤのNameにて指定した名前になりますが、その名前にハイフンが含まれている場合は、アンダースコアに変換されるようなので注意が必要です。
例えば、Nameに sonic-garden を指定した場合は、アプリケーション名が sonic_garden になるようです。

これでデプロイリクエストを発行した際に、マイグレーション実行前に rake asset:precompile が実行されるようになります。

今回はアセット機構の使い方でしたが、他の処理も実施可能ですので、ぜひいろいろお試しください。


次回は、アプリケーションからRDSなどのデータベースへの接続するための情報をOpsWorksから渡す方法をご紹介します。