配置Github Actions运行Rails+Selenium功能测试遇连接错误求助
问题分析与解决方案
你遇到的Connection refused - connect(2) for "172.17.0.1" port 80错误,主要源于3个核心配置问题:Selenium服务缩进错误、环境变量缺失、Capybara驱动地址指向错误。以下是针对性的修正方案:
1. 修正GitHub Actions配置文件(github_action_ci.yml)
原配置中Selenium服务嵌套在Postgres服务下,导致容器未正常启动;同时缺少关键环境变量定义。修正后的完整配置如下:
name: "Ruby on Rails CI" on: push: branches: [ main ] pull_request: branches: [ main ] jobs: run-rspec-tests: runs-on: ubuntu-latest services: postgres: image: postgres:12 ports: - "5433:5432" options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 env: POSTGRES_DB: db_test POSTGRES_USER: username POSTGRES_PASSWORD: password browser: # 修正缩进:与postgres同级,确保服务正常启动 image: selenium/standalone-chrome-debug ports: - "5900:5900" # VNC访问端口 - "4444:4444" # WebDriver访问端口 options: >- --shm-size=2g # 增加共享内存,避免Chrome崩溃 env: RAILS_ENV: test DATABASE_URL: "postgres://username:password@localhost:5433/db_test" SERVER_PORT: 3000 # 指定应用运行端口 SELENIUM_URL: "http://browser:4444/wd/hub" # Selenium服务地址 steps: - name: Checkout code uses: actions/checkout@v4 - name: Set App Host Env Var run: | # 获取Runner网关地址,供Selenium容器访问Rails应用 echo "APP_HOST=$(docker network inspect bridge --format='{{(index .IPAM.Config 0).Gateway}}')" >> "$GITHUB_ENV" - name: Install Ruby and gems uses: ruby/setup-ruby@v1 with: bundler-cache: true - name: Set up database schema run: | bin/rails db:schema:load - name: Run specs run: | bundle exec rspec
2. 修正Capybara配置文件(spec/support/capybara.rb)
原配置中远程驱动URL指向错误,且缺少CI环境下Chrome的必要启动参数。修正后的代码如下:
require 'capybara/rails' require 'capybara/rspec' if ENV["CI"] Capybara.register_driver :remote_chrome do |app| options = Selenium::WebDriver::Chrome::Options.new options.add_argument("--headless") options.add_argument("--no-sandbox") # CI环境必备,避免权限问题 options.add_argument("--disable-dev-shm-usage") # 解决共享内存不足问题 Capybara::Selenium::Driver.new( app, browser: :remote, url: ENV['SELENIUM_URL'], # 指向Selenium服务端点 options: options ) end Capybara.configure do |config| config.run_server = true config.javascript_driver = :remote_chrome config.app_host = "http://#{ENV['APP_HOST']}:#{ENV['SERVER_PORT']}" # Selenium访问应用的地址 config.server_host = '0.0.0.0' # 让应用绑定所有网卡,允许外部访问 config.server_port = ENV['SERVER_PORT'] config.always_include_port = true config.default_max_wait_time = 4 end else Capybara.javascript_driver = :selenium_chrome end
关键修改说明
- 修复Selenium服务缩进:确保服务与Postgres同级,避免容器未启动
- 添加环境变量:
SERVER_PORT指定应用端口,SELENIUM_URL指向Selenium服务,APP_HOST提供容器访问应用的网关地址 - 修正驱动URL:远程驱动必须指向Selenium的
/wd/hub端点,而非应用服务器 - Chrome启动参数:
--no-sandbox和--disable-dev-shm-usage解决CI环境下Chrome运行的权限与内存问题
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

