困ったこと
- Gemfile.lock には platform 情報が入ってしまうので、Un*x系 のプラットフォームと Windows を混ぜてしまうと Gemfile.lock に diff ができる
- Heroku は Windows で作った Gemfile.lock を無視する
このコンボで Windows で Rails アプリの開発に参加すると Gemfile.lock が無視されるので Heroku に git push 後の bundle install で意図せず各種 gem のバージョンが上がって build に失敗したりする。
解決策
- Gemfile.lock の diff だけを commit しておく
- この commit を削除するか revert して Heroku に git push
CIでどうする
- CircleCI を使っている
- 特定の branch にだけ Windows からの commit が入るようにしてある
- 専用の staging 環境を用意してあり CircleCI から Heroku に deploy している
前提で、以下のような deploy スクリプトを用意した。
git config --global user.name <name>
git config --global user.email <addr>
git checkout .
git revert --no-edit <hash>
git push -f git@heroku.com:{repos} <branch>:master
基本的には CircleCI オススメ設定の
git push <remote> $CIRCLE_SHA1:master
と書いている部分を、
git push <remote> <branch>:master
に変えたうえで、Gemfile.lock に変更が入った commit を revert で取り除いたのち push しているだけ。
※ 途中 checkout してるのは bundle install やら npm install の際に commit 済みのコードが一部書き換わるため。
今回の方法で解決できないこと
今回のケースは基本が mac での開発で、途中一部に Windows を混ぜたものなので Heroku に無視されない Gemfile.lock が用意できており、Gemfile.lock の diff だけを消す方法を採れたが、最初から Windows で開発する場合は Linux を用意する1か、JRuby 使えと Heroku さんは仰っております。
Getting Started on Heroku with Ruby (Microsoft Windows) | Heroku Dev Center
まぁ LL Web を Windows でやっちゃダメというのを改めて思ったのでした。
Windows で開発する場合? ↩