Madogiwa Blog

主に技術系の学習メモに使っていきます。

`dist: trusty`を使用するとTravis CIでchromeのversionが古くなる事象の対処法MEMO

下記のような設定ファイルで動かしていた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だけみたい場合はこちら

github.com

起こっていた事象

下記のような形で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のコミュニティで同じような状況の人がいないかなと思って検索したら、同様の事象が発生している人がいたのですが、

travis-ci.community

回答を見ると、下記の通り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が通るようになりました🍏

参考

qiita.com

qiita.com