GitLab 6.4にアップデートする際、libv8のインストールに失敗する

環境

CentOS 5.6(32bit)
GitLab 6.3(アップデート前)

問題

GitLabを手順に従って6.4にアップデートすると、 bundle install時にlibv8のインストールエラーが発生する。

エラー内容

Installing libv8 (3.16.14.3)
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/local/bin/ruby extconf.rb
creating Makefile
Compiling v8 for ia32
Using python 2.4.3
Unable to find a compiler officially supported by v8.
It is recommended to use GCC v4.4 or higher
Using compiler: g++
Unable to find a compiler officially supported by v8.
It is recommended to use GCC v4.4 or higher
Traceback (most recent call last):
  File "build/gyp/gyp", line 15, in ?
    import gyp
  File "build/gyp/pylib/gyp/__init__.py", line 8, in ?
    import gyp.input
  File "build/gyp/pylib/gyp/input.py", line 14, in ?
    import gyp.common
  File "build/gyp/pylib/gyp/common.py", line 395
    with open(source_path) as source_file:
            ^
SyntaxError: invalid syntax
gmake: *** [out/Makefile.ia32] エラー 1
/home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/libv8-3.16.14.3/ext/libv8/location.rb:36:in `block in verify_installation!': libv8 did not install properly, expected binary v8 archive '/home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/libv8-3.16.14.3/vendor/v8/out/ia32.release/obj.target/tools/gyp/libv8_base.a'to exist, but it was not found (Libv8::Location::Vendor::ArchiveNotFound)
        from /home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/libv8-3.16.14.3/ext/libv8/location.rb:35:in `each'
        from /home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/libv8-3.16.14.3/ext/libv8/location.rb:35:in `verify_installation!'
        from /home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/libv8-3.16.14.3/ext/libv8/location.rb:26:in `install!'
        from extconf.rb:7:in `<main>'
GYP_GENERATORS=make \
        build/gyp/gyp --generator-output="out" build/all.gyp \
                      -Ibuild/standalone.gypi --depth=. \
                      -Dv8_target_arch=ia32 \
                      -S.ia32  -Dv8_enable_backtrace=1 -Dv8_can_use_vfp2_instructions=true -Darm_fpu=vfpv2 -Dv8_can_use_vfp3_instructions=true -Darm_fpu=vfpv3

Gem files will remain installed in /home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/libv8-3.16.14.3 for inspection.
Results logged to /home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/libv8-3.16.14.3/ext/libv8/gem_make.out
An error occurred while installing libv8 (3.16.14.3), and Bundler cannot continue.
Make sure that `gem install libv8 -v '3.16.14.3'` succeeds before bundling.

原因

libv8をインストールする場合、通常はバイナリ版を対象とするが、バイナリ版は64bit版しか用意されていない
なので、ソースコードからのコンパイルとなるが、CentOS 5.8にデフォルトでインストールされているgccpythonのバージョンが古い為、コンパイルエラーとなってしまう。

必要となるgccpythonのバージョン

対応手順

gcc 4.4のインストール

sudo yum install gcc44-c++

pyhon 2.6のインストール(epelリポジトリが必要)

sudo yum install python26

このままだとデフォルトで入っているpython 2.4が使われてしまうので、gitユーザーだけ2.6が使われるように設定

mkdir ~/bin
ln -s /usr/bin/python2.6 ~/bin/python
echo 'export PATH=~/bin:$PATH' >> ~/.bashrc

再度 bundle install

cd ~/gitlab

# MySQL
sudo -u git -H bundle install --without development test postgres --deployment

# PostgreSQL
sudo -u git -H bundle install --without development test mysql --deployment

後は公式アップデート手順の通りに実行でOK

その他

上記手順でpython2.6へのリンクを削除していないが、GitLabが使用しているlibv8のバージョンが上がったら問題が再発するので、残していたほうが良さげ。

参考にさせて頂いた記事

YAPC::Asia Tokyo 2013 の1日目に参加してきた

f:id:waniji:20130920095442j:plain

YAPC::Asia Tokyo 2013に参加してきました。YAPC初参加!
予定があったので1日目しか参加できませんでしたが、それでも楽しむことが出来ました。
運営、スタッフ、スピーカーの皆様、ありがとうございます。

参加したセッションの感想や自分メモなどをつらつらと書いていこうと思います。

今時のカジュアルなデータベース関連開発

DBIx::Schema::DSLとGitDDLがとても良さそう。
シンタックスチェックが楽な点とDRYに書ける点は大きなメリットですね。
ブランチ切り替えた後のDB構成変更は非常に手間なので(schemaに紐付くオブジェクト全DROP&CREATEとかしてた)、GitDDLは導入してみる価値ありそうだなーと感じます。

Redisは使ったことないですが、同率問題が微妙だなーと書籍を読んでいて思っていたので、どのように解決しているか興味あります。後でソースを読もう。

ランチセッション

f:id:waniji:20130920121419j:plain

美味しいお弁当を頂きました。

Windows Azureのお話を聞いたのですが、これがかなり良さげで、調べもせずにAWS一択だよなーと思っていたのを考え直さなきゃいけないですね……。

Inside amon2-livedoor-setup.pl with web application development 2013

使う道具を揃えることの重要性は、私も常々感じています。知見が共有出来ないのはその通りだし、一部の人しか知らないとリスク高いですし。
コピペプログラミング嫌うくせに他のプロジェクトからコピペするっていうのは、かなりグサッと来ますね……。
知らない設定があって、そこに問題が起きた時に説明が出来ないっていうのも……ウッ。

はてなのサーバ管理ツールの話

RRDToolのグラフが昭和っぽいという発言に笑いました。
いろんなツール使って情報がとっちらかるというのは確かにありがち。
運用周りは業務の課題としてあがってるので、もうちょっと勉強しないとなー…。
予測グラフ欲しいですよね。とてもやりたい。

Lightning Talks Day 1

ショートコントやキンブレが出てきた時点で何でもアリだということを悟りました。
メモを取ることを忘れてたのであまり覚えていませんが、んだっちゃだれという方言だけは覚えています。

その他

f:id:waniji:20130926221711j:plain

「雅なPerl」が頒布されてたので購入。やった!

f:id:waniji:20130926233813j:plain

スカイアークさんのトートバッグ。かわいい。

CentOS5系でGitLab5.2にアップデートするとbundle installでこける

環境

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

問題

GitLabのバージョンを5.1から5.2にアップデートすると、
bundle install時にcharlock_holmsのインストールエラーが発生する。

原因

CentOS5系の標準リポジトリで提供されているICUは3.6だが、
GitLab 5.2が使用するcharlock_holms 0.6.9.4が要求するICUは4.2以降なので、
bundle install時にエラーが発生した。

何故GitLab5.2で発生したか

charlock_holms 0.6.9.3から、ICU 4.2で組み込まれたStringByteSinkを使うようになった。
GitLab 5.1ではcharlock_holms 0.6.9を使用していたが、
GitLab 5.2からcharlock_holms 0.6.9.4を使用するようになったので、
今回のアップデート時に問題が発生した。

対応

古いICUを削除

sudo yum remove libicu

StringByteSinkが組み込まれたICUのソースを取得し展開

cd /tmp
wget http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-src.tgz
tar xvf icu4c-4_2_1-src.tgz

コンパイルしてインストール

cd icu/source
./configure
make
sudo make install

後はbundle installして、エラー無くインストールされることを確認

bundle install --without development test postgres --deployment

リモートからJenkinsのジョブが実行中であるか確認する

ジョブがキュー内に存在するか確認する

以下のURLにアクセスしてジョブの情報を取得する。

http://JENKINS_URL/job/JOBNAME/api/json

取得したjsonにinQueueという要素があり、値がtrueであればキュー内にジョブが存在する。

実行中か確認する

以下のURLにアクセスしてジョブの情報を取得する。

http://JENKINS_URL/job/JOBNAME/api/json

lastBuildとlastCompletedBuildのnumber要素の値が異なれば、ジョブが実行中である。

isBuildみたいな要素があると良いなーと思ってます。

もうすぐ春だからPerlCasual#05に行ってきた

f:id:waniji:20130329195759j:plain

PerlCasual#05に行ってきました。

PerlCasual #05 : ATND

スーツで行ったので門前払いされるかとびくびくしていましたが、門番の方に通して頂けて安心しました。

個性的な登壇者の方々のお話を聞いて、Perl初心者が思ったことなど書き連ねようと思います。

何個か作っていれば、慣れる!

@ruikさんのスライドに出てきた言葉なのですが、悩める人達を励ますとてもいい言葉だと思います。
stfuawscをマイルドにした感じですかね。

初心者の私は、

  • 何が良い書き方なんだろう…
  • このモジュール使ってていいのかな…
  • こんな書き方をすると椅子が飛んでくるんじゃ…

ということをうだうだ考えたりして、コードを書く手が止まったり、モチベーションが下がってしまったりします。

もちろん試行錯誤することは大事ですが、囚われ過ぎるのはとても良くない。
それであれば、とりあえず突き進み後で後悔すれば良いんだなと思います。
最初からパーフェクトに出来る人はいませんし、以前した失敗を次に生かしていけば、おのずと洗練されていくはずです。

モチベーションは有限

モチベーションが有限っていうのは本当にその通りで、最初に持った熱は時間とともに冷めていっちゃいます。

  • ミニマルスタートでまず動くものを by @koba04さん
  • 仲間を作ってカジュアルに楽しむ by @uzullaさん

上記の提言がありましたが、とても有効な策だと思います。

ライブコーディング

今回参加して一番面白いと感じたのはこのセッションです。

エディタをどのように使いこなし、エラーが出たらどのように確認し、どういったコードを書くのかをリアルタイムで見れる機会はそうそう無いし、ましてや一緒に仕事が出来ない社外の人となればとても貴重だと思います。

Live Coding Casualが今後開催されるなら、是非参加してみたいです。(閲覧者として)

Perl界隈には面白い人たちが集まっている

おっぱいやからあげなどが出てくる個性的なLTの後に真面目なLTがあったりとカオスでしたが、とても楽しい時間を過ごすことが出来ました。

主催者の@yusukebeさん、登壇者の方々、運営者の方々、会場を提供して頂いたNHN Japanさん、ありがとうございました!

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さんありがとう!

まとめ

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