Merge pull request #6691 from k32/bpapi-run-check
test(bpapi): Run static checks in CI
This commit is contained in:
commit
6a1ada8623
|
@ -71,6 +71,10 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
make ${EMQX_NAME}-zip
|
make ${EMQX_NAME}-zip
|
||||||
.ci/build_packages/tests.sh "$EMQX_PKG_NAME" zip
|
.ci/build_packages/tests.sh "$EMQX_PKG_NAME" zip
|
||||||
|
- name: run static checks
|
||||||
|
if: contains(matrix.os, 'ubuntu')
|
||||||
|
run: |
|
||||||
|
make static_checks
|
||||||
- name: build and test deb/rpm packages
|
- name: build and test deb/rpm packages
|
||||||
run: |
|
run: |
|
||||||
make ${EMQX_NAME}-pkg
|
make ${EMQX_NAME}-pkg
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
name: Run static checks
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: static-check-${{ github.event_name }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 */6 * * *'
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- v*
|
|
||||||
- e*
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
run_static_analysis:
|
|
||||||
runs-on: self-hosted
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- branch: "master"
|
|
||||||
container: "ghcr.io/emqx/emqx-builder/5.0-3:24.1.5-3-alpine3.14"
|
|
||||||
- branch: "main-v4.4"
|
|
||||||
container: "ghcr.io/emqx/emqx-builder/4.4-4:24.1.5-3-ubuntu20.04"
|
|
||||||
- branch: "main-v4.3"
|
|
||||||
container: "emqx/build-env:erl23.2.7.2-emqx-3-ubuntu20.04"
|
|
||||||
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
ref: ${{ matrix.branch }}
|
|
||||||
- name: xref
|
|
||||||
run: make xref
|
|
||||||
- name: dialyzer
|
|
||||||
run: make dialyzer
|
|
4
Makefile
4
Makefile
|
@ -55,6 +55,10 @@ proper: $(REBAR)
|
||||||
ct: $(REBAR) conf-segs
|
ct: $(REBAR) conf-segs
|
||||||
@ENABLE_COVER_COMPILE=1 $(REBAR) ct --name $(CT_NODE_NAME) -c -v
|
@ENABLE_COVER_COMPILE=1 $(REBAR) ct --name $(CT_NODE_NAME) -c -v
|
||||||
|
|
||||||
|
.PHONY: static_checks
|
||||||
|
static_checks: dialyzer xref
|
||||||
|
@$(REBAR) ct --suite apps/emqx/test/emqx_bpapi_suite --readable false
|
||||||
|
|
||||||
APPS=$(shell $(CURDIR)/scripts/find-apps.sh)
|
APPS=$(shell $(CURDIR)/scripts/find-apps.sh)
|
||||||
|
|
||||||
## app/name-ct targets are intended for local tests hence cover is not enabled
|
## app/name-ct targets are intended for local tests hence cover is not enabled
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
-module(emqx_bpapi_static_checks).
|
-module(emqx_bpapi_static_checks).
|
||||||
|
|
||||||
-export([dump/1, dump/0, check_compat/1]).
|
-export([run/0, dump/1, dump/0, check_compat/1]).
|
||||||
|
|
||||||
-include_lib("emqx/include/logger.hrl").
|
-include_lib("emqx/include/logger.hrl").
|
||||||
|
|
||||||
|
@ -34,6 +34,10 @@
|
||||||
, release => string()
|
, release => string()
|
||||||
}.
|
}.
|
||||||
|
|
||||||
|
-type dump_options() :: #{ reldir := file:name()
|
||||||
|
, plt := file:name()
|
||||||
|
}.
|
||||||
|
|
||||||
-type param_types() :: #{emqx_bpapi:var_name() => _Type}.
|
-type param_types() :: #{emqx_bpapi:var_name() => _Type}.
|
||||||
|
|
||||||
%% Applications and modules we wish to ignore in the analysis:
|
%% Applications and modules we wish to ignore in the analysis:
|
||||||
|
@ -50,6 +54,19 @@
|
||||||
%% Functions related to BPAPI compatibility checking
|
%% Functions related to BPAPI compatibility checking
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
-spec run() -> boolean().
|
||||||
|
run() ->
|
||||||
|
dump(), %% TODO: check return value
|
||||||
|
Dumps = filelib:wildcard(dumps_dir() ++ "/*.bpapi"),
|
||||||
|
case Dumps of
|
||||||
|
[] ->
|
||||||
|
?ERROR("No BPAPI dumps are found in ~s, abort", [dumps_dir()]),
|
||||||
|
false;
|
||||||
|
_ ->
|
||||||
|
?NOTICE("Running API compatibility checks for ~p", [Dumps]),
|
||||||
|
check_compat(Dumps)
|
||||||
|
end.
|
||||||
|
|
||||||
-spec check_compat([file:filename()]) -> boolean().
|
-spec check_compat([file:filename()]) -> boolean().
|
||||||
check_compat(DumpFilenames) ->
|
check_compat(DumpFilenames) ->
|
||||||
put(bpapi_ok, true),
|
put(bpapi_ok, true),
|
||||||
|
@ -143,15 +160,19 @@ get_param_types(Signatures, {M, F, A}) ->
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
dump() ->
|
dump() ->
|
||||||
case {filelib:wildcard("*_plt"), filelib:wildcard("_build/emqx*/lib")} of
|
case { filelib:wildcard(project_root_dir() ++ "/*_plt")
|
||||||
|
, filelib:wildcard(project_root_dir() ++ "/_build/emqx*/lib")
|
||||||
|
} of
|
||||||
{[PLT|_], [RelDir|_]} ->
|
{[PLT|_], [RelDir|_]} ->
|
||||||
dump(#{plt => PLT, reldir => RelDir});
|
dump(#{ plt => PLT
|
||||||
|
, reldir => RelDir
|
||||||
|
});
|
||||||
_ ->
|
_ ->
|
||||||
error("failed to guess run options")
|
error("failed to guess run options")
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%% Collect the local BPAPI modules to a dump file
|
%% Collect the local BPAPI modules to a dump file
|
||||||
-spec dump(map()) -> boolean().
|
-spec dump(dump_options()) -> boolean().
|
||||||
dump(Opts) ->
|
dump(Opts) ->
|
||||||
put(bpapi_ok, true),
|
put(bpapi_ok, true),
|
||||||
PLT = prepare(Opts),
|
PLT = prepare(Opts),
|
||||||
|
@ -207,7 +228,8 @@ is_bpapi_call({Module, _Function, _Arity}) ->
|
||||||
|
|
||||||
-spec dump_api(fulldump()) -> ok.
|
-spec dump_api(fulldump()) -> ok.
|
||||||
dump_api(Term = #{api := _, signatures := _, release := Release}) ->
|
dump_api(Term = #{api := _, signatures := _, release := Release}) ->
|
||||||
Filename = filename:join(code:priv_dir(emqx), Release ++ ".bpapi"),
|
Filename = filename:join(dumps_dir(), Release ++ ".bpapi"),
|
||||||
|
ok = filelib:ensure_dir(Filename),
|
||||||
file:write_file(Filename, io_lib:format("~0p.", [Term])).
|
file:write_file(Filename, io_lib:format("~0p.", [Term])).
|
||||||
|
|
||||||
-spec collect_bpapis([mfa()]) -> api_dump().
|
-spec collect_bpapis([mfa()]) -> api_dump().
|
||||||
|
@ -263,3 +285,9 @@ format_call({M, F, A}) ->
|
||||||
|
|
||||||
setnok() ->
|
setnok() ->
|
||||||
put(bpapi_ok, false).
|
put(bpapi_ok, false).
|
||||||
|
|
||||||
|
dumps_dir() ->
|
||||||
|
filename:join(project_root_dir(), "apps/emqx/test/emqx_bpapi_suite_data").
|
||||||
|
|
||||||
|
project_root_dir() ->
|
||||||
|
string:trim(os:cmd("git rev-parse --show-toplevel")).
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(emqx_bpapi_suite).
|
||||||
|
|
||||||
|
-compile(export_all).
|
||||||
|
-compile(nowarn_export_all).
|
||||||
|
|
||||||
|
-include_lib("common_test/include/ct.hrl").
|
||||||
|
-include_lib("stdlib/include/assert.hrl").
|
||||||
|
|
||||||
|
all() -> emqx_common_test_helpers:all(?MODULE).
|
||||||
|
|
||||||
|
init_per_suite(Config) ->
|
||||||
|
Config.
|
||||||
|
|
||||||
|
end_per_suite(_Config) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
|
t_run_check(_) ->
|
||||||
|
?assertMatch(true, emqx_bpapi_static_checks:run()).
|
|
@ -27,7 +27,7 @@
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
{dialyzer, [
|
{dialyzer, [
|
||||||
{warnings, [unmatched_returns, error_handling, race_conditions]},
|
{warnings, [unmatched_returns, error_handling]},
|
||||||
{plt_location, "."},
|
{plt_location, "."},
|
||||||
{plt_prefix, "emqx_dialyzer"},
|
{plt_prefix, "emqx_dialyzer"},
|
||||||
{plt_apps, all_apps},
|
{plt_apps, all_apps},
|
||||||
|
|
Loading…
Reference in New Issue