PIYO - Tech & Life -

[追記あり]再びCircleCIでsession not created exception

CI RSpec

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

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

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

Headless ChromeのテストがCircleCI上で動かなかった - PIYO - Tech & Life -
おとといの記事でHeadlessChromeを使ってテストするようにしたよ、と書きました。 RailsのFeatureテスト環境をHeadless Chromeに変更した - PIYO - Tech & Life - Poltergeist detected another element ...に対応

テスト周りの設定は何も変更していない中でこれが起きました。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したところビルドが通るようになりました。

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

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

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

追記

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

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

google-chrome

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

chromedriver

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

ChromeDriverの対応

リリースノートには、

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

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

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

- run:
    name: Downgrade chromedriver
    command: |
            bundle exec chromedriver-update 2.37

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