Quellcode durchsuchen

feat: support emqx-flavor

Shawn vor 1 Jahr
Ursprung
Commit
09c9a784d2
5 geänderte Dateien mit 89 neuen und 4 gelöschten Zeilen
  1. 30 1
      apps/emqx/src/emqx_release.erl
  2. 13 0
      apps/emqx/test/emqx_release_tests.erl
  3. 16 0
      changes/ee/feat-14251.en.md
  4. 16 1
      mix.exs
  5. 14 2
      rebar.config.erl

+ 30 - 1
apps/emqx/src/emqx_release.erl

@@ -25,9 +25,14 @@
     version_with_prefix/0,
     vsn_compare/1,
     vsn_compare/2,
+    get_flavor/0,
     on_load/0
 ]).
 
+-ifdef(TEST).
+-export([set_flavor/1]).
+-endif.
+
 -on_load(on_load/0).
 
 -include("emqx_release.hrl").
@@ -37,7 +42,11 @@
 -endif.
 
 -define(EMQX_DESCS, #{
-    ee => "EMQX Enterprise",
+    ee =>
+        case get_flavor() of
+            official -> "EMQX Enterprise";
+            Flavor -> io_lib:format("EMQX Enterprise(~s)", [Flavor])
+        end,
     ce => "EMQX"
 }).
 
@@ -62,6 +71,7 @@ on_load() ->
     persistent_term:put('EMQX_RELEASE_EDITION', ?EMQX_RELEASE_EDITION).
 
 %% @doc Return EMQX description.
+-dialyzer({[no_match], [description/0]}).
 description() ->
     maps:get(edition(), ?EMQX_DESCS).
 
@@ -155,3 +165,22 @@ parse_vsn(Vsn) ->
         _:_ ->
             erlang:error({invalid_version_string, Vsn})
     end.
+
+-spec get_flavor() -> atom().
+-ifdef(TEST).
+set_flavor(Flavor) when is_atom(Flavor) ->
+    persistent_term:put({?MODULE, 'EMQX_FLAVOR'}, Flavor).
+
+get_flavor() ->
+    persistent_term:get({?MODULE, 'EMQX_FLAVOR'}, official).
+-else.
+
+-ifndef(EMQX_FLAVOR).
+get_flavor() ->
+    official.
+-else.
+get_flavor() ->
+    ?EMQX_FLAVOR.
+-endif.
+
+-endif.

+ 13 - 0
apps/emqx/test/emqx_release_tests.erl

@@ -58,3 +58,16 @@ vsn_compre_test_() ->
             )
         end}
     ].
+
+emqx_flavor_test(_Config) ->
+    case emqx_release:edition() of
+        ce ->
+            ok;
+        ee ->
+            ?assertEqual(official, emqx_release:get_flavor()),
+            ?assertEqual("EMQX Enterprise", emqx:get_description()),
+            emqx_release:set_flavor(marketplace),
+            ?assertEqual(marketplace, emqx_release:get_flavor()),
+            ?assertEqual("EMQX Enterprise(marketplace)", emqx:get_description()),
+            emqx_release:set_flavor(official)
+    end.

+ 16 - 0
changes/ee/feat-14251.en.md

@@ -0,0 +1,16 @@
+Support setting the `flavor` of an enterprise edition using compile options.
+
+The customized `EMQX_FLAVOR` will be printed in the EMQX welcome message:
+```
+EMQX_FLAVOR=niceday make emqx-enterprise
+
+./bin/emqx start
+EMQX Enterprise(niceday) 5.8.3-g99ca2ea8 is started successfully!
+```
+
+One can get the flavor by `emqx_release:get_flavor/0:`
+
+```
+5.8.3-g99ca2ea8(emqx@127.0.0.1)1> emqx_release:get_flavor().
+niceday
+```

+ 16 - 1
mix.exs

@@ -493,6 +493,7 @@ defmodule EMQXUmbrella.MixProject do
       {:compile_info, [{:emqx_vsn, String.to_charlist(version)}]},
       {:d, :EMQX_RELEASE_EDITION, erlang_edition(edition_type)},
       {:d, :EMQX_ELIXIR},
+      {:d, :EMQX_FLAVOR, get_emqx_flavor()},
       {:d, :snk_kind, :msg}
     ] ++
       singleton(test_env?(), {:d, :TEST}) ++
@@ -1172,7 +1173,13 @@ defmodule EMQXUmbrella.MixProject do
   defp emqx_description(release_type, edition_type) do
     case {release_type, edition_type} do
       {_, :enterprise} ->
-        "EMQX Enterprise"
+        case get_emqx_flavor() do
+          :official ->
+            "EMQX Enterprise"
+
+          flavor ->
+            "EMQX Enterprise(#{flavor})"
+        end
 
       {_, :community} ->
         "EMQX"
@@ -1223,6 +1230,14 @@ defmodule EMQXUmbrella.MixProject do
       ])
   end
 
+  def get_emqx_flavor() do
+    case System.get_env("EMQX_FLAVOR") do
+      nil -> :official
+      "" -> :official
+      flavor -> flavor
+    end
+  end
+
   defp enable_rocksdb?() do
     not Enum.any?([
       raspbian?(),

+ 14 - 2
rebar.config.erl

@@ -169,6 +169,12 @@ is_rocksdb_supported("respbian" ++ _) ->
 is_rocksdb_supported(_) ->
     not is_build_without("ROCKSDB").
 
+get_emqx_flavor() ->
+    case os:getenv("EMQX_FLAVOR") of
+        X when X =:= false; X =:= "" -> official;
+        Flavor -> list_to_atom(Flavor)
+    end.
+
 project_app_dirs() ->
     #{edition := Edition, reltype := RelType} = get_edition_from_profile_env(),
     project_app_dirs(Edition, RelType).
@@ -228,6 +234,7 @@ common_compile_opts(Edition, _RelType, Vsn) ->
     ] ++
         [{d, 'EMQX_BENCHMARK'} || os:getenv("EMQX_BENCHMARK") =:= "1"] ++
         [{d, 'STORE_STATE_IN_DS'} || os:getenv("STORE_STATE_IN_DS") =:= "1"] ++
+        [{d, 'EMQX_FLAVOR', get_emqx_flavor()}] ++
         [{d, 'BUILD_WITHOUT_QUIC'} || not is_quicer_supported()].
 
 warn_profile_env() ->
@@ -369,8 +376,13 @@ relform() ->
         Other -> Other
     end.
 
-emqx_description(_, ee) -> "EMQX Enterprise";
-emqx_description(_, ce) -> "EMQX".
+emqx_description(_, ce) ->
+    "EMQX";
+emqx_description(_, ee) ->
+    case get_emqx_flavor() of
+        official -> "EMQX Enterprise";
+        Flavor -> io_lib:format("EMQX Enterprise(~s)", [Flavor])
+    end.
 
 overlay_vars(_RelType, PkgType, Edition) ->
     [