You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Travis CI启动Rails服务器失败,Cypress报ECONNREFUSED错误求助

解决Travis CI中Rails服务器未就绪导致Cypress连接失败的问题

我之前也碰到过一模一样的坑!问题核心有两个:一是你的服务器启动命令里的转义字符不对,二是Travis不会自动等待Rails服务器完全就绪就直接跑Cypress测试了,这时候服务器还没完成初始化,自然会出现ECONNREFUSED错误。

下面是具体的解决步骤:

1. 修复服务器启动命令的转义问题

你写的"bundle exec rails server -p 3000 &"里的&是HTML转义后的字符,Travis的YAML配置里不需要这个转义,直接用&就能让服务器后台运行。把这行改成:

bundle exec rails server -p 3000 &

2. 添加等待服务器就绪的步骤

光把服务器后台启动还不够,必须等它完全能响应请求后再启动Cypress。这里推荐用wait-on工具来做这件事:

  • 先在before_script里安装wait-on(如果项目没装过的话):
    - npm install -g wait-on
    
  • 然后在启动服务器后添加等待命令:
    - wait-on http://localhost:3000
    

完整的before_script配置示例:

before_script:
  - psql -c 'create database scalia_test;' -U postgres
  - bundle exec rails db:migrate RAILS_ENV=test # 别忘了迁移测试数据库!
  - bundle exec rails server -p 3000 &
  - wait-on http://localhost:3000

3. 备选:不用npm包的纯Ruby等待方案

如果不想装npm工具,可以写个简单的Ruby脚本轮询服务器状态:
创建wait_for_server.rb文件放在项目根目录:

require 'net/http'

def server_ready?
  begin
    Net::HTTP.get(URI('http://localhost:3000'))
    true
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
    false
  end
end

until server_ready?
  puts "Waiting for Rails server to start..."
  sleep 1
end

然后在before_script里调用这个脚本:

- bundle exec rails server -p 3000 &
- ruby wait_for_server.rb

额外检查点

  • 查看Travis的构建日志,确认Rails服务器启动时没有报错(比如数据库表不存在、依赖缺失),有时候服务器没起来是因为启动阶段就失败了,不是等待时间的问题。
  • 确保Cypress的配置里使用的是正确的端口(3000)和环境(test)。

内容的提问来源于stack exchange,提问作者Graham Slick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:35:36