为什么 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
这不是一个非常优雅的解决方案,但目前可以解决问题。考虑改为更改缓存解决方案。
我在我的 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
这不是一个非常优雅的解决方案,但目前可以解决问题。考虑改为更改缓存解决方案。