1. 概要
古き良きアセットパイプラインを使用するRailsアプリケーションから脱却し、
なんとかかんとか、Rails5.2 + Webpackerでアプリをつくりましたが、
今まで当たり前のようにOpsWorks
でデプロイしてきたので、デプロイでかなりつまりました。。。
Capistrano
とかItamae
を使うことも考えたり、
OpsWorks Chef 12
を使いカスタムクックブックを作成する道を模索したり、
はたまた、Elastic Beanstalk
でデプロイする道を模索したりしました。
が、弊社はちょっとしたフロントエンドの更新など、
ノンプログラマがデプロイを行うこともあるので、
なんとかOpsWorks
それもかわらぬChef 11
でできぬかと模索しました結果...
凄くシンプルな方法で行けることがわかりました。
この問題に囚われっぱなしだった1週間ぐらいを返してほしい・・・
この投稿が少しでも、同じ状況の方のお役に立てれば幸いです。
2. 対象者
この記事は以下の条件を全て満たす方が対象です。
1. Rails5.2 + Webpackerで可動するアプリが既に完成している
2. OpsWorks(Chef 11)でのデプロイは行える。
3. 手順解説
### 3-1. インスタンス立ち上げ直後の初回のみ必要な操作
この手順は不要になりました。
以下のdeploy hookの設定ファイルを作成するだけで、
インスタンス追加時も問題なくデプロイできました。
3-1. Chefのdeploy hookの設定ファイルを作成
該当のRailsアプリのルートディレクトリにdeploy
ディレクトリを作成し、
その中にbefore_migrate.rb
というファイルを作成する。
その中身は以下のように記載してデプロイするだけでOK。
ご自身のアプリ名
のところは、ご自身のRailsアプリ名をシンボルで入力してください。
たとえば、デプロイするアプリ名がrails_blog
であれば、:rails_blog
と入力します。
ハイフンを含むアプリ名はハイフンが自動的に_
アンダースコアになるそうですので、
確認しておりませんが、該当する場合は注意が必要です。
Chef::Log.info("Running deploy/before_migrate.rb")
env = node[:deploy][ご自身のアプリ名][:rails_env]
current_release = release_path
execute "config_nodejs" do
user 'root'
cwd current_release
command "curl --silent --location https://rpm.nodesource.com/setup_8.x | bash - "
end
execute "install_nodejs" do
user 'root'
cwd current_release
command "yum -y install nodejs"
end
execute "config_yarn" do
user 'root'
cwd current_release
command "curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo"
end
execute "install_yarn" do
user 'root'
cwd current_release
command "yum -y install yarn"
end
execute "yarn install" do
cwd current_release
command "yarn install"
environment "RAILS_ENV" => env
end
execute "webpack" do
cwd current_release
command "./bin/webpack"
environment({"RAILS_ENV" => env, "NODE_ENV" =>env})
end
3-2. assets:precompile
じゃだめなのか?
Webpacker
はbundle exec rails assets:precompile
にフックして、
yarn:install
とwebpack:compile
を実行してくれるとWebpackerの公式ドキュメントに有ります。
それに基づいてはじめは、deploy/before_migration.rb
内では、
bundle exec rails assets:precompile
を実行するようにしていました。
しかし、それでは何故かうまくいきませんでした。。。
bundle exec rails webpack:compile
や、
bundle exec rake assets:precompile
、
bundle exec rake webpack:compile
も試しましたが、
エラーでうまくデプロイできなかったり、デプロイで来てもRailsアプリが正常に動作しなかったりでした。
4. まとめ
本当に今回は手こずりました。
終わってみればシンプルなことなのですが、
そこにストレートに導いてくれる解説や情報がなく時間がかかりました。
この方法を見つける直前は、一回でプロイしてからSSh接続して、
yarn install
とNODE_ENV=production ./bin/webpack
実行して、
またOpsWorksからWeb Sever Restartするというめちゃめんどくさい方法でやっていました。
この方法が見つかってよかったです。
ご意見・ご質問遠慮なくコメントください。
またもっといい方法であったらぜひご教授お願いします。
特にインスタンスい追加時の初回の作業もChefで自動化したいです。