herokuCIでrailsのテスト(rspec)を回したいなと思ったんですが、意外と設定に戸惑ったのでメモ。
やりたいこと
下記の構成でテストを回せるようにする。
- rails
- rspec
- heroku ci
deployするたびにherokuCIでテストが回るようにする。
やったこと
- githubとの連携
- review appを作成
- herokuCIの設定( https://devcenter.heroku.com/ja/articles/heroku-ci )
- pipelineのherokuCIで環境変数を設定
- test用のdbはapp.jsonで設定
app.jsonの設定
app.jsonでdbの設定をする。
{
"environments": {
"test": {
"addons": ["heroku-postgresql"],
"scripts": {
"test-setup": "bin/rails db:migrate db:seed",
"test": "bundle exec rspec"
}
}
}
}
上記はseed情報をいれて、addonも設定している。
https://devcenter.heroku.com/ja/articles/heroku-ci#add-ons
in-dynoといってtest用のプランがあるが、設定しなくても勝手にそのプランになる。一時的にdbが作成され、testが終わると破棄される。
詰まったところ
herokuCIの環境変数設定
RACK_ENV,RAILS_ENVはtestに設定。review app自体はproductionで設定。review appは最初developmentなのかなと思ったが、developmentだとconfig.web_console.whitelisted_ipsでip制限に引っかかる。まあ、消してしまえばいよかったんだがproductionにする方向で。
もし別DBを設定するなら
何かしらの理由でtest用の一時的なDBではなく、本番でも使えるDBをtestに使う場合。
testの際にdbを削除できるようにDISABLE_DATABASE_ENVIRONMENT_CHECKを1に
testの際にはdbを毎回削除するのでDISABLE_DATABASE_ENVIRONMENT_CHECKを1にしておく。これがないとdbが削除できないようになっている。これは絶対にtest環境以外では設定しないように。これを設定しているとdbのデータが壊れるのでこの環境変数を設定している環境でのdbは必ず使い捨てのものに
DBを消してもいいものに
herokuだとheroku postgresがappごとに契約できる。testのdbは削除できる使い捨てのものがいいのでreview appのものを設定している。(これは好み
javascript(webpacker)のbuildpackを使う場合
compileのエラー
なぜかrubyのbuildpackのみではtestを実行できなかった。エラー内容としてはcompileのエラー。compileを都度してほしいとのことでこの辺buildpackでなんとかしてくれそうだがrubyだけだと難しいのでnodeのbuildpackも設定。
下記のapp.jsonにてテストのコマンドを実行
{
"environments": {
"test": {
"scripts": {
"test": "bundle exec rails webpacker:compile",
"test": "bundle exec rspec"
}
}
},
"buildpacks": [
{
"url": "heroku/nodejs"
},
{
"url": "heroku/ruby"
}
]
}
rubyを後にして最終的にはrubyで終わるようにする。上記でbuildpackの設定とrspecの前にcompileを実行するようにコマンドを設定する。