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:
- 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: |

View File

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

72
mix.exs
View File

@ -93,7 +93,7 @@ defmodule EMQXUmbrella.MixProject do
defp releases() do
[
emqx: [
emqx_base: [
applications: [
logger: :permanent,
esasl: :load,
@ -202,24 +202,8 @@ defmodule EMQXUmbrella.MixProject do
force: overwrite?
)
# 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,
assigns = [
platform_bin_dir: "bin",
platform_data_dir: "data",
platform_etc_dir: "etc",
@ -232,14 +216,51 @@ defmodule EMQXUmbrella.MixProject do
runner_lib_dir: "$RUNNER_ROOT_DIR/lib",
runner_log_dir: "$RUNNER_ROOT_DIR/log",
runner_data_dir: "$RUNNER_ROOT_DIR/data",
runner_user: ""
)
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_rendered =
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

View File

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