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

Sidekiq重试测试用例Jenkins环境报Redis::CannotConnectError求助

问题排查方案

1. 检查Jenkins环境的Redis配置与连通性

报错getaddrinfo: Name or service not known说明Sidekiq无法解析Redis的主机名,核心是Jenkins环境无法正确访问Redis服务:

  • 确认Jenkins环境中Sidekiq的Redis配置(比如config/sidekiq.yml或环境变量REDIS_URL)是否正确,主机名/IP、端口是否与本地一致;
  • 在Jenkins服务器上执行ping [Redis主机名]验证DNS解析,用telnet [Redis主机名] [端口]或redis-cli -h [主机名] ping测试网络连通性;
  • 排查Redis服务是否在Jenkins环境中正常运行,防火墙/安全组是否允许Jenkins机器访问Redis端口。

2. 为测试用例Mock Sidekiq::Stats,避免真实Redis调用

你的测试用例目标是验证retries_exhausted块的日志逻辑,不需要真实获取Sidekiq统计数据。之前测试稳定可能是因为旧环境默认Mock了Redis相关操作,近期变更导致Mock失效,触发真实Redis连接:
修改worker_spec.rb,添加Mock逻辑隔离测试:

context "retries exhaust" do
  before do
    # Mock Sidekiq::Stats,避免真实Redis调用
    mock_stats = double("Sidekiq::Stats")
    allow(mock_stats).to receive(:failed).and_return(0) # 返回任意测试用数值即可
    allow(Sidekiq::Stats).to receive(:new).and_return(mock_stats)
  end

  it "should retry" do
    msg = {"retry"=>1, "queue"=>"default", "args" => ""}
    LeadWorker.within_sidekiq_retries_exhausted_block(msg) {
      expect(Sidekiq.logger).to receive(:warn).at_least(:once)
    }
  end
end

3. 排查依赖版本或测试框架变更

近期是否更新了Sidekiq、Redis gem或测试框架(如RSpec)?部分版本更新可能改变Redis连接逻辑或Mock行为:

  • 对比本地与Jenkins环境的gem版本,执行bundle show sidekiq和bundle show redis确认版本一致;
  • 若版本差异导致问题,可回退到之前稳定的版本,或查阅对应gem的更新文档调整配置/测试代码。

4. 检查Jenkins环境的网络策略变更

如果近期Jenkins服务器或Redis服务器的网络配置(如防火墙规则、VPC路由)有调整,可能导致Redis连接被阻断:

  • 联系运维团队确认Jenkins机器到Redis服务器的网络通路是否正常;
  • 检查是否有新的安全策略限制了Redis端口的访问。

内容的提问来源于stack exchange,提问作者Rashmi Balkur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:47