heroku で Gemfile.lock を上げて更新できなくなった原因と対処

heroku には git を使ってアップロードするのですが、開発環境が複数あるために混乱を招いてデプロイできない状況に陥りました。原因は至極単純ですが複数の要因が重なっていたので、今後こんなことで詰らないように、また同じような現象でこまった人のために残しておきます(こんなミスするやつが他にいるとは思えないですが)。

要因 1. 公開鍵の設定

なんとも間抜けな話ですが、heroku コマンドを実行して Authoring が通ったことで満足し、鍵の存在を忘れていました (鍵の設定をしたのが遥か彼方だったことも原因の一つ)。この問題に関しては Permission denied が返ってきた段階で何となく読めたので以下のコマンドで対処しました。ついでに remote リポジトリの登録も。

$ heroku keys:add
$ git remote add heroku git@heroku.com:${MYAPP}.git

これで ~/.ssh/id_rsa.pub を heroku へのデプロイで使用できるようになり、鍵の設定はつつがなく終了しました。

要因 2. Gemfile.lock を git での追跡対象にしていた 更新していなかった

bundler によって生成される Gemfile.lock ファイルをよく理解せずに追跡対象に入れて heroku へアップロードしていたため Gemfile を更新してデプロイが出来なくなっていました。

-----> Installing dependencies using Bundler version 1.3.0.pre.2
       Running: bundle install --without development:test --path vendor/bundle --binstubs bin/ --deployment
       You are trying to install in deployment mode after changing
       your Gemfile. Run `bundle install` elsewhere and add the
       updated Gemfile.lock to version control.
       You have added to the Gemfile:
       * clockwork (= 0.4.1)
 !
 !     Failed to install gems via Bundler.
 !
 !     Heroku push rejected, failed to compile Ruby app

これがそのエラーメッセージですが、まんま Gemfile.lock どうにかしろよって言ってました。マジすんません。

$ git rm Gemfile.lock
$ echo Gemfile.lock >> .gitignore
$ bundle install
$ git add Gemfile.lock
$ git commit -m "Gemfile update."

これで追跡対象から外せました。
これで更新できました。

要因 3. ブランチを切った状態で master を push していた

そのまんまです。ほんともう恥ずかしい。いくら Gemfile.lock の対処をしてもずっと同じメッセージで怒られてるので思わずブランチの確認をしたら見事にブランチを切っていました。その状態でひたすら master ブランチをデプロイしてたらそりゃあ何も変わらないってもんですよね。

$ git checkout master
$ git merge hoge-branch
$ git push heroku master

でちゃんとデプロイできました。ちゃんちゃん。