valid,invalid

関心を持てる事柄について

monorepo 構成の Git repository の sub directory を heroku にデプロイする

(追記) sub directory をデプロイしたり、いちレポジトリで multi applications のデプロイをサポートする buildpack があると元同僚の id:kamatama41 から教えてもらったので追記しました。ありがとうございます!


以下のように Git root directory ではなく sub directory にデプロイしたいアプリケーションが存在する場合を想定。

$ tree -L 2
.
├── .git
├── backend
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── LICENSE
│   ├── README.md
│   ├── Rakefile
│   ├── app
│   ├── bin
│   ├── config
│   ├── config.ru
│   ├── db
│   ├── lib
│   ├── public
│   ├── test
│   └── vendor
└── frontend

git subtree split を使う

git subtree split で切り出して push する。

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

--force しているしあまり良くなさそう。もっと良いやり方が ~あると思う~ あったがとりあえずメモを残しておく

いま趣味で作っている Good First Issues を探す web application のバックエンドはこの方式でデプロイしてい ~る。~ たが、heroku-buildpack-monorepo を使うやり方に切り替えた。

https://goofi.netlify.com/

github.com

(以下、追記)

buildpack を使うやり方

heroku-buildpack-select-subdir

heroku-buildpack-select-subdir を使うやり方。

Deploy Lerna Packages to Heroku | Jake Trent を参考にしてやってみた。ほとんど手順が同じなので詳述はしないが、実行したコマンドだけ載せておく。

# sub directory に移動して heroku app をつくる
$ cd backend && heroku create ohbarye-monorepo-test

# sub directory を build するための buildpack を設定する
$ heroku buildpacks:set -a ohbarye-monorepo-test https://github.com/Pagedraw/heroku-buildpack-select-subdir

# デプロイする application が使用する buildpack を指定する. 今回は Rails application で試したので heroku-buildpack-ruby 
$ heroku config:add BUILDPACK='backend=https://github.com/heroku/heroku-buildpack-ruby' -a ohbarye-monorepo-test

# remote repository を登録
$ heroku git:remote -a ohbarye-monorepo-test

# あとはいつもどおり push するだけ. root directory からでも sub directory からでも push できる
$ git push heroku master

# 起動確認
$ open https://ohbarye-monorepo-test.herokuapp.com 

Procfile の書き方

1点だけハマったのは、Procfile に書いた起動コマンドでアプリケーションの起動に失敗したこと。

web: bundle exec rails server -p $PORT

これはこのコマンドを実行するコンテキストが root directory のままだったことによる。この buildpack はそこまで面倒を見てくれない。Procfile に以下のように cd コマンドを追記することで解決できた。

web: cd backend && bundle exec rails server -p $PORT

heroku-buildpack-monorepo

heroku-buildpack-monorepo を使うやり方。

こちらも実行したコマンドだけ載せておく。

# sub directory に移動して heroku app をつくる
$ cd backend && heroku create ohbarye-monorepo-test

# sub directory を build するための buildpack を設定する
$ heroku buildpacks:add -a ohbarye-monorepo-test https://github.com/lstoll/heroku-buildpack-monorepo

# アプリケーションの root になる sub directory を指定する
$ heroku config:add APP_BASE=backend -a ohbarye-monorepo-test

# 公式 README にはないが、デプロイする application が使用する buildpack を指定する必要がある
# 今回は Rails application で試したので heroku-buildpack-ruby
# buildpack は2つ必要なので `set` でなく `add` を使う
$ heroku buildpacks:add heroku/ruby

# remote repository を登録
$ heroku git:remote -a ohbarye-monorepo-test

# あとはいつもどおり push するだけ. root directory からでも sub directory からでも push できる
$ git push heroku master

# 起動確認
$ open https://ohbarye-monorepo-test.herokuapp.com 

Procfile の書き方

heroku-buildpack-select-subdir と異なり cd backend のようなディレクトリ移動は必要ない。

web: bundle exec rails server -p $PORT

これは heroku-buildpack-monorepoAPP_BASE 環境変数に指定したディレクトリをそのまま root に持ってきているからだと、 git push 時の log を見るとわかる。実際に buildpack のコードを見てもわかる(けっこう力技だ)。

$ git push heroku master
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 363 bytes | 363.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Monorepo app detected
remote:       Copied backend to root of app successfully