CircleCI执行Rspec邮件器首个测试极慢问题求助
我之前在CircleCI上跑邮件测试的时候也碰到过几乎一模一样的挂起问题!结合你用的circleci/ruby:2.4.3-node镜像,大概率是邮件发送配置的网络超时或者测试环境的邮件适配器配置错误,给你几个实际可行的排查和解决方向:
1. 优先检查测试环境的邮件投递配置
测试阶段根本不需要真的发送邮件,ActionMailer默认的:test适配器会把邮件存到内存里,完全不会发起外部网络请求。如果你的项目里不小心在测试环境配置了真实的SMTP(比如复制了development环境的配置),CircleCI环境无法连接外部SMTP服务器,就会一直重试直到超时,这正是你遇到的10分钟挂起的原因。
打开config/environments/test.rb,确认配置是:
Rails.application.configure do # 其他配置... config.action_mailer.delivery_method = :test end
如果之前设置了:smtp或者其他投递方式,赶紧改回:test,这应该能解决大部分问题。
2. 排除国际化(i18n)的影响
你的代码里用了t('subject.welcome')来设置邮件主题,某些情况下,CI环境加载翻译文件的速度很慢,或者缺少对应的locale文件,可能会间接导致ActionMailer调用卡住。可以先临时把subject写死,测试是否还会挂起:
def welcome(user_id) @user = User.find user_id mail(to: @user.email, subject: 'Welcome') # 替换掉t方法调用 end
如果问题消失,那就是i18n的加载问题,你可以在CI构建前预编译翻译文件,或者检查locale文件是否完整。
3. 调整CircleCI的网络/镜像配置
circleci/ruby:2.4.3-node这个镜像比较老了,Ruby 2.4也已经停止维护,镜像里的DNS配置或者网络组件可能有bug:
- 手动指定公共DNS服务器:在你的
.circleci/config.yml里添加一步,强制替换DNS配置:jobs: test: steps: - run: echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf # 其他测试步骤... - 尝试切换到同系列的更新镜像,比如
circleci/ruby:2.4.10-node,新版本的镜像通常会修复一些网络相关的问题。
4. 用本地邮件模拟工具兜底
如果以上方法都不行,可以在CI环境里启动mailcatcher来模拟邮件服务器,确保ActionMailer的请求都发往本地,避免外部网络依赖:
在.circleci/config.yml里添加依赖安装和启动步骤:
jobs: test: steps: - run: gem install mailcatcher - run: mailcatcher --ip 0.0.0.0 - run: export ACTION_MAILER_DELIVERY_METHOD=smtp - run: export ACTION_MAILER_SMTP_ADDRESS=localhost - run: export ACTION_MAILER_SMTP_PORT=1025 # 然后执行测试命令
同时在测试环境的配置里读取这些环境变量,让ActionMailer连接到本地的mailcatcher服务。
我当时就是不小心把测试环境的邮件投递方式设成了SMTP,导致在CircleCI里连不上外部服务器,卡了快10分钟才超时!你可以先从检查测试环境的delivery_method开始,这是最常见的触发点。
内容的提问来源于stack exchange,提问作者Leandro Nunes

