Travis CI + Ruby 2.1.10 環境下で curses gem のビルドが落ちる問題のワークアラウンド
TweetTL; DR
.travis.yml に以下のセクションを追加するとビルドが通ります。docker container を使っていない場合は、before_install
セクションで sudo apt-get install -y libgmp-dev
などとするとよいでしょう。
addons: apt: packages: - libgmp-dev
ワークアラウンドを見つけるまでの道のり
ことの発端
先日、Ruby 2.1.9 および 2.1.10 がリリースされたので、拙作のアプリ、rbtclk の .travis.yml ファイルに 2.1.10 を追加したらビルドが落ちました..
落ちたビルド (以下はログを一部抜粋)
Installing curses 1.0.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
/home/travis/.rvm/rubies/ruby-2.1.10/bin/ruby -r
./siteconf20160410-4346-18ebz4v.rb extconf.rb
checking for tgetent() in -ltinfo... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Docker image を使って落ちる原因をさぐる
ビルドがエラーで落ちたとき、Travis CI のビルドログに出てくる情報だけでは原因をさぐることが難しいです。そこで、Travis CI の docker image をローカルでビョーンとしてみました で紹介したように、Travis CI の Docker image を使うと超べんりです。
Docker image の中で Ruby 2.1.10 をインストールして、gem install curses -v '1.0.2'
してみたところ、もくろみ通り同じところで落ちて、mkmf.log に以下のようなログが残りました。
"gcc -o conftest -I/home/travis/.rvm/rubies/ruby-2.1.10/include/ruby-2.1.0/x86_64-linux -I/home/travis/.rvm/rubies/ruby-2.1.10/include/ruby-2.1.0/ruby/backward -I/home/travis/.rvm/rubies/ruby-2.1.10/include/ruby-2.1.0 -I. -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -fPIC conftest.c -L. -L/home/travis/.rvm/rubies/ruby-2.1.10/lib -Wl,-R/home/travis/.rvm/rubies/ruby-2.1.10/lib -L. -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,'/../lib' -Wl,-R -Wl,'/../lib' -L'/../lib' -lruby -lpthread -lrt -lgmp -ldl -lcrypt -lm -lc"
/usr/bin/ld: cannot find -lgmp
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5: return 0;
6: }
/* end */
「lgmp がないぞ💢」と怒られているので、libgmp-dev をインストールすると curses gem がビルドできるようになりました🍭
根本的な原因は謎ですが、ワークアラウンドを発見できたのでめでたしめでたし。
Travis CI でトラブルが起きたときは Docker image が超べんりなのでガンガン活用していきましょう💪