Rails CI 환경에서 ChildProcess::Error가 발생하는 경우의 해결 방법

상당히 긴 것 괴로워하고 있던 에러였습니다만, 원인을 알았으므로 공유합니다.

CircleCI가 안정되지 않음



테스트는 모두 다니고 있습니다만, 가끔이라고 하는지 상당한 빈도로 이하와 같은 에러가 나와 CI가 이끼 하고 있었습니다.

/home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/childprocess-1.0.1/lib/childprocess/abstract_process.rb:188:in assert_started': process not started (ChildProcess::Error)
6: from /home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/common/platform.rb:150:in
block in exit_hook'
5: from/home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/common/service.rb:110:in stop'
4: from /home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/common/service.rb:110:in
ensure in stop'
3: from/home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/common/service.rb:163:in stop_process'
2: from /home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/common/service.rb:180:in
process_exited? '
1: from/home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/childprocess-1.0.1/lib/childprocess/unix/process.rb:31:in exited?'
/home/circleci/project_name/vendor/bundle/ruby/2.6.0/gems/childprocess-1.0.1/lib/childprocess/abstract_process.rb:188:in
assert_started': process not started (ChildProcess::Error)

이 에러 메세지등으로 구구 하고 있었습니다만, 해결 방법이 보이지 않고… 때때로 실패하지만 때로는 성공하기 때문에 때때로 조사하려고는 포기하고있었습니다.

다른 오류 메시지를 인식



당사의 다른 프로젝트에서도 같은 증상이 나오고 있어 동료가 조사하고 있었습니다만, 그 때에 찾아낸 메세지가 이것.

텍스트 파일 사용 -/home/circleci/.webdrivers/chromedriver

나는 에러 메시지의 얼마를 보았고 깨닫지 못했다.

여기에서 구그하면 Rails 6.0 계열의 issue와 PR이 히트했습니다.

Rails 6계에서는 디폴트로 병렬 테스트를 서포트한다고 하는 인식입니다만, 당사의 CI도 parallel_tests로 테스트를 돌리고 있어, 같은 증상인 것 같습니다.

증상에 대한 자세한 내용은 webdrivers가 chromedriver 업데이트를 시도하지만 병렬로 수행되어 하나의 프로세스를 시작할 수 없다는 것입니다.

그래서 병렬 테스트가 실행되기 전에 chromedriver를 업데이트하면이 문제가 더 이상 발생하지 않을 것이라고 생각했습니다. (위의 PR도 그런 일을 하고 있습니다만)

수정 방법



병렬 테스트가 실행되기 전에 chromedriver를 업데이트하도록 .circleci/config.yml을 수정했습니다. parallel_tests등으로 테스트를 기동하면 그 시점에서 병렬화되고 있기 때문에, 그 전에 해 둡니다.

.circleci/config.yml
steps:
  # 略。ただし、DB作成後でないとrails runnerが失敗するので注意。
  - run:
      name: Update chromedriver
      command: env RAILS_ENV=test bin/rails runner "Webdrivers::Chromedriver.update"
  # 略。テストを実行

결과



10 번 연속으로 동일한 테스트를 수행했지만 모두 성공했습니다

만약 병렬 테스트가 불안정하다고 하는 분은 이것을 추가해 봅시다!

좋은 웹페이지 즐겨찾기