为什么 Travis 在部署到 Heroku 时无法连接使用 Redis cache_store?

Why does Travis fail to connect use Redis cache_store when deploying to Heroku?

我在我的 Rails 应用程序中使用 Redis 缓存:

config.cache_store = :redis_store, redis_url

当我将 Rails 应用程序直接推送到 Heroku 时,它已成功部署。使用 Travis 时,Heroku 部署步骤失败,因为资产预编译尝试连接到 Redis。

   Running: rake assets:precompile
   rake aborted!
   ArgumentError: invalid uri scheme ''
   /tmp/build_7c5f167bf750cb2986dbb9c3510ea11e/vendor/bundle/ruby/2.1.0/gems/redis-3.2.0/lib/redis/client.rb:390:in `_parse_options'

我尝试了各种方法:使用 rake 任务重写 RedisStore 方法,将 cache_store 实例化移至初始化阶段,使用 Docker 而不是 sudo,更改 Heroku 构建策略和其他 travis.yml 配置等

我不想在本地预编译,也不想更改缓存解决方案。 cedar-14 堆栈上的许多其他应用程序 运行 使用非常相似的设置,因此问题看起来有点奇怪。

有什么解决 Travis+Heroku 部署问题的建议吗?

就我而言,我通过将 redis init 更改为:

解决了这个问题
REDIS = Redis.new(:url => redis_url_string)

之前我解析 URI 并将参数传递为:

uri = URI.parse(redis_url)
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password, :scheme => uri.scheme)

我想知道cache store init是否有类似的redis init实现(我没有检查那里的来源)。

我们通过覆盖 Redis::Store 初始化解决了这个问题。使用 Travis 触发 Heroku 部署时,Redis Store 会尝试连接到 Redis。这可能是由于 Redis Store gem 的当前版本(2013 年 11 月)与当前资产管道实现不兼容。这在直接推送到 Heroku 时起作用的原因尚不清楚。当使用 travis.yml 文件中指定的 Heroku 构建策略时,它可能与编译资产的顺序有关。也许这些问题会在未来的 Redis Store 版本中得到解决。

这是在使用 Redis Store 作为缓存存储时避免加载 Redis 的 rake 任务 (lib/assets/tasks/assets.rake):

pt = Rake::Task['assets:environment']
Rake.application.send(:eval, "@tasks.delete('assets:environment')")

namespace :assets do
  task :environment do
    class Redis
      class Store
        def initialize(options = { })
          puts ”Do nothing"
        end
      end

      def initialize(options = { })
        puts ”Do nothing"
      end
    end
    pt.execute
  end
end

这不是一个非常优雅的解决方案,但目前可以解决问题。考虑改为更改缓存解决方案。