個人の Web サービス開発でモノレポ構成のアプリのサブディレクトリを Heroku にデプロイするため、どのような方法があるのかを調べましたのでまとめます。
前提
root のディレクトリから API とフロントをサブディレクトリに分けて開発しており、 API(Rails製) 用のサブディレクトリをデプロイします。
ディレクトリ構成は下記の通りです。
$ tree -L 2
.
├── README.md
├── api
│ ├── Dockerfile
│ ├── Gemfile
│ ├── Gemfile.lock
│ ├── Rakefile
│ ├── app
│ ├── bin
│ ├── config
│ ├── config.ru
│ ├── db
│ ├── heroku.yml
│ ├── lib
│ ├── log
│ ├── public
│ ├── storage
│ ├── tmp
│ └── vendor
├── docker-compose.yml
├── front
│ ├── Dockerfile
│ ├── README.md
│ ├── components
│ ├── node_modules
│ ├── nuxt.config.js
│ ├── package.json
│ ├── pages
│ ├── plugins
│ ├── static
│ ├── store
│ ├── tsconfig.json
│ └── yarn.lock
└── netlify.toml
なお、api/
には heroku.yml
というファイルがあります。 このファイルを利用して、Docker イメージをビルドしデプロイしています。
heroku.yml を使用して Docker イメージをビルドする | Heroku Dev Center
1. ビルドパックを使う
- 👍 ソースコードの追加不要で GitHub のリポジトリと連携し自動デプロイができる
調べた中では一番ノーコードで実現できるため良さそうでしたが、heroku.yml
を利用した Docker イメージのデプロイは対応しておらず断念。
参考: Deploy to Heroku / GitHub Actions
2. GitHub Actionsを使う
- 👍 GitHubと連携できるので Git の秘匿情報を隠蔽できる
- 👎 Herokuの秘匿情報はGitHub Secretsで管理するので少し手間
heroku.yml
を利用した Docker イメージのデプロイが成功し、この方法を採用。
参考: GitHub - timanovsky/subdir-heroku-buildpack
3. git subtreeコマンドを使う
- 👍 ローカルのターミナルや GitHub、CircleCI どこからでも実行でき汎用性が高い
- 👎 Git や Heroku の秘匿情報の管理が手間
参考: git - Automated heroku deploy from subfolder - Stack Overflow
補足) Netlifyにサブディレクトリをデプロイする方法
今回は、フロントエンド用(Nuxt.js製) のfront/
ディレクトリを Netlify にデプロイしました。
こちらは ドキュメントが整備されており、 root のディレクトリに netlify.toml
ファイルを配置し、サブディレクトリを定義することで簡単に実現できました。