🦾

system spec が通らなくなった問題を SeleniARM で解決!

2023/10/11に公開

ラブグラフの横江です。

さて、ラブグラフで controller 周りのテストコードを書くときは、
【RSpec】システムスペックとリクエストスペックはどう使い分けるの? の記事の影響もありまして、
どちらかというと system spec を書くことが最近は多いです。

ところが、system spec を書いていたところ、
ローカルで全然テストが通りません。

5.2) Failure/Error: Unable to infer file and line number from backtrace

Selenium::WebDriver::Error::UnknownError:
  unknown error: Chrome failed to start: crashed.
    (chrome not reachable)
    (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'
  System info: host: '48673dc69a4e', ip: '172.19.0.3', os.name: 'Linux', os.arch: 'amd64', os.version: '5.15.49-linuxkit', java.version: '1.8.0_292'
  Driver info: driver.version: unknown
  remote stacktrace: #0 0x004000a2a8f3 <unknown>

というふうに、 unknown error: Chrome failed to start: crashed. が発生してしまうのです。

unknown error と言われてしまってはエラーの原因がわかりません! 困った!!

unknown error を解決するために

まず疑ったのが Docker Compose における
ネットワークの関係性が壊れてしまっていることです。

docker-compose stop や、それでもダメなので docker-compose down したり、
docker-compose build --no-cache で作り直してみてもダメでした。

次に Selenium のバージョンが古い可能性です。
docker-selenium のバージョンを上げてみて試しましたが、それでもダメです。
どうしよう・・・。

そんな中、 docker-compose build --no-cache の実行ログを見ていて気が付きました。

 ! fluentd The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested  0.0s ing34.4s
 ! selenium The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested 0.0s

というワーニングが出ていることに……。
amd64……arm64…………。

そうです、最近、会社のPCを新しくして、
インテルチップからM2チップの Mac へと変更したのでした!!

Seleniarm なるものが出ていた

改めて docker-selenium のリポジトリの README の記述を読むと、
https://github.com/SeleniumHQ/docker-selenium#experimental-mult-arch-aarch64armhfamd64-images にて、
aarch64 に対応した docker-seleniarm が紹介されていることに気が付きました。

selenium ならぬ seleniarm です。

これをもとにローカル環境用の docker-compose.yml 内を

- selenium/standalone-chrome:115.0-20230801
+ seleniarm/standalone-chromium:116.0-20230828

のように書き換えることで、無事、ローカル環境での system spec が通るようになりました!🎉

Chrome でなく Chromium になってしまうところがやや気になるところではありますが、
docker-seleniarm の README いわく、

NOTE: Google does not build Chrome for Linux ARM platforms. Instead, docker-seleniarm uses the open source Chromium browser instead, which is built for ARM.

(Linux ARM 環境向けに Google は Chrome をビルドしていないよ)

とのことなので仕方ないですね。

おわりに

今回の変更で、CI環境は selenium/standalone-chrome を使うのに
ローカル環境のテストでは seleniarm/standalone-chromium を使うという差異が生まれてしまいました。

開発環境・ステージング環境・本番環境での動作環境はなるべく同じものを使うようにするという考え方からすると、
macOS の CPU アーキテクチャーが大きく変わったことはなかなかに厄介です。

今後、スマートフォン向けアプリをメインに開発している会社と同様、
開発環境は AWS 内に置いて、Visual Studio Code の Remote - SSH で開発をおこなうことが
より一般化してくるのではないかと、最近は思ってきました。

ラブグラフのエンジニアブログ

Discussion