diff --git a/.github/workflows/elixir_release.yml b/.github/workflows/elixir_release.yml index f2aef28c9..40fddcaac 100644 --- a/.github/workflows/elixir_release.yml +++ b/.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: | diff --git a/bin/common_functions.sh b/bin/common_functions.sh index cff9ed76a..2b740ce6e 100644 --- a/bin/common_functions.sh +++ b/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," diff --git a/mix.exs b/mix.exs index 4de8fa9e4..3efabc9a0 100644 --- a/mix.exs +++ b/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 diff --git a/mix_release.sh b/mix_release.sh index 4166e069a..1000b37b3 100755 --- a/mix_release.sh +++ b/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 diff --git a/rel/overlays/bin/emqx b/rel/overlays/bin/emqx new file mode 100755 index 000000000..b0149f072 --- /dev/null +++ b/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 "$@"