GitLabを5.0にアップデートしたらpush時にエラーが出るようになった件

初めに

GitLab 5.0 Release, Standing on Its Own Two Feet

先日、GitHubのOSSクローンであるGitLabが、4.2から5.0にメジャーバージョンアップ。 大きな変更としては、リポジトリ管理にGitoliteではなくGitLab-Shellを使用するようになったこと。

公式の手順に沿って5.0にしたところ、リポジトリにpushする時にエラーが発生するようになったので、調査したことと問題の解決方法をメモっておこうと思います。

環境

  • CentOS 5.6
  • GitLab 4.2(アップデート前)

アップデート方法

From 4.2 to 5.0 gitlabhq/gitlabhq Wiki

上記手順の通りにアップデートを実施。特に問題は出ずに、5.0にアップデートしたことをブラウザから確認できた。

エラー内容

エラーが発生したのは、GitLabで管理しているリポジトリにpushを行ったタイミング。エラー内容は以下の通り。

$ git push
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: hooks/update:10: undefined method `require_relative' for main:Object (NoMethodError)
remote: error: hook declined to update refs/heads/XXX_branch
To git@localhost:XXX_repository.git
 ! [remote rejected] XXX_branch -> XXX_branch (hook declined)
error: failed to push some refs to 'git@localhost:XXX_repository.git'

require_relativeメソッドが見つからなくて怒られている……。

調査

require_relativeとはなんぞや

Rubyist Magazine - Ruby 1.9.2 予告編

ruby1.9.2からcoreに追加されたメソッドらしく、処理内容は相対パスでライブラリを読み込むとのこと。

Rubyのバージョン確認した

なるほど、これはrubyのバージョンが古いのではないかと思い確認。

$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux]

問題なし!

push以外でエラーを発生させてみる

push以外でもエラーが出るのか気になったので、ブラウザからファイルを編集してcommitしてみたところ、下記のエラーが発生。

March 26, 2013 18:45 -> ERROR -> Command failed [1]: /usr/bin/git --git-dir=/home/git/gitlab-satellites/XXX_repository/.git push origin XXX_branch
remote: /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/shared_helpers.rb:2:in `require': no such file to load -- rubygems (LoadError)[K
remote: from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/shared_helpers.rb:2[K
remote: from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/setup.rb:1:in `require'[K
remote: from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/setup.rb:1[K
remote: error: hook declined to update refs/heads/XXX_branch[K
To /home/git/repositories/XXX_repository.git
! [remote rejected] XXX_branch -> XXX_branch (hook declined)
error: failed to push some refs to '/home/git/repositories/XXX_repository.git'

push時と異なるエラー……rubygemsがない?

gemの確認

$ gem -v
1.8.23

あった。

複数のrubyが入っていることを疑う

ruby on rails - no such file to load -- rubygems (LoadError) - Stack Overflow

「no such file to load -- rubygems」というキーワードで検索していると上記のQAを発見した。Railsで同じような問題が発生したらしい。

Eimantas氏の回答によると、複数のrubyが入っているとrubygemsのエラーが発生するらしいので、藁にもすがる思いで確認した。

rubyの配置場所を全て表示

$ which ruby
/usr/local/bin/ruby

$ which -a ruby
/usr/local/bin/ruby
/usr/bin/ruby

複数のrubyが入ってる!!

$ /usr/bin/ruby -v
ruby 1.8.5

古い!!!!

対処

古いrubyを削除

どうやら古いrubyはyum経由でインストールしたものらしい。まったく誰だよインストールしたのはと思いながら、下記コマンドで古いrubyを削除。(後にインストールしたのは自分だと発覚)

$ sudo yum remove ruby

再挑戦

再度pushを試してみる。

$ git push
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@localhost:XXX_repository.git
   2ae45af..e77fe86  XXX_branch -> XXX_branch

来たー!成功!Eimantasさんありがとう!

まとめ

環境をリセットせず使いまわすと痛い目を見る良い例ですね。同様の問題で困っている人の役に立てられれば幸いです。