mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-04 11:03:50 +08:00
Building the Discourse ember app is resource-intensive process. This commit introduces a framework for us to build these assets centrally, and make them available for people to download. On every commit to `main`, a new GitHub actions workflow will build development & production versions of the core assets, and publish them as a github release under the `discourse/discourse-assets` repository. A separate repository is being used to avoid polluting the main `discourse/discourse` repository with one-git-tag-per-release. The `assemble_ember_build.rb` script is updated to fetch the relevant asset bundle. Requests are made to `get.discourse.org`, which then redirects to GitHub releases. This redirection service is being used so that we have the option to switch away from GitHub releases in future without breaking existing Discourse installations. For now, this behavior can be enabled by setting `DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS=1`. In the near future, we hope to make this the default, with opt-out via `DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS=0`.
158 lines
4.2 KiB
Ruby
158 lines
4.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
desc "Runs the qunit test suite"
|
|
task "qunit:test", %i[qunit_path filter] do |_, args|
|
|
require "socket"
|
|
require "chrome_installed_checker"
|
|
|
|
begin
|
|
ChromeInstalledChecker.run
|
|
rescue ChromeInstalledChecker::ChromeError => err
|
|
abort err.message
|
|
end
|
|
|
|
unless system("command -v pnpm >/dev/null;")
|
|
abort "pnpm is not installed. See https://pnpm.io/installation"
|
|
end
|
|
|
|
report_requests = ENV["REPORT_REQUESTS"] == "1"
|
|
|
|
system("pnpm install", exception: true)
|
|
|
|
# ensure we have this port available
|
|
def port_available?(port)
|
|
server = TCPServer.open port
|
|
server.close
|
|
true
|
|
rescue Errno::EADDRINUSE
|
|
false
|
|
end
|
|
|
|
if ENV["QUNIT_EMBER_CLI"] == "0"
|
|
puts "The 'legacy' ember environment is discontinued - running tests with ember-cli assets..."
|
|
end
|
|
|
|
port = ENV["TEST_SERVER_PORT"] || 60_099
|
|
port += 1 while !port_available? port
|
|
|
|
unicorn_port = 60_098
|
|
unicorn_port += 1 while unicorn_port == port || !port_available?(unicorn_port)
|
|
|
|
env = {
|
|
"RAILS_ENV" => ENV["QUNIT_RAILS_ENV"] || "test",
|
|
"SKIP_ENFORCE_HOSTNAME" => "1",
|
|
"UNICORN_PID_PATH" => "#{Rails.root}/tmp/pids/unicorn_test_#{unicorn_port}.pid", # So this can run alongside development
|
|
"UNICORN_PORT" => unicorn_port.to_s,
|
|
"UNICORN_SIDEKIQS" => "0",
|
|
"DISCOURSE_SKIP_CSS_WATCHER" => "1",
|
|
"UNICORN_LISTENER" => "127.0.0.1:#{unicorn_port}",
|
|
"LOGSTASH_UNICORN_URI" => nil,
|
|
"UNICORN_WORKERS" => "1",
|
|
"UNICORN_TIMEOUT" => "90",
|
|
}
|
|
|
|
pid = Process.spawn(env, "#{Rails.root}/bin/unicorn", pgroup: true)
|
|
|
|
begin
|
|
success = true
|
|
qunit_path = args[:qunit_path]
|
|
filter = args[:filter]
|
|
|
|
options = { seed: (ENV["QUNIT_SEED"] || Random.new.seed), hidepassed: 1 }
|
|
|
|
%w[
|
|
module
|
|
filter
|
|
qunit_skip_core
|
|
qunit_single_plugin
|
|
theme_name
|
|
theme_url
|
|
theme_id
|
|
target
|
|
].each { |arg| options[arg] = ENV[arg.upcase] if ENV[arg.upcase].present? }
|
|
|
|
options["report_requests"] = "1" if report_requests
|
|
|
|
query = options.to_query
|
|
|
|
@now = Time.now
|
|
def elapsed
|
|
Time.now - @now
|
|
end
|
|
|
|
# wait for server to accept connections
|
|
require "net/http"
|
|
uri = URI("http://localhost:#{unicorn_port}/srv/status")
|
|
puts "Warming up Rails server"
|
|
|
|
begin
|
|
Net::HTTP.get(uri)
|
|
rescue Errno::ECONNREFUSED,
|
|
Errno::EADDRNOTAVAIL,
|
|
Net::ReadTimeout,
|
|
Net::HTTPBadResponse,
|
|
EOFError
|
|
sleep 1
|
|
retry if elapsed() <= 60
|
|
puts "Timed out. Can not connect to forked server!"
|
|
exit 1
|
|
end
|
|
puts "Rails server is warmed up"
|
|
|
|
env = { "UNICORN_PORT" => unicorn_port.to_s }
|
|
cmd = []
|
|
|
|
parallel = ENV["QUNIT_PARALLEL"]
|
|
reuse_build = ENV["QUNIT_REUSE_BUILD"] == "1"
|
|
|
|
if qunit_path
|
|
# Bypass `ember test` - it only works properly for the `/tests` path.
|
|
# We have to trigger a `build` manually so that JS is available for rails to serve.
|
|
if !reuse_build
|
|
system(
|
|
"pnpm",
|
|
"ember",
|
|
"build",
|
|
chdir: "#{Rails.root}/app/assets/javascripts/discourse",
|
|
exception: true,
|
|
)
|
|
end
|
|
|
|
env["THEME_TEST_PAGES"] = if ENV["THEME_IDS"]
|
|
ENV["THEME_IDS"]
|
|
.split("|")
|
|
.map { |theme_id| "#{qunit_path}?#{query}&testem=1&id=#{theme_id}" }
|
|
.shuffle
|
|
.join(",")
|
|
else
|
|
"#{qunit_path}?#{query}&testem=1"
|
|
end
|
|
|
|
cmd += %w[pnpm testem ci -f testem.js]
|
|
cmd += ["--parallel", parallel] if parallel
|
|
else
|
|
cmd += ["pnpm", "ember", "exam", "--query", query]
|
|
cmd += ["--load-balance", "--parallel", parallel] if parallel && !ENV["PLUGIN_TARGETS"]
|
|
cmd += ["--filter", filter] if filter
|
|
cmd += %w[--path dist] if reuse_build
|
|
cmd << "--write-execution-file" if ENV["QUNIT_WRITE_EXECUTION_FILE"]
|
|
end
|
|
|
|
# Print out all env for debugging purposes
|
|
p env
|
|
system(env, *cmd, chdir: "#{Rails.root}/app/assets/javascripts/discourse")
|
|
|
|
success &&= $?.success?
|
|
ensure
|
|
# was having issues with HUP
|
|
Process.kill "-KILL", pid
|
|
FileUtils.rm("#{Rails.root}/tmp/pids/unicorn_test_#{unicorn_port}.pid")
|
|
end
|
|
|
|
if success
|
|
puts "\nTests Passed"
|
|
else
|
|
puts "\nTests Failed"
|
|
exit(1)
|
|
end
|
|
end
|