From a4fd777d775e2ae31f565afc0d855b21cd213eba Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Mon, 27 Dec 2021 09:57:56 -0300 Subject: [PATCH] chore(mix): take into account different release/package/edition types --- mix.exs | 145 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 117 insertions(+), 28 deletions(-) diff --git a/mix.exs b/mix.exs index c8844ba30..cfa6221d4 100644 --- a/mix.exs +++ b/mix.exs @@ -84,10 +84,28 @@ defmodule EMQXUmbrella.MixProject do defp releases() do [ emqx: fn -> + release_type = read_enum_env_var( + "EMQX_RELEASE_TYPE", + [:cloud, :edge], + :cloud + ) + + package_type = read_enum_env_var( + "EMQX_PACKAGE_TYPE", + [:bin, :pkg], + :bin + ) + + edition_type = read_enum_env_var( + "EMQX_EDITION_TYPE", + [:community, :enterprise], + :community + ) + base_steps = [ :assemble, &create_RELEASES/1, - ©_files/1, + ©_files(&1, release_type, package_type, edition_type), ©_escript(&1, "nodetool"), ©_escript(&1, "install_upgrade.escript") ] @@ -102,7 +120,6 @@ defmodule EMQXUmbrella.MixProject do [ applications: [ logger: :permanent, - esasl: :load, crypto: :permanent, public_key: :permanent, asn1: :permanent, @@ -112,6 +129,7 @@ defmodule EMQXUmbrella.MixProject do inets: :permanent, compiler: :permanent, runtime_tools: :permanent, + hocon: :load, emqx: :load, emqx_conf: :load, emqx_machine: :permanent, @@ -119,6 +137,7 @@ defmodule EMQXUmbrella.MixProject do mnesia: :load, ekka: :load, emqx_plugin_libs: :load, + esasl: :load, emqx_http_lib: :permanent, emqx_resource: :permanent, emqx_connector: :permanent, @@ -160,7 +179,7 @@ defmodule EMQXUmbrella.MixProject do ] end - def copy_files(release) do + defp copy_files(release, release_type, package_type, edition_type) do overwrite? = Keyword.get(release.options, :overwrite, false) bin = Path.join(release.path, "bin") @@ -189,29 +208,7 @@ defmodule EMQXUmbrella.MixProject do force: overwrite? ) - # FIXME: change variables by package type??? - assigns = [ - platform_bin_dir: "bin", - platform_data_dir: "data", - platform_etc_dir: "etc", - platform_lib_dir: "lib", - platform_log_dir: "log", - platform_plugins_dir: "plugins", - runner_root_dir: "$(cd $(dirname $(readlink $0 || echo $0))/..; pwd -P)", - runner_bin_dir: "$RUNNER_ROOT_DIR/bin", - runner_etc_dir: "$RUNNER_ROOT_DIR/etc", - runner_lib_dir: "$RUNNER_ROOT_DIR/lib", - runner_log_dir: "$RUNNER_ROOT_DIR/log", - runner_data_dir: "$RUNNER_ROOT_DIR/data", - runner_user: "", - release_version: release.version, - erts_vsn: release.erts_version, - # FIXME: this is empty in `make emqx` ??? - erl_opts: "", - # FIXME: varies with edge/community/enterprise - emqx_description: "EMQ X Community Edition", - is_elixir: "yes" - ] + assigns = template_vars(release, release_type, package_type, edition_type) # This is generated by `scripts/merge-config.escript` or `make # conf-segs`. So, this should be run before the release. @@ -236,9 +233,16 @@ defmodule EMQXUmbrella.MixProject do vars_rendered ) - # FIXME: check if cloud/edge??? + vm_args_template_path = case release_type do + :cloud -> + "apps/emqx/etc/emqx_cloud/vm.args" + + :edge -> + "apps/emqx/etc/emqx_edge/vm.args" + end + vm_args_rendered = - File.read!("apps/emqx/etc/emqx_cloud/vm.args") + File.read!(vm_args_template_path) |> from_rebar_to_eex_template() |> EEx.eval_string(assigns) @@ -325,6 +329,91 @@ defmodule EMQXUmbrella.MixProject do release end + defp template_vars(release, release_type, :bin = _package_type, edition_type) do + [ + platform_bin_dir: "bin", + platform_data_dir: "data", + platform_etc_dir: "etc", + platform_lib_dir: "lib", + platform_log_dir: "log", + platform_plugins_dir: "plugins", + runner_root_dir: "$(cd $(dirname $(readlink $0 || echo $0))/..; pwd -P)", + runner_bin_dir: "$RUNNER_ROOT_DIR/bin", + runner_etc_dir: "$RUNNER_ROOT_DIR/etc", + runner_lib_dir: "$RUNNER_ROOT_DIR/lib", + runner_log_dir: "$RUNNER_ROOT_DIR/log", + runner_data_dir: "$RUNNER_ROOT_DIR/data", + runner_user: "", + release_version: release.version, + erts_vsn: release.erts_version, + # FIXME: this is empty in `make emqx` ??? + erl_opts: "", + emqx_description: emqx_description(release_type, edition_type), + is_elixir: "yes" + ] + end + + defp template_vars(release, release_type, :pkg = _package_type, edition_type) do + [ + platform_bin_dir: "", + platform_data_dir: "/var/lib/emqx", + platform_etc_dir: "/etc/emqx", + platform_lib_dir: "", + platform_log_dir: "/var/log/emqx", + platform_plugins_dir: "/var/lib/emqx/plugins", + runner_root_dir: "/usr/lib/emqx", + runner_bin_dir: "/usr/bin", + runner_etc_dir: "/etc/emqx", + runner_lib_dir: "$RUNNER_ROOT_DIR/lib", + runner_log_dir: "/var/log/emqx", + runner_data_dir: "/var/lib/emqx", + runner_user: "emqx", + release_version: release.version, + erts_vsn: release.erts_version, + # FIXME: this is empty in `make emqx` ??? + erl_opts: "", + emqx_description: emqx_description(release_type, edition_type), + is_elixir: "yes" + ] + end + + defp read_enum_env_var(env_var, allowed_values, default_value) do + case System.fetch_env(env_var) do + :error -> + default_value + + {:ok, raw_value} -> + value = + raw_value + |> String.downcase() + |> String.to_atom() + + if value not in allowed_values do + Mix.raise( + """ + Invalid value #{raw_value} for variable #{env_var}. + Allowed values are: #{inspect(allowed_values)} + """ + ) + end + + value + end + end + + defp emqx_description(release_type, edition_type) do + case {release_type, edition_type} do + {:cloud, :enterprise} -> + "EMQ X Enterprise Edition" + + {:cloud, :community} -> + "EMQ X Community Edition" + + {:edge, :community} -> + "EMQ X Edge Edition" + end + end + defp bcrypt_dep() do if enable_bcrypt?(), do: [{:bcrypt, github: "emqx/erlang-bcrypt", tag: "0.6.0", override: true}],