ci(machine_boot): add ci check for missing reboot apps

In order to avoid forgetting to add an application to
`emqx_machine_boot:sorted_reboot_apps`, this script checks for any calls to
`mria:create_table` in all EMQX applications and checks it against said function in
`emqx_machine_boot`.

Example run:

```
ͳ scripts/check_missing_reboot_apps.exs --profile emqx-enterprise
Some applications are missing from `emqx_machine_boot:sorted_reboot_apps/0`!
Missing applications:
  * emqx_durable_storage
  * emqx_ee_schema_registry

Hint: maybe add them to `emqx_machine_boot:basic_reboot_apps_edition/1`

Applications that call `mria:create_table` need to be added to that list;
 otherwise, when a node joins a cluster, it might lose tables.
```

Example problem: https://github.com/emqx/emqx/pull/11242
This commit is contained in:
Thales Macedo Garitezi 2023-07-10 14:31:25 -03:00
parent ae59a26659
commit d97d5b8af7
2 changed files with 63 additions and 0 deletions

View File

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

View File

@ -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