Selenium 3 から 4 にしたら system spec が Net::ReadTimeout で通らなくなったときの対処
Rails の rspec でのE2Eテスト(system spec)用に Selenium を使っているのですが、
バージョンが Selenium 3.141.59-20210929 だったので、
「ぼちぼち上げるか〜」と最新の 4.10.0-20230607 にバージョンアップしようとしました。
selenium/standalone-chrome:3.141.59-20210929
を
selenium/standalone-chrome:114.0-20230614
に書き換え、
ローカル環境では system spec が数ファイル通ったので、大丈夫そうだなと push しました。
ところが、CircleCI での rspec ジョブがいっこうに終わりません。
ふだん5分くらいで終わるのに、30分くらい経っても終わりません。
そして
Net::ReadTimeout: Net::ReadTimeout with #<TCPSocket:(closed)>
で落ちるテストが・・・。
調査
CircleCI はコンテナに SSH ログインできるので、その機能で試しました。
1ファイルだけ system spec を回してみるも、
テストがなかなか終わらず最終的に Net::ReadTimeout
が出てしまいました。
……が、しばらくすると突然テストが通るようになりました。
「もしや、CircleCI でのテスト中は専有されていたけどそれが開放された?」と気付き、
いろいろ調査していった過程で、
circleci:~/project$ curl http://selenium:4444/status { "value": { "ready": false, "message": "Selenium Grid not ready.", "nodes": [ { "id": "39f5d00b-a8cb-4ece-ada8-ff8ada82d162", "uri": "http:\u002f\u002f192.168.240.4:4444", "maxSessions": 1,
となっていることに気付きました。
CI でのテストは test-queue を使って並列処理しているので、
maxSessions が 1 なら、それはたしかに、
セッションが取り合いになってテストが全然進まなそうです。
解決
調査を踏まえ、maxSessions の数を増やす方法がありそうだなと調べたら、
https://github.com/SeleniumHQ/docker-selenium#increasing-session-concurrency-per-container
に記載がありました。
By default, only one session is configured to run per container through the SE_NODE_MAX_SESSIONS environment variable. It is possible to increase that number up to the maximum available processors, this is because more stability is achieved when one container/browser has 1 CPU to run.
環境変数 SE_NODE_MAX_SESSIONS
を設定すれば、
セッション数の最大を 1 から増やせそうです。
というわけで、CircleCI の vCPU数と TEST_QUEUE_WORKERS
の数を参照しつつ、
SE_NODE_MAX_SESSIONS
を設定しました。
これでようやく解決しました。
解決までに4時間くらいはかかったと思います。
どなたかの助けになれば幸いです。