Просмотр исходного кода

chore(mix): take into account different release/package/edition types

Thales Macedo Garitezi 4 лет назад
Родитель
Сommit
a4fd777d77
1 измененных файлов с 117 добавлено и 28 удалено
  1. 117 28
      mix.exs

+ 117 - 28
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,
-          &copy_files/1,
+          &copy_files(&1, release_type, package_type, edition_type),
           &copy_escript(&1, "nodetool"),
           &copy_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}],