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.
This commit is contained in:
Thales Macedo Garitezi 2021-12-22 11:50:44 -03:00
parent a5939790c5
commit 62024854e5
No known key found for this signature in database
GPG Key ID: DD279F8152A9B6DD
5 changed files with 122 additions and 44 deletions

View File

@ -16,22 +16,18 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2.4.0 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 - name: setup mix
run: | run: |
mix local.hex --force mix local.hex --force
mix local.rebar --force mix local.rebar --force
mix deps.get mix deps.get
- name: produce emqx.conf.all template
run: make conf-segs
- name: elixir release - name: elixir release
run: ./mix_release.sh run: ./mix_release.sh
- name: start release - name: start release
run: | run: |
cd _build/dev/rel/emqx cd _build/dev/rel/emqx_base
bin/emqx daemon_iex bin/emqx daemon_iex
- name: check if started - name: check if started
run: | run: |

View File

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

90
mix.exs
View File

@ -93,7 +93,7 @@ defmodule EMQXUmbrella.MixProject do
defp releases() do defp releases() do
[ [
emqx: [ emqx_base: [
applications: [ applications: [
logger: :permanent, logger: :permanent,
esasl: :load, esasl: :load,
@ -202,44 +202,65 @@ defmodule EMQXUmbrella.MixProject do
force: overwrite? 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 # This is generated by `scripts/merge-config.escript` or `make
# conf-segs`. So, this should be run before the release. # conf-segs`. So, this should be run before the release.
# TODO: run as a "compiler" step??? # 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 = conf_rendered =
EEx.eval_string(conf_eex_template, File.read!("apps/emqx_conf/etc/emqx.conf.all")
platform_bin_dir: "bin", |> from_rebar_to_eex_template()
platform_data_dir: "data", |> EEx.eval_string(assigns)
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.write!( File.write!(
Path.join(etc, "emqx.conf"), Path.join(etc, "emqx.conf"),
conf_rendered 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 release
end end
@ -364,4 +385,15 @@ defmodule EMQXUmbrella.MixProject do
String.downcase(opt) != "false" String.downcase(opt) != "false"
end 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 end

View File

@ -1,4 +1,5 @@
#!/bin/bash #!/bin/bash
# shellcheck disable=SC1000-SC9999
set -ex set -ex
@ -10,18 +11,19 @@ mix release --overwrite
## Assumes that `make emqx` has been run before the mix build to ## Assumes that `make emqx` has been run before the mix build to
## generate the correct configs. ## generate the correct configs.
mkdir -p _build/dev/rel/emqx/data/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) # LATEST_APP_CONFIG=$(ls -rt _build/emqx/rel/emqx/data/configs/app*.config | tail -n 1)
# FIXME! # FIXME!
cp ${LATEST_APP_CONFIG} _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#_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 # 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/releases/emqx_vars _build/dev/rel/emqx/releases/
# cp _build/emqx/rel/emqx/etc/emqx.conf _build/dev/rel/emqx/etc/ # cp _build/emqx/rel/emqx/etc/emqx.conf _build/dev/rel/emqx/etc/
# cp -r apps/emqx/etc/certs _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
rel/overlays/bin/emqx Executable file
View File

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