読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

RailsでCircleCIがMySQL5.6をサポートしていないので苦労した話

かつて日記に書いたんだけど、MySQL5.6から導入されたinnodbのfull text indexは割と便利。
http://d.hatena.ne.jp/ria10/20140107/1389071672

が、innodbのfull-text indexを利用した機能があるRailsアプリをCircleCIでテストしようとすると絶対にコケる。
なぜなら、CircleCIでサポートされているMySQLは5.5だから。
https://circleci.com/docs/environment#databases

こんなときにどうしたか、という話。



サポートに問い合わせる

もしかしたら裏メニューで5.6がサポートされているかもしれない。まずは問い合わせよう。
CircleCIに問い合わせ窓口がわかりやすくある。

英語がわからない?たぶん中学生レベルの英語力があれば通じる文はできるよ。

が、今日はあっちもお休みのようで、まだ返事がない。
とりあえず、該当機能のテストを飛ばす方法を考える。

テストをコメントアウト

CIで走らせたくないコードは以下の要領でカットできる。
https://circleci.com/docs/dont-run

CIのためのコードを入れるっていうのは、テストコードだとしても正直どうかと思うんだけど、今回はMySQL5.6がサポートされるまでの一時的なworkaround(stackoverflowとかで超頻出な用語だから覚えておこうぜ)ってことで、気にしないことにする。

もうこんな感じで豪快にif文で囲んでやった。

if !ENV['CI']
  RSpec.describe TestWhichUsesFullTextIndex, type: :model do
~snip~
end

migrationもコメントアウト

これみたいに、full-text indexを使うときはきっとmigrationにもindex生成のmigrationが存在するだろう。
http://d.hatena.ne.jp/ria10/20140107/1389071672

もちろん、これもCiricleCIでは無慈悲にコケる。つまり、上記でテストをコメントアウトしてるけど、本当はテストが走るところまでもいかない。

なので、migrationも走らないようにする。

  def self.up
    execute 'create fulltext index foo_fulltext_index on foo (content);' if !ENV['CI']
  end

  def self.down
    execute 'drop index foo_fulltext_index on foo;' if !ENV['CI']
  end

あー、気持ち悪いのう。

CircleCIの設定を変える

migrationを飛ばして、テストも走らないようにしても、テストは無慈悲にコケる。
なぜなら、CircleCIのデフォルトの挙動はdb:migrateせずにbundle exec rake db:create db:schema:load --traceするからだ。

さすがにschema.rbだったりstructure.sqlをこれまでのように編集するのはムリなので、CircleCIの設定を変えて、db:schema:loadじゃなくてdb:migrateするようにする。

circle.yml

database:
  override:
    - mv config/database.yml.ci config/database.yml
    - bundle exec rake db:migrate

このように、DB廻りの設定を上書きする。configファイルの部分は本質的にはいらないんだけど、db:migrateのところだけ変更するってことができないようなので、しょうがなく、そこもoverrideする。このときdatabase.yml.ciなんて存在してなかったのだけど、このために作った。こういうのマジ辛い。

default: &default
  adapter: mysql2
  encoding: utf8
  collation: utf8_general_ci
  reconnect: false

test:
  <<: *default
  username: ubuntu
  password:
  database: circle_test

この設定はhttps://circleci.com/docs/environment#databases

Both postgres and mysql are set up to use the ubuntu user, have a database called circle_test available, and don't require any password. The other databases should not need any specific username or password, and should just work.

って書いてあったのでこう書いてみたら通った。こうじゃなくても行けるかもしれない。もうどうでもいい。


で、ここまでやったら、ようやくCircleCIでテストが通った。はぁ。。。MySQL5.6がGAになってから2年ですよ?
冒頭の問い合わせの返事がいいものであることに期待。。