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年ですよ?
冒頭の問い合わせの返事がいいものであることに期待。。