mirror of
https://github.com/discourse/discourse.git
synced 2025-09-07 12:02:53 +08:00
DEV: Introduce TemporaryRedis
and unset DISCOURSE_*
env vars in the themes:isolated_test
rake task (#13401)
The `themes:isolated_test` rake task will now unset all `DISCOURSE_*` env variables if `UNSET_DISCOURSE_ENV_VARS` env var is set and will also spin up a temporary redis server so the unicorn web server that's spun up for the tests doesn't leak into the "main" redis server.
This commit is contained in:
parent
30c7a9b06d
commit
d3a3d1b94c
3 changed files with 129 additions and 2 deletions
107
lib/temporary_redis.rb
Normal file
107
lib/temporary_redis.rb
Normal file
|
@ -0,0 +1,107 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class TemporaryRedis
|
||||
REDIS_TEMP_DIR = "/tmp/discourse_temp_redis"
|
||||
REDIS_LOG_PATH = "#{REDIS_TEMP_DIR}/redis.log"
|
||||
REDIS_PID_PATH = "#{REDIS_TEMP_DIR}/redis.pid"
|
||||
|
||||
attr_reader :instance
|
||||
|
||||
def initialize
|
||||
set_redis_server_bin
|
||||
end
|
||||
|
||||
def port
|
||||
@port ||= find_free_port(11000..11900)
|
||||
end
|
||||
|
||||
def start
|
||||
return if @started
|
||||
FileUtils.rm_rf(REDIS_TEMP_DIR)
|
||||
Dir.mkdir(REDIS_TEMP_DIR)
|
||||
FileUtils.touch(REDIS_LOG_PATH)
|
||||
|
||||
puts "Starting redis on port: #{port}"
|
||||
@thread = Thread.new do
|
||||
system(
|
||||
@redis_server_bin,
|
||||
"--port", port.to_s,
|
||||
"--pidfile", REDIS_PID_PATH,
|
||||
"--logfile", REDIS_LOG_PATH,
|
||||
"--databases", "1",
|
||||
"--save", '""',
|
||||
"--appendonly", "no",
|
||||
"--daemonize", "no",
|
||||
"--maxclients", "100",
|
||||
"--dir", REDIS_TEMP_DIR
|
||||
)
|
||||
end
|
||||
|
||||
puts "Waiting for redis server to start..."
|
||||
success = false
|
||||
instance = nil
|
||||
config = {
|
||||
port: port,
|
||||
host: "127.0.0.1",
|
||||
db: 0
|
||||
}
|
||||
start = Time.now
|
||||
while !success
|
||||
begin
|
||||
instance = DiscourseRedis.new(config, namespace: true)
|
||||
success = instance.ping == "PONG"
|
||||
rescue Redis::CannotConnectError
|
||||
ensure
|
||||
if !success && (Time.now - start) >= 5
|
||||
STDERR.puts "ERROR: Could not connect to redis in 5 seconds."
|
||||
self.remove
|
||||
exit(1)
|
||||
elsif !success
|
||||
sleep 0.1
|
||||
end
|
||||
end
|
||||
end
|
||||
puts "Redis is ready"
|
||||
@instance = instance
|
||||
@started = true
|
||||
end
|
||||
|
||||
def remove
|
||||
if @instance
|
||||
@instance.shutdown
|
||||
@thread.join
|
||||
puts "Redis has been shutdown."
|
||||
end
|
||||
FileUtils.rm_rf(REDIS_TEMP_DIR)
|
||||
@started = false
|
||||
puts "Redis files have been cleaned up."
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_redis_server_bin
|
||||
path = `which redis-server 2> /dev/null`.strip
|
||||
if path.size < 1
|
||||
STDERR.puts 'ERROR: redis-server is not installed on this machine. Please install it'
|
||||
exit(1)
|
||||
end
|
||||
@redis_server_bin = path
|
||||
rescue => ex
|
||||
STDERR.puts 'ERROR: Failed to find redis-server binary:'
|
||||
STDERR.puts ex.inspect
|
||||
exit(1)
|
||||
end
|
||||
|
||||
def find_free_port(range)
|
||||
range.each do |port|
|
||||
return port if port_available?(port)
|
||||
end
|
||||
end
|
||||
|
||||
def port_available?(port)
|
||||
TCPServer.open(port).close
|
||||
true
|
||||
rescue Errno::EADDRINUSE
|
||||
false
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue