GAE(nodejs|FE)でデプロイ中にbuildを含める方法
仕事でGAE Flexible EnvironmentにNodejsのアプリケーションをホスティングしています。その際、デフォルトの設定だとnpm install --productionが実行されるのでdevDependenciesのインストールはスキップされることに困っていました。
ちょっと前まで手元でビルドしてgcloud app deployを叩いており、さすがにイケてないなと思っていましたが、ついに解決しました。
まとめ
以下のようにgcp-buildをnpm scriptとして定義してあげるとデプロイ中にnpm run gcp-buildを行ってくれます。
{
"scripts": {
"build": "NODE_ENV=production webpack",
"gcp-build": "npm run build"
}
}
該当のDockerfile
nodejs-docker/Dockerfile.txt · GoogleCloudPlatform/nodejs-docker でhasBuildCommandがtrueだとnpm run gcp-buildを実行してくれる。
nodejs-docker/detect_setup.ts でpackgeJson.scriptsにgcp-buildが定義されていればhasBuildCommandがtrueになる。
nodejs-dockerリポジトリ
gcloud app deployを実行すると、Container Builderでイメージのビルドが行われている。nodejs-dockerはそのビルドに使われるDockerfileを保持するリポジトリ。
RailsもGCPで運用しており、GoogleCloudPlatform/ruby-dockerにDockerfileがあってトラブルがあったときはよくお世話になっています。
自前のDockerfileを使用する手もある
gcloud beta app gen-config --customでDockerfileを吐き出してくれて、app.yamlのruntime: customとすることで自分が作っているDockerfileを見てくれる。
あまりスタンダードなデプロイから離れたくなかったので今回の標準的な方法(?)を採用した。ただ、将来的にはGKEでk8sを動かす気がするのでDockerfileは自分で書くことになりそう。
正直ビルドプロセスをおまかせしたいからApp Engineを使っているのに、なんでソースコード見ることになるのか…