Explorar o código

chore(mix): wrap produced script and set required variables

We create a shim script that calls the one produced by Mix Release,
creating and setting the required configurations.
Thales Macedo Garitezi %!s(int64=4) %!d(string=hai) anos
pai
achega
62024854e5
Modificáronse 5 ficheiros con 122 adicións e 44 borrados
  1. 3 7
      .github/workflows/elixir_release.yml
  2. 5 1
      bin/common_functions.sh
  3. 61 29
      mix.exs
  4. 9 7
      mix_release.sh
  5. 44 0
      rel/overlays/bin/emqx

+ 3 - 7
.github/workflows/elixir_release.yml

@@ -16,22 +16,18 @@ jobs:
     steps:
       - name: Checkout
         uses: actions/checkout@v2.4.0
-      - name: "[hack] make emqx with rebar3 to get configs"
-        run: |
-          make emqx
-          cd _build/emqx/rel/emqx
-          bin/emqx start
-          bin/emqx stop
       - name: setup mix
         run: |
           mix local.hex --force
           mix local.rebar --force
           mix deps.get
+      - name: produce emqx.conf.all template
+        run: make conf-segs
       - name: elixir release
         run: ./mix_release.sh
       - name: start release
         run: |
-          cd _build/dev/rel/emqx
+          cd _build/dev/rel/emqx_base
           bin/emqx daemon_iex
       - name: check if started
         run: |

+ 5 - 1
bin/common_functions.sh

@@ -125,6 +125,10 @@ generate_config() {
     local CONF_FILE="$CONFIGS_DIR/app.$NOW_TIME.config"
     local HOCON_GEN_ARG_FILE="$CONFIGS_DIR/vm.$NOW_TIME.args"
 
+    # This is needed by the Elixir scripts.
+    # Do NOT append `.config`.
+    RELEASE_SYS_CONFIG="$CONFIGS_DIR/app.$NOW_TIME"
+
     CONFIG_ARGS="-config $CONF_FILE -args_file $HOCON_GEN_ARG_FILE"
 
     ## Merge hocon generated *.args into the vm.args
@@ -207,7 +211,7 @@ latest_vm_args() {
     if [ -f "$vm_args_file" ]; then
         echo "$vm_args_file"
     else
-        echoerr "ERRRO: node not initialized?"
+        echoerr "node not initialized?"
         echoerr "Generated config file vm.*.args is not found for command '$COMMAND'"
         echoerr "in config dir: $CONFIGS_DIR"
         echoerr "In case the file has been deleted while the node is running,"

+ 61 - 29
mix.exs

@@ -93,7 +93,7 @@ defmodule EMQXUmbrella.MixProject do
 
   defp releases() do
     [
-      emqx: [
+      emqx_base: [
         applications: [
           logger: :permanent,
           esasl: :load,
@@ -202,44 +202,65 @@ defmodule EMQXUmbrella.MixProject do
       force: overwrite?
     )
 
+    # FIXME: change variables by package type???
+    assigns = [
+      platform_bin_dir: "bin",
+      platform_data_dir: "data",
+      platform_etc_dir: "etc",
+      platform_lib_dir: "lib",
+      platform_log_dir: "log",
+      platform_plugins_dir: "plugins",
+      runner_root_dir: "$(cd $(dirname $(readlink $0 || echo $0))/..; pwd -P)",
+      runner_bin_dir: "$RUNNER_ROOT_DIR/bin",
+      runner_etc_dir: "$RUNNER_ROOT_DIR/etc",
+      runner_lib_dir: "$RUNNER_ROOT_DIR/lib",
+      runner_log_dir: "$RUNNER_ROOT_DIR/log",
+      runner_data_dir: "$RUNNER_ROOT_DIR/data",
+      runner_user: "",
+      release_version: release.version,
+      erts_vsn: release.erts_version,
+      # FIXME: this is empty in `make emqx` ???
+      erl_opts: "",
+      # FIXME: varies with edge/community/enterprise
+      emqx_description: "EMQ X Community Edition"
+    ]
+
     # This is generated by `scripts/merge-config.escript` or `make
     # conf-segs`.  So, this should be run before the release.
     # TODO: run as a "compiler" step???
-
-    conf_rebar_template = File.read!("apps/emqx_conf/etc/emqx.conf.all")
-    # we must not consider surrounding space in the template var name
-    # because some help strings contain informative variables that
-    # should not be interpolated, and those have no spaces.
-    conf_eex_template =
-      Regex.replace(
-        ~r/\{\{ ([a-zA-Z0-9_]+) \}\}/,
-        conf_rebar_template,
-        "<%= \\g{1} %>"
-      )
-
-    # FIXME: change variables by package type???
     conf_rendered =
-      EEx.eval_string(conf_eex_template,
-        platform_bin_dir: "bin",
-        platform_data_dir: "data",
-        platform_etc_dir: "etc",
-        platform_lib_dir: "lib",
-        platform_log_dir: "log",
-        platform_plugins_dir: "plugins",
-        runner_root_dir: "$(cd $(dirname $(readlink $0 || echo $0))/..; pwd -P)",
-        runner_bin_dir: "$RUNNER_ROOT_DIR/bin",
-        runner_etc_dir: "$RUNNER_ROOT_DIR/etc",
-        runner_lib_dir: "$RUNNER_ROOT_DIR/lib",
-        runner_log_dir: "$RUNNER_ROOT_DIR/log",
-        runner_data_dir: "$RUNNER_ROOT_DIR/data",
-        runner_user: ""
-      )
+      File.read!("apps/emqx_conf/etc/emqx.conf.all")
+      |> from_rebar_to_eex_template()
+      |> EEx.eval_string(assigns)
 
     File.write!(
       Path.join(etc, "emqx.conf"),
       conf_rendered
     )
 
+    vars_rendered =
+      File.read!("data/emqx_vars")
+      |> from_rebar_to_eex_template()
+      |> EEx.eval_string(assigns)
+
+    File.write!(
+      Path.join([release.path, "releases", "emqx_vars"]),
+      vars_rendered
+    )
+
+    Enum.each(
+      [
+        "common_defs.sh",
+        "common_defs2.sh",
+        "common_functions.sh",
+      ],
+      &Mix.Generator.copy_file(
+        "bin/#{&1}",
+        Path.join(bin, &1),
+        force: overwrite?
+      )
+    )
+
     release
   end
 
@@ -364,4 +385,15 @@ defmodule EMQXUmbrella.MixProject do
 
     String.downcase(opt) != "false"
   end
+
+  defp from_rebar_to_eex_template(str) do
+    # we must not consider surrounding space in the template var name
+    # because some help strings contain informative variables that
+    # should not be interpolated, and those have no spaces.
+    Regex.replace(
+      ~r/\{\{ ([a-zA-Z0-9_]+) \}\}/,
+      str,
+      "<%= \\g{1} %>"
+    )
+  end
 end

+ 9 - 7
mix_release.sh

@@ -1,4 +1,5 @@
 #!/bin/bash
+# shellcheck disable=SC1000-SC9999
 
 set -ex
 
@@ -10,18 +11,19 @@ mix release --overwrite
 ## Assumes that `make emqx` has been run before the mix build to
 ## generate the correct configs.
 
-mkdir -p _build/dev/rel/emqx/data/configs/
-LATEST_APP_CONFIG=$(ls -rt _build/emqx/rel/emqx/data/configs/app*.config | tail -n 1)
+# mkdir -p _build/dev/rel/emqx/data/configs/
+# LATEST_APP_CONFIG=$(ls -rt _build/emqx/rel/emqx/data/configs/app*.config | tail -n 1)
 
 # FIXME!
-cp ${LATEST_APP_CONFIG} _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
-sed -i -E 's#_build/emqx/rel/emqx/etc/emqx.conf#_build/dev/rel/emqx/etc/emqx.conf#g' _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
-sed -i -E 's#logger_level,warning#logger_level,debug#g' _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
-sed -i -E 's#level => warning#level => debug#g' _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
+# cp ${LATEST_APP_CONFIG} _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
+# sed -i -E 's#_build/emqx/rel/emqx/etc/emqx.conf#_build/dev/rel/emqx/etc/emqx.conf#g' _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
+
+# sed -i -E 's#logger_level,warning#logger_level,debug#g' _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
+# sed -i -E 's#level => warning#level => debug#g' _build/dev/rel/emqx/releases/5.0.0-beta.2/sys.config
 
 
 # cp _build/emqx/rel/emqx/releases/emqx_vars _build/dev/rel/emqx/releases/
 # cp _build/emqx/rel/emqx/etc/emqx.conf _build/dev/rel/emqx/etc/
 # cp -r apps/emqx/etc/certs _build/dev/rel/emqx/etc/
 
-echo "telemetry { enable = false }" >> _build/dev/rel/emqx/etc/emqx.conf
+echo "telemetry { enable = false }" >> _build/dev/rel/emqx_base/etc/emqx.conf

+ 44 - 0
rel/overlays/bin/emqx

@@ -0,0 +1,44 @@
+#!/bin/bash
+# -*- tab-width:4;indent-tabs-mode:nil -*-
+# ex: ts=4 sw=4 et
+
+set -euo pipefail
+
+BASE="$(cd "$(dirname "$(readlink "$0" || echo "$0")")"/..; pwd -P)"
+source "$BASE/bin/common_defs.sh"
+source "$BASE/bin/common_functions.sh"
+
+# Make sure log directory exists
+mkdir -p "$RUNNER_LOG_DIR"
+
+# Make sure data directory exists
+mkdir -p "$RUNNER_DATA_DIR"
+
+# Make sure data/configs exists
+mkdir -p "$CONFIGS_DIR"
+
+COMMAND="${1:-}"
+
+## IS_BOOT_COMMAND is set for later to inspect node name and cookie
+## from hocon config (or env variable), which resides in
+## `common_defs2.sh`.
+case "${COMMAND}" in
+    daemon|daemon_iex|start|start_iex)
+        IS_BOOT_COMMAND='yes'
+        ;;
+    *)
+        IS_BOOT_COMMAND='no'
+        ;;
+esac
+
+source "$BASE/bin/common_defs2.sh"
+
+cd "$ROOTDIR"
+
+# FIXME!!!
+generate_config "$NAME_TYPE" "$NAME"
+# Must be explicitly exported here in order to be picked up correctly
+export RELEASE_SYS_CONFIG
+export RELEASE_TMP="$RUNNER_ROOT_DIR"
+
+exec bin/emqx_base "$@"