個人アプリの開発ではHerokuを使うことが多いのですが、最近webpack + Railsの環境を使っていてデプロイまわりで少しハマったので、デプロイ方法をメモしておきます📝
Herokuのデプロイついて
使用する Heroku buildpack によって、アプリケーションの開発プロセスや、コードの実行時に用意すべきアセットやランタイムが決まります。複雑なアプリケーションで複数の言語を実行する場合は、1 つのアプリケーションで複数の buildpack を使用することもできます。
Herokuのデプロイというのはbuildpack
という仕組みを使って行われているようです。
buildpack
は様々な言語をサポートしていて、これらによってpushするだけでデプロイされるようなheroku のシンプルなしくみが実現出来ているんですね。
Herokuによる標準のRailsデプロイ
Railsアプリケーションにおいて、デフォルトでは以下のようなbuildpack
な設定になっています。
$ heroku buildpacks === app-name Buildpack URLs 1. heroku/ruby
RubyのbuildpackではRailsのサポートが入っているので、assets:precompile
がデプロイ時に実行されsprokets
、webpacker
で管理しているassets等のファイルのbuildが走ります。
しかし、sprokets
もwebpacker
も使わずwebpack
のみで管理しているいる場合、assets:precompile
は使わないのでフロントエンドまわりのファイルのbuildが走りません。。。
WeboackなRailsをHerokuにデプロイする
ではどうするかというと、node
のbuildpack
を追加して、yarn install
及びyarn build
が実行されるようにします。
$ heroku buildpacks:add --index 1 heroku/nodejs $ heroku buildpacks === app-name Buildpack URLs 1. heroku/nodejs 2. heroku/ruby
node
のbuildpack
では、build
コマンドが実行されます。そのためpackage.json
のscripts
内のbuild
にデプロイ時に実行するコマンドを定義しておきます。
{ "scripts": { "build": "webpack --mode=production",
これにより以下のようにwebpack
のbuild
後にRails
のdeploy
が走るようになっています✨
-----> Node.js app detected -----> Creating runtime environment NPM_CONFIG_LOGLEVEL=error USE_YARN_CACHE=true NODE_ENV=production NODE_MODULES_CACHE=true NODE_VERBOSE=false -----> Installing binaries engines.node (package.json): unspecified engines.npm (package.json): unspecified (use default) engines.yarn (package.json): unspecified (use default) Resolving node version 12.x... Downloading and installing node 12.19.0... Using default npm version: 6.14.8 Resolving yarn version 1.22.x... Downloading and installing yarn (1.22.10) Installed yarn 1.22.10 -----> Restoring cache - yarn cache -----> Installing dependencies Installing node modules (yarn.lock) yarn install v1.22.10 Done in 12.10s. -----> Build Running build (yarn) yarn run v1.22.10 $ webpack --mode=production Done in 19.50s. -----> Pruning devDependencies yarn install v1.22.10 warning Ignored scripts due to flag. Done in 5.04s. -----> Caching build - yarn cache -----> Build succeeded! -----> Ruby app detected -----> Installing bundler 2.1.4 -----> Removing BUNDLED WITH version in the Gemfile.lock -----> Compiling Ruby/Rails -----> Using Ruby version: ruby-2.7.1 -----> Installing dependencies using bundler 2.1.4 Bundle complete! 20 Gemfile dependencies, 55 gems now installed. -----> Detecting rake tasks -----> Detecting rails configuration Released v15