MroongaをTravis CIのVM上のUbuntu 14.04で動作させる
今年の9月に入ったあたりから、全文検索用のMySQLストレージエンジンMroongaを使っているRailsアプリ*1のTravis 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」