884 Log

作成日: 2023年8月21日最終更新日: 2022年8月29日
プログラミング
Heroku

Herokuにmonorepoプロジェクトをデプロイした時に少しハマった

業務委託で関わってる案件でmonorepoなプロジェクトをHerokuにデプロイしようとしたのですが、結構ハマったので備忘録として書いておきます。

ディレクトリ構造

$ tree ./ -a -L 1
./
├── .git
├── .gitignore
├── admin
├── shared
├── frontend
└── backend

sharedディレクトリはプロジェクト共通のパッケージで、admin、frontend、backendからシンボリックリンクで参照させる構成をとっている。

各プロジェクト直下で、`npm install ../shared`とすることで各プロジェクトのnode_modulesにシンボリックリンクとなってインストールされる。

できなかったやり方

1.git subtree splitを使う

git subtree split で切り出すことによりルートディレクトリを変更してpushすることができる。

$ git push --force heroku git subtree split --prefix backend HEAD:master

だが、この例だと、backendディレクトリだけを切り出すので他のディレクトリが削除されてしまい、sharedディレクトリを見つけることができなくなってしまう。

よってダメだった。

2. heroku-buildpack-monorepoを使う

デプロイ手段としてgitやgithub actionsで処理するのではなく、Heroku buildpackに任せるという選択肢もあり、Herokuの認証が不要なためデプロイをHerokuだけで完結することができるが、この方法もダメだった。

issueにこんなのも上がっていたが、どれもうまく動かなかった。

https://github.com/lstoll/heroku-buildpack-monorepo/issues/7

では、なぜできないのか

  • デプロイ対象のディレクトリ以外を削除してしまう動作に問題がありそう。

→ 全てのディレクトリ残したまま、特定のディレクトリに対してビルドできるようにしたい。

実現できたやり方

色々試行錯誤した結果、このbuildpackで目的の条件を達成することができた。

heroku-buildpack-select-subdirを使う

https://github.com/Pagedraw/heroku-buildpack-select-subdir

これを使うことによって、他のディレクトリを残したままデプロイを行うことができた。

Deprecatedとなっているが、躊躇せず使って大丈夫そう。

移行先に書かれているものは全てうまくいかなかった。おそらく上述した問題と同様。

https://github.com/timanovsky/subdir-heroku-buildpack

https://github.com/lstoll/heroku-buildpack-monorepo

使い方

使い方はBUILDPACKという環境変数に

backend=https://github.com/heroku/heroku-buildpack-nodejs.git

ような形で形で設定することで、

backendに配置されているProcfileをルートディレクトリにコピーしてアプリを起動させることができる。

なので、各ディレクトリにはProcfileを作成しておく必要がある

ハマりポイント

  • Procfileの起動コマンド

backendディレクトリがルートディレクトリではないので、一度backendディレクトリに移動してからコマンドを実行する必要がある。

よって、--prefixを使うことでbackendのディレクトリ上でコマンドを実行するようにしなければいけなかった。

web: npm run start:prod --prefix backend

感想

heroku-buildpack-select-subdirを使ったらすぐにできた。

Deprecatedとなっていたので、他のbuildpackで試行錯誤して時間を溶かしてしまった。。

時期にHerokuが有料となるので、そろそろ引っ越したい気もする。

それでは今回はこの辺で!