ochalog

RubyとMediaWikiとIRCが好き。

MroongaをTravis CIのVM上のUbuntu 14.04で動作させる

今年の9月に入ったあたりから、全文検索用のMySQLストレージエンジンMroongaを使っているRailsアプリ*1Travis CIでのテストが、エラーにより実行できなくなった。ログを調べてみると、Travis CIのVM上で動作しているUbuntu 14.04へのMroongaのインストールに失敗し、そこで止まっていたことが分かった。

その後なかなか時間が取れず放置していたが、先日試行錯誤したところ、Mroongaのインストールに成功し、テストを実行できるようになった。今回はその際の修正方法をまとめてみる。

原因

原因は、Travis CIのVM上のUbuntu 14.04に標準でインストールされているMySQLと、MroongaのUbuntu 14.04用のパッケージが要求するMySQLのバージョンが異なることだった。前者は5.6系で、後者は5.5系となっていた。

ログ(例:Job #416.4 - cre-ne-jp/log-archiver - Travis CI)の該当部分は以下のようになっていた。

Build system information
(中略)
mysql version
mysql  Ver 14.14 Distrib 5.6.33, for debian-linux-gnu (x86_64) using  EditLine wrapper

(中略)

$ sudo apt-get install -y -V mysql-server-mroonga
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 mysql-server-mroonga : Depends: mysql-server-5.5-mroonga (= 7.06-2~trusty1) but it is not going to be installed
                        Depends: mysql-server (= 5.5.57-0ubuntu0.14.04.1) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

対策

対策として、標準でインストールされているMySQL 5.6をアンインストールし、Mroongaのパッケージが要求するMySQL 5.5をインストールできるようにすることが浮かんだ。問題発生前はVM上でMySQL 5.5のインストールされているUbuntu 12.04が動作していて、mroonga-server-5.5-mroonga パッケージが問題なくインストールできていた。

Mroongaのインストール手順

以下では.travis.ymlの before_install: 欄に書く内容を示す。

まず、Mroonga公式のUbuntu向けインストール方法の説明にしたがって、パッケージのインストールのための準備を行う。

universeリポジトリとセキュリティアップデートリポジトリを有効にする。

sudo apt-get install -y -V software-properties-common lsb-release
sudo add-apt-repository -y universe
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu $(lsb_release --short --codename)-security main restricted"

ppa:groonga/ppa PPAをシステムに追加する。

sudo add-apt-repository -y ppa:groonga/ppa
sudo apt-get update

通常は以上の準備の後 mysql-server-mroonga パッケージをインストールするが、ここでMySQL 5.6関連のパッケージをアンインストールする。アンインストール手順については、Benjamin Morel氏のGist「Install MySQL 5.7 on Travis-CI」を参考にした。

sudo apt-get remove --purge "^mysql.*"
sudo apt-get autoremove
sudo apt-get autoclean
sudo rm -rf /var/{lib,log}/mysql

これでMySQL 5.6関連のパッケージとデータがすべて除かれるので、MySQL 5.5系がベースになっている mysql-server-mroonga パッケージをインストールすることができる。

sudo apt-get install -y -V mysql-server-mroonga

ただ、このパッケージだけでは開発用のヘッダファイルがインストールされず、後に mysql2 gemのインストールで失敗してしまう。そのため libmysqlclient-dev を忘れずにインストールしておく。念のため、上記のパッケージの後でインストールするようにし、互換性のあるバージョンが確実に選ばれるようにした。

sudo apt-get install -y -V libmysqlclient-dev

ここまでの手順はシェルスクリプトにまとめておいた。

テスト用のMySQLアカウントの変更

Travis CIのVMに標準でインストールされているMySQLでは travis ユーザーが使えるように設定されているので、テスト時はそのユーザーを使うようにアプリ側で設定されているかもしれない。新しく入れたMySQLではそのような設定はされていないので、以降のテストでデータベースに接続できなくなる可能性がある。

そこで、テスト時に travis ユーザーを使うように設定している場合は、そのユーザーを用意するか、使わないようにする。今回はとりあえず root にパスワードなしで接続するように設定を変えたが、セキュリティ面ではよくないかもしれない。

Mroongaのインストール成功

以上の対策を行った結果、Mroongaのインストールに成功し、テストが無事実行できるようになった。

例:Job #434.4 - cre-ne-jp/log-archiver - Travis CI

まとめ

Travis CIのVM上のUbuntu 14.04では、Mroongaのインストールに失敗してテストが停止してしまう。その原因は、標準でインストールされているMySQLとMroongaのUbuntu 14.04用のパッケージが要求するMySQLのバージョンが異なることだった。

標準でインストールされているMySQL 5.6関連のパッケージをアンインストールした後でMroongaをインストールするという対策により、問題を解決することができた。

*1:irc.cre.jp系IRCサーバ群で使われているIRCログ記録・閲覧システム「log-archiver