下記のような設定ファイルで動かしていたTravis CI上でheadless chrome使うようなgemのテストが急に落ち始めて、テスト通るところまで直したので色々メモして残しておきます✍
--- dist: trusty language: ruby cache: bundler rvm: @@ -8,13 +7,6 @@ rvm: - 2.5.8 addons: chrome: stable apt: packages: - chromium-chromedriver before_install: - export TZ=Asia/Tokyo - gem install bundler -v 2.1.4 before_script: - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" - sleep 3
修正したPRだけみたい場合はこちら
起こっていた事象
下記のような形でchromeのversionが古いということで急にテストが落ち始めた。
1) TravelToJavascript locks time in javascript and restore time outside block. Failure/Error: session.visit('/') Selenium::WebDriver::Error::SessionNotCreatedError: session not created exception: Chrome version must be >= 67.0.3396.0 (Driver info: chromedriver=2.41.578700 (2f1ed5f9343c13f73144538f15c00b370eda6706),platform=Linux 4.4.0-101-generic x86_64)
実際にci上でscriptを走らせてchromeのversionを確認してみたところ確かに古いversionのchromeが動いてしまっているようだった。
$ google-chrome --version Google Chrome 62.0.3202.94
原因
原因はdist: trusty
を使用していることのようだった・・・!
Travis CIのコミュニティで同じような状況の人がいないかなと思って検索したら、同様の事象が発生している人がいたのですが、
回答を見ると、下記の通りXenial
を使用することが推奨されているようだった。
Google is serving a package that can’t be installed with Trusty. Use Xenial or later.
どうやらGoogleが提供しているパッケージがtrusty
ではinstall出来なくなってしまったみたいです。(失敗してデフォルトの古いchromeが使われてしまった?)
確かに、jobのログを見てみるとinstall時に失敗しているようだった💦
$ export CHROME_SOURCE_URL=https://dl.google.com/dl/linux/direct/google-chrome-stable_current_amd64.deb Installing Google Chrome stable 0.56s$ wget --no-verbose -O /tmp/$(basename $CHROME_SOURCE_URL) $CHROME_SOURCE_URL 2020-05-23 06:15:49 URL:https://dl.google.com/dl/linux/direct/google-chrome-stable_current_amd64.deb [68678632/68678632] -> "/tmp/google-chrome-stable_current_amd64.deb" [1] dpkg-deb: error: archive '/tmp/google-chrome-stable_current_amd64.deb' has premature member 'control.tar.xz' before 'control.tar.gz', giving up dpkg: error processing archive /tmp/google-chrome-stable_current_amd64.deb (--install): subprocess dpkg-deb --control returned error exit status 2 Errors were encountered while processing: /tmp/google-chrome-stable_current_amd64.deb
対応策
対策では上記のコミュニティの回答どおり.travis.yml
を下記のように修正してXenial
を使うようにしました。
--- language: ruby cache: bundler rvm: - 2.7.1 - 2.6.6 - 2.5.8 addons: chrome: stable before_install: - export TZ=Asia/Tokyo - gem install bundler -v 2.1.4
※dist未指定だとXenial
が使用される。https://docs.travis-ci.com/user/reference/overview/#linux
trustyってubuntuのバージョニングのことだったんですね😅(trustyはサポート終了していてSecurity Fix以外は行われないようでした。。。)
また別件で下記のエラーが発生して落ちるようになってしまったので、
Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: crashed. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Capybaraでのdriverの設定を修正しました。Selenium::WebDriver::Remote::Capabilities
を使ってoptionを指定していたのが良くなかった(?)🤔
before
Capybara.register_driver :headless_chrome do |app| driver = Capybara::Selenium::Driver.new( Capybara::Selenium::Driver.new( app, browser: :chrome, desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome( login_prefs: { browser: 'ALL' }, chrome_options: { args: %w[headless disable-gpu window-size=1900,1200 lang=ja no-sandbox disable-dev-shm-usage], } ) ) driver end
after
Capybara.register_driver :headless_chrome do |app| options = Selenium::WebDriver::Chrome::Options.new options.add_argument('headless') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') Capybara::Selenium::Driver.new( app, browser: :chrome, options: options ) end
これらの対応を行ってCIが通るようになりました🍏