4/19あたりからCircleCIでまたこのエラーがでるようになりました。

1session not created exception: Chrome version must be >= 65.0.3325.0

多分、Gemfileに入れていたchromedriver-helperとDockerイメージに入っているChromeのバージョンが衝突しているのが原因だと思います。以前の調査記事でも書いた内容です。

テスト周りの設定は何も変更していない中でこれが起きました。Dockerイメージが怪しいので見てみました。

circleci/ruby - Docker Hub

すると、こんな感じで最終更新が11 hours agoになっています。これ、怪しいかも?(これ書いてるのは4/19の夜です)

Docker側のChromeのバージョンが上がったような気がします。先日のエラーのときはChrome version must be >= 64.0.3282.0でしたから。

以前まではたまたまgem 'chromedriver-helper'とDocker側が一致していたのだと思います。なので前記事でも試したように、CircleCI側ではchromedriver-helperを使わないように分岐してあげ、CircleCI側でRebuild without Cacheしたところビルドが通るようになりました。

1group :test do
2  gem 'chromedriver-helper' unless ENV.key?('CIRCLECI')
3end

この分岐は基本入れておいたほうが良さそうです。

また、CI側ではcacheを使わずに毎回bundle installするのが無難です。Gemfileunlessによる条件分岐があるせいで、キャッシュを使うとリポジトリのGemfile.lockを見る(=chromedriverが入っている状態になる)なので、結局バージョンの不整合が起こり得ます。

追記

もうちょっと詳細にバージョンを調べてみました。

今回使ってたイメージはcircleci/ruby:2.4.3-node-browsersです。

google-chrome

1circleci@6fb99568c11a:~$ google-chrome --version
2Google Chrome 64.0.3282.186

chromedriver

1circleci@6fb99568c11a:~$ chromedriver
2Starting ChromeDriver 2.38.551591 (bcc4a2cdef0f6b942b2bb8049068f65340fa2a69) on port 9515

ChromeDriverの対応

リリースノートには、

1----------ChromeDriver v2.38 (2018-04-17)----------
2Supports Chrome v65-67

とあるので、このバージョンの食い違いが原因でした。もしかするとChromeDriver gem側で入るバージョンが変わったのかもしれないです。

イメージ側のchromeに合わせるのであれば、CIでテストを流す前にchromedriver-updateでダウングレードさせればいけそうでした(ローカルのCircleCIで確認済)。

1- run:
2    name: Downgrade chromedriver
3    command: |
4      bundle exec chromedriver-update 2.37

だけど、Rubyのバージョンアップなんかでイメージ側を変えるときにここの指定バージョン変えるのも面倒ですよねー。なのでひとまずはunlessで逃げることにして、問題でたら考えます。