Browse Source

Merge pull request #7104 from zmstone/fix-windows-build-5.0

[5.0] Fix windows build
Zaiming (Stone) Shi 4 years atrás
parent
commit
e6380a1911

+ 15 - 50
.github/workflows/build_packages.yaml

@@ -52,18 +52,14 @@ jobs:
 
   windows:
     runs-on: windows-2019
-
     needs: prepare
-
     strategy:
       fail-fast: false
       matrix:
-        profile: # only CE for windows
+        profile: # for now only CE for windows
           - emqx
         otp:
-          ## gleam-lang/setup-erlang does not yet support the installation of otp24 on windows
-          - 23.2
-
+          - 24.2.1
     steps:
     - uses: actions/download-artifact@v2
       with:
@@ -72,8 +68,7 @@ jobs:
     - name: unzip source code
       run: Expand-Archive -Path source.zip -DestinationPath ./
     - uses: ilammy/msvc-dev-cmd@v1
-    - uses: gleam-lang/setup-erlang@v1.1.2
-      id: install_erlang
+    - uses: erlef/setup-beam@v1
       with:
         otp-version: ${{ matrix.otp }}
     - name: build
@@ -82,44 +77,26 @@ jobs:
         DIAGNOSTIC: 1
       working-directory: source
       run: |
-        $env:PATH = "${{ steps.install_erlang.outputs.erlpath }}\bin;$env:PATH"
-
-        $version = $( "${{ github.ref }}" -replace "^(.*)/(.*)/" )
-        if ($version -match "^v[0-9]+\.[0-9]+(\.[0-9]+)?") {
-          $regex = "[0-9]+\.[0-9]+(-alpha|-beta|-rc)?\.[0-9]+"
-          $pkg_name = "${{ matrix.profile }}-$([regex]::matches($version, $regex).value)-otp${{ matrix.otp }}-windows-amd64.tar.gz"
-        }
-        else {
-          $pkg_name = "${{ matrix.profile }}-$($version -replace '/')-otp${{ matrix.otp }}-windows-amd64.tar.gz"
-        }
-        ## We do not build/release bcrypt and quic for windows package
-        Remove-Item -Recurse -Force -Path _build/default/lib/bcrypt/
-        Remove-Item -Recurse -Force -Path _build/default/lib/quicer/
-        if (Test-Path rebar.lock) {
-            Remove-Item -Force -Path rebar.lock
-        }
-        make ensure-rebar3
-        copy rebar3 "${{ steps.install_erlang.outputs.erlpath }}\bin"
-        ls "${{ steps.install_erlang.outputs.erlpath }}\bin"
-        rebar3 --help
-        make ${{ matrix.profile }}
-        mkdir -p _packages/${{ matrix.profile }}
-        Compress-Archive -Path _build/${{ matrix.profile }}/rel/emqx -DestinationPath _build/${{ matrix.profile }}/rel/$pkg_name
-        mv _build/${{ matrix.profile }}/rel/$pkg_name _packages/${{ matrix.profile }}
-        Get-FileHash -Path "_packages/${{ matrix.profile }}/$pkg_name" | Format-List | grep 'Hash' | awk '{print $3}'  > _packages/${{ matrix.profile }}/$pkg_name.sha256
+        # ensure crypto app (openssl)
+        erl -eval "erlang:display(crypto:info_lib())" -s init stop
+        make ${{ matrix.profile }}-tgz
     - name: run emqx
-      timeout-minutes: 1
+      timeout-minutes: 5
       working-directory: source
       run: |
         ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx start
         Start-Sleep -s 5
+        echo "EMQX started"
         ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx stop
+        echo "EMQX stopped"
         ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx install
+        echo "EMQX installed"
         ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx uninstall
+        echo "EMQX uninstalled"
     - uses: actions/upload-artifact@v1
       if: startsWith(github.ref, 'refs/tags/')
       with:
-        name: ${{ matrix.profile }}
+        name: ${{ matrix.profile }}-windows
         path: source/_packages/${{ matrix.profile }}/.
 
   mac:
@@ -209,7 +186,6 @@ jobs:
         ./emqx/bin/emqx_ctl status
         ./emqx/bin/emqx stop
         rm -rf emqx
-        openssl dgst -sha256 $pkg_name | awk '{print $2}'  > $pkg_name.sha256
     - uses: actions/upload-artifact@v1
       if: startsWith(github.ref, 'refs/tags/')
       with:
@@ -354,19 +330,6 @@ jobs:
             --system "${SYSTEM}" \
             --builder "ghcr.io/emqx/emqx-builder/5.0-5:${ELIXIR}-${OTP}-${SYSTEM}"
         done
-
-    - name: create sha256
-      env:
-        PROFILE: ${{ matrix.profile}}
-      working-directory: source
-      run: |
-        if [ -d _packages/$PROFILE ]; then
-          cd _packages/$PROFILE
-            for var in $(ls emqx-* ); do
-              bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"
-            done
-          cd -
-        fi
     - uses: actions/upload-artifact@v1
       if: startsWith(github.ref, 'refs/tags/')
       with:
@@ -655,7 +618,9 @@ jobs:
           - emqx-enterprise
         otp:
           - 24.1.5-4
-
+        include:
+          - profile: emqx
+            otp: windows # otp version on windows is rather fixed
     steps:
     - uses: actions/checkout@v2
     - name: get_version

+ 37 - 0
.github/workflows/build_slim_packages.yaml

@@ -96,6 +96,43 @@ jobs:
       with:
         name: ${{ matrix.profile}}-${{ matrix.otp }}-${{ matrix.os }}
         path: _packages/${{ matrix.profile}}/*.tar.gz
+
+  windows:
+    runs-on: windows-2019
+    strategy:
+      fail-fast: false
+      matrix:
+        profile:
+          - emqx
+        otp:
+          - 24.2.1
+    steps:
+    - uses: actions/checkout@v2
+    - uses: ilammy/msvc-dev-cmd@v1
+    - uses: erlef/setup-beam@v1
+      with:
+        otp-version: ${{ matrix.otp }}
+    - name: build
+      env:
+        PYTHON: python
+        DIAGNOSTIC: 1
+      run: |
+        # ensure crypto app (openssl)
+        erl -eval "erlang:display(crypto:info_lib())" -s init stop
+        make ${{ matrix.profile }}-tgz
+    - name: run emqx
+      timeout-minutes: 5
+      run: |
+        ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx start
+        Start-Sleep -s 5
+        echo "EMQX started"
+        ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx stop
+        echo "EMQX stopped"
+        ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx install
+        echo "EQMX installed"
+        ./_build/${{ matrix.profile }}/rel/emqx/bin/emqx uninstall
+        echo "EQMX uninstaled"
+
   mac:
     strategy:
       fail-fast: false

+ 2 - 2
Windows.md

@@ -29,7 +29,7 @@ The second path is for CMD to setup environment variables.
 
 ### Erlang/OTP
 
-Install Erlang/OTP 23.2 from https://www.erlang.org/downloads
+Install Erlang/OTP 24 from https://www.erlang.org/downloads
 You may need to edit the `Path` environment variable to allow running
 Erlang commands such as `erl` from powershell.
 
@@ -45,7 +45,7 @@ e.g.
 
 ```
 PS C:\Users\zmsto> erl
-Eshell V11.1.4  (abort with ^G)
+Eshell V12.2.1  (abort with ^G)
 1> halt().
 ```
 

+ 2 - 2
apps/emqx/src/emqx_listeners.erl

@@ -148,8 +148,8 @@ start_listener(Type, ListenerName, #{bind := Bind} = Conf) ->
     case do_start_listener(Type, ListenerName, Conf) of
         {ok, {skipped, Reason}} when Reason =:= listener_disabled;
                                      Reason =:= quic_app_missing ->
-            console_print("- Skip - starting listener ~ts on ~ts ~n due to ~p",
-                          [listener_id(Type, ListenerName), format_addr(Bind), Reason]);
+            console_print("Listener ~ts is NOT started due to: ~p~n.",
+                          [listener_id(Type, ListenerName), Reason]);
         {ok, _} ->
             console_print("Listener ~ts on ~ts started.~n",
                 [listener_id(Type, ListenerName), format_addr(Bind)]);

+ 55 - 105
bin/emqx.cmd

@@ -8,8 +8,10 @@
 :: * restart - run the stop command and start command
 :: * uninstall - uninstall the service and kill a running node
 :: * ping - check if the node is running
+:: * ctl - run management commands
 :: * console - start the Erlang release in a `werl` Windows shell
 :: * attach - connect to a running node and open an interactive console
+:: * remote_console - same as attach
 :: * list - display a listing of installed Erlang services
 :: * usage - display available commands
 
@@ -22,7 +24,9 @@
 
 @set script=%~n0
 
+:: for remote_console
 @set EPMD_ARG=-start_epmd false -epmd_module ekka_epmd -proto_dist ekka
+:: for erl command
 @set ERL_FLAGS=%EPMD_ARG%
 
 :: Discover the release root directory from the directory
@@ -32,43 +36,54 @@
   set rel_root_dir=%%~fA
 )
 
-@set rel_dir=%rel_root_dir%\releases\%rel_vsn%
-@set RUNNER_ROOT_DIR=%rel_root_dir%
-@set RUNNER_ETC_DIR=%rel_root_dir%\etc
-
-@set etc_dir=%rel_root_dir%\etc
-@set lib_dir=%rel_root_dir%\lib
-@set data_dir=%rel_root_dir%\data
-@set emqx_conf=%etc_dir%\emqx.conf
+:: If release dir has space, change dir
+@if not "%rel_root_dir%"=="%rel_root_dir: =%" (
+    @chdir /d "%rel_root_dir%"
+    @set rel_root_dir=.
+)
 
-@call :find_erts_dir
-@call :find_vm_args
-@call :find_sys_config
-@call :set_boot_script_var
+@set "erts_dir=%rel_root_dir%\erts-%erts_vsn%"
+@set "rootdir=%rel_root_dir%"
+@set "rel_dir=%rel_root_dir%\releases\%rel_vsn%"
+@set "RUNNER_ROOT_DIR=%rel_root_dir%"
+:: hard code etc dir
+@set "RUNNER_ETC_DIR=%rel_root_dir%\etc"
+@set "etc_dir=%rel_root_dir%\etc"
+@set "lib_dir=%rel_root_dir%\lib"
+:: allow setting data dir
+@if "%RUNNER_DATA_DIR%"=="" (
+    @set "data_dir=%rel_root_dir%\data"
+) else (
+    @set "data_dir=%RUNNER_DATA_DIR%"
+)
+@set "emqx_conf=%etc_dir%\emqx.conf"
 
-@set service_name=%rel_name%_%rel_vsn%
-@set bindir=%erts_dir%\bin
+@set "boot_file_name=%rel_dir%\start"
+@set "service_name=%rel_name%_%rel_vsn%"
+@set "bindir=%erts_dir%\bin"
 @set progname=erl.exe
-@set clean_boot_script=%rel_root_dir%\bin\start_clean
-@set erlsrv="%bindir%\erlsrv.exe"
-@set escript="%bindir%\escript.exe"
-@set werl="%bindir%\werl.exe"
-@set erl_exe="%bindir%\erl.exe"
-@set nodetool="%rel_root_dir%\bin\nodetool"
-@set cuttlefish="%rel_root_dir%\bin\cuttlefish"
-@set node_type="-name"
-@set schema_mod="emqx_conf_schema"
+@set "clean_boot_file_name=%rel_dir%\start_clean"
+@set "erlsrv=%bindir%\erlsrv.exe"
+@set "escript=%bindir%\escript.exe"
+@set "werl=%bindir%\werl.exe"
+@set "erl_exe=%bindir%\erl.exe"
+@set "nodetool=%rel_root_dir%\bin\nodetool"
+@set "cuttlefish=%rel_root_dir%\bin\cuttlefish"
+@set node_type=-name
+@set schema_mod=emqx_conf_schema
 
 @set conf_path="%etc_dir%\emqx.conf"
 :: Extract node name from emqx.conf
 @for /f "usebackq delims=" %%I in (`"%escript% %nodetool% hocon -s %schema_mod% -c %conf_path% get node.name"`) do @(
   @call :set_trim node_name %%I
 )
+@set node_name=%node_name:"=%
 
 :: Extract node cookie from emqx.conf
 @for /f "usebackq delims=" %%I in (`"%escript% %nodetool% hocon -s %schema_mod% -c %conf_path% get node.cookie"`) do @(
   @call :set_trim node_cookie %%I
 )
+@set node_cookie=%node_cookie:"=%
 
 :: Write the erl.ini file to set up paths relative to this script
 @call :write_ini
@@ -83,67 +98,22 @@
 @if "%1"=="start" @goto start
 @if "%1"=="stop" @goto stop
 @if "%1"=="restart" @call :stop && @goto start
-::@if "%1"=="upgrade" @goto relup
-::@if "%1"=="downgrade" @goto relup
 @if "%1"=="console" @goto console
 @if "%1"=="ping" @goto ping
+@if "%1"=="ctl" @goto ctl
 @if "%1"=="list" @goto list
 @if "%1"=="attach" @goto attach
+@if "%1"=="remote_console" @goto attach
 @if "%1"=="" @goto usage
 @echo Unknown command: "%1"
 
 @goto :eof
 
-:: Find the ERTS dir
-:find_erts_dir
-@set possible_erts_dir=%rel_root_dir%\erts-%erts_vsn%
-@if exist "%possible_erts_dir%" (
-  call :set_erts_dir_from_default
-) else (
-  call :set_erts_dir_from_erl
-)
-@goto :eof
-
-:: Set the ERTS dir from the passed in erts_vsn
-:set_erts_dir_from_default
-@set erts_dir=%possible_erts_dir%
-@set rootdir=%rel_root_dir%
-@goto :eof
-
-:: Set the ERTS dir from erl
-:set_erts_dir_from_erl
-@for /f "delims=" %%i in ('where erl') do @(
-  set erl=%%i
-)
-@set dir_cmd="%erl%" -noshell -eval "io:format(\"~s\", [filename:nativename(code:root_dir())])." -s init stop
-@for /f %%i in ('%%dir_cmd%%') do @(
-  set erl_root=%%i
-)
-@set erts_dir=%erl_root%\erts-%erts_vsn%
-@set rootdir=%erl_root%
-@goto :eof
-
-:find_vm_args
-@set possible_vm=%etc_dir%\vm.args
-@if exist "%possible_vm%" (
-  set args_file=-args_file "%possible_vm%"
-)
-@goto :eof
-
-:: Find the sys.config file
-:find_sys_config
-@set possible_sys=%etc_dir%\sys.config
-@if exist "%possible_sys%" (
-  set sys_config=-config "%possible_sys%"
-)
-@goto :eof
-
 :create_mnesia_dir
 @set create_dir_cmd=%escript% %nodetool% mnesia_dir "%data_dir%\mnesia" %node_name%
 @for /f "delims=" %%Z in ('%%create_dir_cmd%%') do @(
   set mnesia_dir=%%Z
 )
-@set mnesia_dir="%mnesia_dir%"
 @goto :eof
 
 :: get the current time with hocon
@@ -155,7 +125,7 @@
 
 :generate_app_config
 @call :get_cur_time
-%escript% %nodetool% hocon -v -t %now_time% -s %schema_mod% -c "%etc_dir%\emqx.conf" -d "%data_dir%\configs" generate
+@%escript% %nodetool% hocon -v -t %now_time% -s %schema_mod% -c "%etc_dir%\emqx.conf" -d "%data_dir%\configs" generate
 @set generated_config_args=-config "%data_dir%\configs\app.%now_time%.config" -args_file "%data_dir%\configs\vm.%now_time%.args"
 :: create one new line
 @echo.>>"%data_dir%\configs\vm.%now_time%.args"
@@ -163,18 +133,9 @@
 @echo %node_type% %node_name%>>"%data_dir%\configs\vm.%now_time%.args"
 @goto :eof
 
-:: set boot_script variable
-:set_boot_script_var
-@if exist "%rel_dir%\%rel_name%.boot" (
-  set boot_script=%rel_dir%\%rel_name%
-) else (
-  set boot_script=%rel_dir%\start
-)
-@goto :eof
-
 :: Write the erl.ini file
 :write_ini
-@set erl_ini=%erts_dir%\bin\erl.ini
+@set "erl_ini=%erts_dir%\bin\erl.ini"
 @set converted_bindir=%bindir:\=\\%
 @set converted_rootdir=%rootdir:\=\\%
 @echo [erlang] > "%erl_ini%"
@@ -185,7 +146,7 @@
 
 :: Display usage information
 :usage
-@echo usage: %~n0 ^(install^|uninstall^|start^|stop^|restart^|console^|ping^|list^|attach^)
+@echo usage: %~n0 ^(install^|uninstall^|start^|stop^|restart^|console^|ping^|ctl^|list^|remote_console^|attach^)
 @goto :eof
 
 :: Install the release as a Windows service
@@ -194,16 +155,13 @@
 @call :create_mnesia_dir
 @call :generate_app_config
 :: Install the service
-@set args="-boot %boot_script% %sys_config% %generated_config_args% -mnesia dir '%mnesia_dir%'"
+@set args="-boot %boot_file_name% %generated_config_args% -mnesia dir '%mnesia_dir%'"
 @set description=EMQX node %node_name% in %rootdir%
 @if "" == "%2" (
   %erlsrv% add %service_name% %node_type% "%node_name%" -on restart -c "%description%" ^
            -i "emqx" -w "%rootdir%" -m %erl_exe% -args %args% ^
            -st "init:stop()."
   sc config emqx start=delayed-auto
-) else (
-  :: relup and reldown
-  goto relup
 )
 @goto :eof
 
@@ -218,11 +176,11 @@
 :: @%erlsrv% start %service_name%
 @call :create_mnesia_dir
 @call :generate_app_config
-@set args=-detached %sys_config% %generated_config_args% -mnesia dir '%mnesia_dir%'
+@set args=-detached %generated_config_args% -mnesia dir '%mnesia_dir%'
 @echo off
 cd /d "%rel_root_dir%"
 @echo on
-@start "%rel_name%" %werl% -boot  "%boot_script%" -mode embedded %args%
+@start "%rel_name%" %werl%  -mode embedded -boot "%boot_file_name%" %args%
 @goto :eof
 
 :: Stop the Windows service
@@ -232,27 +190,15 @@ cd /d "%rel_root_dir%"
 @%escript% %nodetool% %node_type% %node_name% -setcookie %node_cookie% stop
 @goto :eof
 
-:: Relup and reldown
-:relup
-@if "" == "%2" (
-  echo Missing package argument
-  echo Usage: %rel_name% %1 {package base name}
-  echo NOTE {package base name} MUST NOT include the .tar.gz suffix
-  set ERRORLEVEL=1
-  exit /b %ERRORLEVEL%
-)
-@%escript% "%rootdir%/bin/install_upgrade.escript" "%rel_name%" "%node_name%" "%node_cookie%" "%2"
-@goto :eof
-
 :: Start a console
 :console
 @call :create_mnesia_dir
 @call :generate_app_config
-@set args=%sys_config% %generated_config_args% -mnesia dir '%mnesia_dir%'
+@set args=%generated_config_args% -mnesia dir '%mnesia_dir%'
 @echo off
 cd /d %rel_root_dir%
 @echo on
-@start "bin\%rel_name% console" %werl% -boot "%boot_script%" -mode embedded %args%
+@start "%rel_name% console" %werl% -mode embedded -boot "%boot_file_name%" %args%
 @echo emqx is started!
 @goto :eof
 
@@ -261,6 +207,12 @@ cd /d %rel_root_dir%
 @%escript% %nodetool% ping %node_type% "%node_name%" -setcookie "%node_cookie%"
 @goto :eof
 
+:: ctl to execute management commands
+:ctl
+@for /f "usebackq tokens=1*" %%i in (`echo %*`) DO @ set params=%%j
+@%escript% %nodetool% %node_type% "%node_name%" -setcookie "%node_cookie%" rpc_infinity emqx_ctl run_command %params%
+@goto :eof
+
 :: List installed Erlang services
 :list
 @%erlsrv% list %service_name%
@@ -268,9 +220,7 @@ cd /d %rel_root_dir%
 
 :: Attach to a running node
 :attach
-:: @start "%node_name% attach"
-@start "%node_name% attach" %werl% -boot "%clean_boot_script%" ^
-  -remsh %node_name% %node_type% console_%node_name% -setcookie %node_cookie%
+@start "remsh_%nodename%" %werl% -hidden -remsh "%node_name%" -boot "%clean_boot_file_name%" "%node_type%" "remsh_%node_name%" -setcookie "%node_cookie%"
 @goto :eof
 
 :: Trim variable

+ 2 - 83
bin/emqx_ctl.cmd

@@ -1,92 +1,11 @@
-:: The batch file for emqx_ctl command
+:: The batch file for 'emqx ctl' command
 
 @set args=%*
 
-:: Set variables that describe the release
-@set rel_name=emqx
-@set rel_vsn={{ release_version }}
-@set erts_vsn={{ erts_vsn }}
-@set erl_opts={{ erl_opts }}
-
 :: Discover the release root directory from the directory
 :: of this script
 @set script_dir=%~dp0
 @for %%A in ("%script_dir%\..") do @(
   set rel_root_dir=%%~fA
 )
-@set rel_dir=%rel_root_dir%\releases\%rel_vsn%
-@set emqx_conf=%rel_root_dir%\etc\emqx.conf
-
-@call :find_erts_dir
-
-@set bindir=%erts_dir%\bin
-@set progname=erl.exe
-@set escript="%bindir%\escript.exe"
-@set nodetool="%rel_root_dir%\bin\nodetool"
-@set node_type="-name"
-
-:: Extract node name from emqx.conf
-@for /f "usebackq delims=\= tokens=2" %%I in (`findstr /b node\.name "%emqx_conf%"`) do @(
-  @call :set_trim node_name %%I
-)
-
-:: Extract node cookie from emqx.conf
-@for /f "usebackq delims=\= tokens=2" %%I in (`findstr /b node\.cookie "%emqx_conf%"`) do @(
-  @call :set_trim node_cookie= %%I
-)
-
-:: Write the erl.ini file to set up paths relative to this script
-@call :write_ini
-
-:: If a start.boot file is not present, copy one from the named .boot file
-@if not exist "%rel_dir%\start.boot" (
-  copy "%rel_dir%\%rel_name%.boot" "%rel_dir%\start.boot" >nul
-)
-
-@%escript% %nodetool% %node_type% "%node_name%" -setcookie "%node_cookie%" rpc emqx_ctl run_command %args%
-
-:: Find the ERTS dir
-:find_erts_dir
-@set possible_erts_dir=%rel_root_dir%\erts-%erts_vsn%
-@if exist "%possible_erts_dir%" (
-  call :set_erts_dir_from_default
-) else (
-  call :set_erts_dir_from_erl
-)
-@goto :eof
-
-:: Set the ERTS dir from the passed in erts_vsn
-:set_erts_dir_from_default
-@set erts_dir=%possible_erts_dir%
-@set rootdir=%rel_root_dir%
-@goto :eof
-
-:: Set the ERTS dir from erl
-:set_erts_dir_from_erl
-@for /f "delims=" %%i in ('where erl') do @(
-  set erl=%%i
-)
-@set dir_cmd="%erl%" -noshell -eval "io:format(\"~s\", [filename:nativename(code:root_dir())])." -s init stop
-@for /f %%i in ('%%dir_cmd%%') do @(
-  set erl_root=%%i
-)
-@set erts_dir=%erl_root%\erts-%erts_vsn%
-@set rootdir=%erl_root%
-@goto :eof
-
-:: Write the erl.ini file
-:write_ini
-@set erl_ini=%erts_dir%\bin\erl.ini
-@set converted_bindir=%bindir:\=\\%
-@set converted_rootdir=%rootdir:\=\\%
-@echo [erlang] > "%erl_ini%"
-@echo Bindir=%converted_bindir% >> "%erl_ini%"
-@echo Progname=%progname% >> "%erl_ini%"
-@echo Rootdir=%converted_rootdir% >> "%erl_ini%"
-@goto :eof
-
-:: Trim variable
-:set_trim
-@set %1=%2
-@goto :eof
-
+@%rel_root_dir%\bin\emqx.cmd ctl %args%

+ 28 - 14
build

@@ -78,8 +78,7 @@ make_doc() {
 }
 
 make_rel() {
-    # shellcheck disable=SC1010
-    ./rebar3 as "$PROFILE" do tar
+    ./rebar3 as "$PROFILE" tar
     if [ "$("$FIND" "_build/$PROFILE/rel/emqx/lib/" -maxdepth 1 -name 'gpb-*' -type d)" != "" ]; then
         echo "gpb should not be included in the release"
         exit 1
@@ -132,40 +131,55 @@ cp_dyn_libs() {
 ## It assumes the .tar.gz has been built -- relies on Makefile dependency
 make_tgz() {
     local pkgpath="_packages/${PROFILE}"
-    local tarball
+    local src_tarball
+    local target_name
     local target
 
     if [ "${IS_ELIXIR:-no}" = "yes" ]
     then
-      # ensure tarball exists
+      # ensure src_tarball exists
       ELIXIR_MAKE_TAR=yes make_elixir_rel
 
       local relpath="_build/${PROFILE}"
-      target="${pkgpath}/${PROFILE}-${PKG_VSN}-elixir${ELIXIR_VSN}-otp${OTP_VSN}-${SYSTEM}-${ARCH}.tar.gz"
+      target_name="${PROFILE}-${PKG_VSN}-elixir${ELIXIR_VSN}-otp${OTP_VSN}-${SYSTEM}-${ARCH}.tar.gz"
     else
-      # build the tarball again to ensure relup is included
+      # build the src_tarball again to ensure relup is included
       # elixir does not have relup yet.
       make_rel
 
       local relpath="_build/${PROFILE}/rel/emqx"
-      target="${pkgpath}/${PROFILE}-${PKG_VSN}-otp${OTP_VSN}-${SYSTEM}-${ARCH}.tar.gz"
+      target_name="${PROFILE}-${PKG_VSN}-otp${OTP_VSN}-${SYSTEM}-${ARCH}.tar.gz"
     fi
+    target="${pkgpath}/${target_name}"
 
-    tarball="${relpath}/emqx-${PKG_VSN}.tar.gz"
-    tard="/tmp/emqx_untar_${PKG_VSN}"
+    src_tarball="${relpath}/emqx-${PKG_VSN}.tar.gz"
+    tard="tmp/emqx_untar_${PKG_VSN}"
     rm -rf "${tard}"
     mkdir -p "${tard}/emqx"
-
     mkdir -p "${pkgpath}"
-    if [ ! -f "$tarball" ]; then
-        log "ERROR: $tarball is not found"
+    if [ ! -f "$src_tarball" ]; then
+        log "ERROR: $src_tarball is not found"
     fi
-    tar zxf "${tarball}" -C "${tard}/emqx"
+    tar zxf "${src_tarball}" -C "${tard}/emqx"
     ## try to be portable for tar.gz packages.
     ## for DEB and RPM packages the dependencies are resoved by yum and apt
     cp_dyn_libs "${tard}/emqx"
-    (cd "${tard}" && tar -cz emqx) > "${target}"
+    ## create tar after change dir (for windows)
+    pushd "${tard}" >/dev/null
+    tar -czf "${target_name}" emqx
+    popd >/dev/null
+    mv "${tard}/${target_name}" "${target}"
+    case "$SYSTEM" in
+        macos*)
+            # sha256sum may not be available on macos
+            openssl dgst -sha256 "${target}" | cut -d ' ' -f 2  > "${target}.sha256"
+            ;;
+        *)
+            sha256sum "${target}" | head -c 64 > "${target}.sha256"
+            ;;
+    esac
     log "Tarball successfully repacked: ${target}"
+    log "Tarball sha256sum: $(cat "${target}.sha256")"
 }
 
 ## This function builds the default docker image based on alpine:3.14 (by default)

+ 2 - 2
scripts/relup-base-packages.sh

@@ -51,7 +51,7 @@ if [ "$SYSTEM" = "macos" ]; then
 fi
 
 mkdir -p _upgrade_base
-pushd _upgrade_base
+pushd _upgrade_base >/dev/null
 
 for tag in $(../scripts/relup-base-vsns.sh $EDITION | xargs echo -n); do
     filename="$PROFILE-$SYSTEM-${tag#[e|v]}-$ARCH.tar.gz"
@@ -67,4 +67,4 @@ for tag in $(../scripts/relup-base-vsns.sh $EDITION | xargs echo -n); do
     fi
 done
 
-popd
+popd >/dev/null