فهرست منبع

Merge pull request #11244 from thalesmg/ci-sorted-reboot-apps-check-master

ci(machine_boot): add ci check for missing reboot apps
Thales Macedo Garitezi 2 سال پیش
والد
کامیت
beb5be4de2
3فایلهای تغییر یافته به همراه65 افزوده شده و 1 حذف شده
  1. 1 0
      Makefile
  2. 2 1
      apps/emqx_machine/src/emqx_machine_boot.erl
  3. 62 0
      scripts/check_missing_reboot_apps.exs

+ 1 - 0
Makefile

@@ -99,6 +99,7 @@ static_checks:
 	@$(REBAR) as check do xref, dialyzer
 	@if [ "$${PROFILE}" = 'emqx-enterprise' ]; then $(REBAR) ct --suite apps/emqx/test/emqx_static_checks --readable $(CT_READABLE); fi
 	./scripts/check-i18n-style.sh
+	./scripts/check_missing_reboot_apps.exs --profile $(PROFILE)
 
 APPS=$(shell $(SCRIPTS)/find-apps.sh)
 

+ 2 - 1
apps/emqx_machine/src/emqx_machine_boot.erl

@@ -146,7 +146,8 @@ basic_reboot_apps() ->
             emqx_slow_subs,
             emqx_auto_subscribe,
             emqx_plugins,
-            emqx_psk
+            emqx_psk,
+            emqx_durable_storage
         ] ++ basic_reboot_apps_edition(emqx_release:edition()).
 
 basic_reboot_apps_edition(ce) ->

+ 62 - 0
scripts/check_missing_reboot_apps.exs

@@ -0,0 +1,62 @@
+#!/usr/bin/env elixir
+
+{parsed, _argv, _errors = []} =
+  OptionParser.parse(
+    System.argv(),
+    strict: [profile: :string]
+  )
+
+profile = Keyword.fetch!(parsed, :profile)
+
+:xref.start(:xref)
+:xref.set_default(:xref, warnings: false)
+rel_dir = '_build/#{profile}/lib/'
+:xref.add_release(:xref, rel_dir)
+
+{:ok, calls} = :xref.q(:xref, '(App) (XC || "mria":"create_table"/".*")')
+
+emqx_calls =
+  calls
+  |> Enum.map(&elem(&1, 0))
+  |> Enum.filter(&(to_string(&1) =~ "emqx_"))
+  |> MapSet.new()
+
+Path.wildcard(rel_dir ++ "*/ebin")
+|> Enum.each(fn dir ->
+  dir
+  |> to_charlist()
+  |> :code.add_pathz()
+end)
+
+Path.wildcard(rel_dir ++ "*")
+|> Enum.map(fn dir ->
+  dir
+  |> Path.basename()
+  |> String.to_atom()
+  |> Application.load()
+end)
+
+reboot_apps = :emqx_machine_boot.sorted_reboot_apps() |> MapSet.new()
+
+missing_reboot_apps = MapSet.difference(emqx_calls, reboot_apps)
+
+if MapSet.size(missing_reboot_apps) != 0 do
+  IO.puts(
+    :stderr,
+    IO.ANSI.format([
+      :red,
+      "Some applications are missing from `emqx_machine_boot:sorted_reboot_apps/0`!\n",
+      "Missing applications:\n",
+      Enum.map(missing_reboot_apps, fn app ->
+        "  * #{app}\n"
+      end),
+      "\n",
+      :green,
+      "Hint: maybe add them to `emqx_machine_boot:basic_reboot_apps_edition/1`\n",
+      "\n",
+      :yellow,
+      "Applications that call `mria:create_table` need to be added to that list;\n",
+      " otherwise, when a node joins a cluster, it might lose tables.\n"
+    ])
+  )
+end