mirror of
https://github.com/discourse/discourse.git
synced 2024-11-30 19:30:42 +08:00
16b6e86932
This commit introduces the scaffolding for us to easily switch between Ember 3.28 and Ember 5 on the `main` branch of Discourse. Unfortunately, there is no built-in system to apply this kind of flagging within yarn / ember-cli. There are projects like `ember-try` which are designed for running against multiple version of a dependency, but they do not allow us to 'lock' dependency/sub-dependency versions, and are therefore unsuitable for our use in production. Instead, we will be maintaining two root `package.json` files, and two `yarn.lock` files. For ember-3, they remain as-is. For ember5, we use a yarn 'resolution' to override the version for ember-source across the entire yarn workspace. To allow for easy switching with minimal diff against the repository, `package.json` and `yarn.lock` are symlinks which point to `package-ember3.json` and `yarn-ember3.lock` by default. To switch to Ember 5, we can run `script/switch ember version 5` to update the symlinks to point to `package-ember5.json` and `package-ember3.json` respectively. In production, and when using `bin/ember-cli` for development, the ember version can also be upgraded using the `EMBER_VERSION=5` environment variable. When making changes to dependencies, these should be made against the default `ember3` versions, and then `script/regen_ember_5_lockfile` should be used to regenerate `yarn-ember5.lock` accordingly. A new 'Ember Version Lockfiles' GitHub workflow will automate this process on Dependabot PRs. When running a local environment against Ember 5, the two symlink changes will show up as git diffs. To avoid us accidentally committing/pushing that change, another GitHub workflow is introduced which checks the default Ember version and raises an error if it is greater than v3. Supporting two ember versions simultaneously obviously carries significant overhead, so our aim will be to get themes/plugins updated as quickly as possible, and then drop this flag.
116 lines
3.0 KiB
Ruby
Executable File
116 lines
3.0 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# frozen_string_literal: true
|
|
|
|
require 'pathname'
|
|
|
|
RAILS_ROOT = File.expand_path("../../", Pathname.new(__FILE__).realpath)
|
|
PORT = ENV["UNICORN_PORT"] ||= "3000"
|
|
HOSTNAME = ENV["DISCOURSE_HOSTNAME"] ||= "127.0.0.1"
|
|
YARN_DIR = File.join(RAILS_ROOT, "app/assets/javascripts/discourse")
|
|
CUSTOM_ARGS = ["--try", "--test", "--build", "--unicorn", "-u", "--forward-host"]
|
|
PROXY =
|
|
if ARGV.include?("--try")
|
|
"https://try.discourse.org"
|
|
else
|
|
"http://#{HOSTNAME}:#{PORT}"
|
|
end
|
|
|
|
def process_running?(pid)
|
|
!!Process.kill(0, pid)
|
|
rescue Errno::ESRCH
|
|
false
|
|
end
|
|
|
|
command =
|
|
if ARGV.include?("--test")
|
|
"test"
|
|
elsif ARGV.include?("--build")
|
|
"build"
|
|
else
|
|
"server"
|
|
end
|
|
|
|
class String
|
|
def cyan
|
|
"\e[36m#{self}\e[0m"
|
|
end
|
|
|
|
def red
|
|
"\033[31m#{self}\e[0m"
|
|
end
|
|
end
|
|
|
|
if ARGV.include?("-h") || ARGV.include?("--help")
|
|
puts "ember-cli OPTIONS"
|
|
puts "#{"--try".cyan} To proxy try.discourse.org"
|
|
puts "#{"--test".cyan} To run the test suite"
|
|
puts "#{"--unicorn, -u".cyan} To run a unicorn server as well"
|
|
puts "The rest of the arguments are passed to ember server per:", ""
|
|
exec "yarn -s --cwd #{YARN_DIR} run ember #{command} --help"
|
|
end
|
|
|
|
args = ["-s", "--cwd", YARN_DIR, "run", "ember", command] + (ARGV - CUSTOM_ARGS)
|
|
|
|
if !args.include?("test") && !args.include?("build") && !args.include?("--proxy")
|
|
args << "--proxy"
|
|
args << PROXY
|
|
end
|
|
|
|
if !["3", "5", nil].include?(ENV["EMBER_VERSION"])
|
|
raise "Unknown ember version #{ENV["EMBER_VERSION"]}"
|
|
end
|
|
|
|
system(
|
|
"script/switch_ember_version",
|
|
ENV["EMBER_VERSION"] || "3",
|
|
exception: true,
|
|
chdir: RAILS_ROOT,
|
|
)
|
|
|
|
# Running yarn install in the root directory will also run it for YARN_DIR via a post-install hook
|
|
exit 1 if !system "yarn", "-s", "install", "--cwd", RAILS_ROOT
|
|
|
|
yarn_env = {}
|
|
if ARGV.include?("--forward-host")
|
|
yarn_env["FORWARD_HOST"] = "true"
|
|
end
|
|
|
|
if ARGV.include?("-u") || ARGV.include?("--unicorn")
|
|
unicorn_env = { "DISCOURSE_PORT" => ENV["DISCOURSE_PORT"] || "4200" }
|
|
unicorn_pid = spawn(unicorn_env, __dir__ + "/unicorn")
|
|
ember_cli_pid = nil
|
|
|
|
Thread.new do
|
|
require 'open3'
|
|
Open3.popen2e(yarn_env, "yarn", *args.to_a.flatten) do |i, oe, t|
|
|
ember_cli_pid = t.pid
|
|
puts "Ember CLI running on PID: #{ember_cli_pid}"
|
|
oe.each do |line|
|
|
if line.include?("\e[32m200\e") || line.include?("\e[36m304\e[0m") || line.include?("POST /message-bus")
|
|
# skip 200s and 304s and message bus
|
|
else
|
|
puts line
|
|
end
|
|
end
|
|
end
|
|
if process_running?(unicorn_pid)
|
|
puts "[bin/ember-cli] ember-cli process stopped. Terminating unicorn."
|
|
Process.kill("TERM", unicorn_pid)
|
|
end
|
|
end
|
|
|
|
trap("SIGINT") do
|
|
# we got to swallow sigint to give time for
|
|
# children to handle it
|
|
end
|
|
|
|
Process.wait(unicorn_pid)
|
|
|
|
if ember_cli_pid && process_running?(ember_cli_pid)
|
|
puts "[bin/ember-cli] unicorn process stopped. Terminating ember-cli."
|
|
Process.kill("TERM", ember_cli_pid)
|
|
end
|
|
else
|
|
exec(yarn_env, "yarn", *args.to_a.flatten)
|
|
end
|