chore(util): Refactor Docker-related scripts for better modularity
Refactored Docker-related scripts to improve modularity and readability. Introduced support for loading configuration from `.mod_env.json` files, enhancing script flexibility. Added debug flag to enable detailed logging during script execution for better troubleshooting. Fixed file path issues related to script operations.
This commit is contained in:
parent
1d4681417a
commit
0a2e282dae
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,4 @@
|
|||||||
*.tar.gz
|
*.tar.gz
|
||||||
dist
|
dist
|
||||||
|
!.util/docker-compose.yaml
|
||||||
|
.util/docker-compose*.yaml
|
4
.mod_env
4
.mod_env
@ -1,4 +0,0 @@
|
|||||||
CURRENT_MOD=test_harness
|
|
||||||
DEPENDENCIES=[{ "url":"https://github.com/minetest/minetest_game/archive/refs/heads/master.tar.gz", "path":"/usr/local/share/minetest/games/minetest", "strip":1 }]
|
|
||||||
MINETEST_ADD_CONF=
|
|
||||||
CLIENT_NB=1
|
|
12
.mod_env.json
Normal file
12
.mod_env.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"current_mod": "test_harness",
|
||||||
|
"dependencies": [
|
||||||
|
{
|
||||||
|
"url":"https://github.com/minetest/minetest_game/archive/refs/heads/master.tar.gz",
|
||||||
|
"path":"/usr/local/share/minetest/games/minetest",
|
||||||
|
"strip":1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"minetest-add-conf": "",
|
||||||
|
"client_nb": 1
|
||||||
|
}
|
13
.util/.mod_env.json.tmpl
Normal file
13
.util/.mod_env.json.tmpl
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"current_mod": "test_harness",
|
||||||
|
"dependencies": [
|
||||||
|
{
|
||||||
|
"url":"https://github.com/minetest/minetest_game/archive/refs/heads/master.tar.gz",
|
||||||
|
"path":"/usr/local/share/minetest/games/minetest",
|
||||||
|
"strip":1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"minetest_add_conf": "",
|
||||||
|
"client_nb": 1,
|
||||||
|
"additional_mods": ""
|
||||||
|
}
|
@ -1,4 +0,0 @@
|
|||||||
CURRENT_MOD=test_harness
|
|
||||||
CLIENT_NB=1
|
|
||||||
DEPENDENCIES=[{ "url":"https://github.com/minetest/minetest_game/archive/refs/heads/master.tar.gz", "path":"/usr/local/share/minetest/games/minetest", "strip":1 }, { "url":"https://forge.apps.education.fr/iri/minetest/docker_test_harness/-/archive/main/docker_test_harness-main.tar.gz", "path":"/usr/local/share/minetest/games/minetest/mods/test_harness", "strip":1 }]
|
|
||||||
MINETEST_ADD_CONF=
|
|
@ -1,10 +1,8 @@
|
|||||||
#
|
#
|
||||||
|
FROM ghcr.io/minetest/minetest:latest as builder
|
||||||
ARG DEPENDENCIES
|
ARG DEPENDENCIES
|
||||||
ARG MINETEST_ADD_CONF=""
|
ARG MINETEST_ADD_CONF=""
|
||||||
|
|
||||||
FROM ghcr.io/minetest/minetest:latest as builder
|
|
||||||
|
|
||||||
ENV STOP_SERVER=true
|
ENV STOP_SERVER=true
|
||||||
ENV FAILFAST=false
|
ENV FAILFAST=false
|
||||||
ENV MINETEST_GAME_PATH=/usr/local/share/minetest/games
|
ENV MINETEST_GAME_PATH=/usr/local/share/minetest/games
|
||||||
@ -19,6 +17,7 @@ RUN mkdir -p /usr/local/share/minetest/games && \
|
|||||||
|
|
||||||
# WORKDIR /config/.minetest/games/devtest/mods
|
# WORKDIR /config/.minetest/games/devtest/mods
|
||||||
RUN <<EOF
|
RUN <<EOF
|
||||||
|
echo "DEPENDENCIES: $DEPENDENCIES"
|
||||||
while read dep; do
|
while read dep; do
|
||||||
url=$(echo "$dep" | jq -r ".url")
|
url=$(echo "$dep" | jq -r ".url")
|
||||||
dep_path=$(echo "$dep" | jq -r ".path")
|
dep_path=$(echo "$dep" | jq -r ".path")
|
||||||
|
@ -17,4 +17,4 @@ services:
|
|||||||
STOP_SERVER: ${STOP_SERVER}
|
STOP_SERVER: ${STOP_SERVER}
|
||||||
FAILFAST: ${FAILFAST}
|
FAILFAST: ${FAILFAST}
|
||||||
CURRENT_MOD: "${CURRENT_MOD}"
|
CURRENT_MOD: "${CURRENT_MOD}"
|
||||||
ADDITIONAL_MODS: "${ADDITIONAL_MODS:-}"
|
ADDITIONAL_MODS: "${ADDITIONAL_MODS}"
|
||||||
|
@ -7,9 +7,10 @@ script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
|
|||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-D] [-f/--failfast] [-k/--keep-server]
|
Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-D] [-f/--failfast] [-k/--keep-server] [-d/--debug]
|
||||||
[-p/--port port_server] [--dependencies mod_dependencies]
|
[-p/--port port_server] [--dependencies mod_dependencies]
|
||||||
[-c/--clients nb_of_client] [-i/--client-image client_docker_image]
|
[-c/--clients nb_of_client] [-i/--client-image client_docker_image]
|
||||||
|
[--docker-cmd docker_command]
|
||||||
|
|
||||||
|
|
||||||
Start tests.
|
Start tests.
|
||||||
@ -17,7 +18,7 @@ Start tests.
|
|||||||
Available options:
|
Available options:
|
||||||
|
|
||||||
-h, --help Print this help and exit
|
-h, --help Print this help and exit
|
||||||
-d, --docker-cmd The container engine (docker or podman)
|
--docker-cmd The container engine (docker or podman)
|
||||||
--podman Use podman as container engine
|
--podman Use podman as container engine
|
||||||
--docker Use docker as container engine
|
--docker Use docker as container engine
|
||||||
-D, --show-debug Display debug.txt content on exit
|
-D, --show-debug Display debug.txt content on exit
|
||||||
@ -25,19 +26,20 @@ Available options:
|
|||||||
-k, --keep-server Keep the server running
|
-k, --keep-server Keep the server running
|
||||||
-p, --port Server port
|
-p, --port Server port
|
||||||
-c, --clients Number of client, default to \$CLIENT_NB
|
-c, --clients Number of client, default to \$CLIENT_NB
|
||||||
--dependencies mod dependencies
|
--dependencies Mod dependencies
|
||||||
-i, --client-image Client docker image (default to registry.apps.education.fr/iri/minetest/docker_test_harness/client:latest)
|
-i, --client-image Client docker image (default to registry.apps.education.fr/iri/minetest/docker_test_harness/client:latest)
|
||||||
|
-d, --debug Debug the script
|
||||||
EOF
|
EOF
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
trap - SIGINT SIGTERM ERR EXIT
|
trap - SIGINT SIGTERM ERR EXIT
|
||||||
if [-f "${docker_compose_file:-}" ] && ![-z "$docker_cmd"]; then
|
if [ -f "$PWD/${docker_compose_file:-}" ] && ! [ -z "$docker_cmd" ]; then
|
||||||
eval $docker_cmd compose -f "${docker_compose_file}" down
|
eval $docker_cmd compose -f "$PWD/${docker_compose_file}" down || true
|
||||||
fi
|
fi
|
||||||
if [-f "${docker_compose_file:-}" ]; then
|
if [ -f "$PWD/${docker_compose_file:-}" ]; then
|
||||||
\rm "${docker_compose_file}"
|
\rm "$PWD/${docker_compose_file}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,10 +88,11 @@ show_debug="false"
|
|||||||
run_tests="all"
|
run_tests="all"
|
||||||
dependencies="${DEPENDENCIES:-}"
|
dependencies="${DEPENDENCIES:-}"
|
||||||
docker_compose_file=""
|
docker_compose_file=""
|
||||||
|
debug=false
|
||||||
|
|
||||||
parse_params() {
|
parse_params() {
|
||||||
# init switch flags
|
# init switch flags
|
||||||
args=$(getopt -a -o Dfhkc:p:d:t:i: --long show-debug,failfast,keep-server,help,podman,docker,clients:,client-image:,port:,docker-cmd:,tests:,dependencies: -- "$@")
|
args=$(getopt -a -o Dfhkdc:p:t:i: --long show-debug,failfast,keep-server,help,podman,docker,debug,clients:,client-image:,port:,docker-cmd:,tests:,dependencies: -- "$@")
|
||||||
if [[ $? -gt 0 ]]; then
|
if [[ $? -gt 0 ]]; then
|
||||||
usage
|
usage
|
||||||
fi
|
fi
|
||||||
@ -121,7 +124,11 @@ parse_params() {
|
|||||||
show_debug="true"
|
show_debug="true"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
-d | --docker-cmd)
|
-d | --debug)
|
||||||
|
debug=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--docker-cmd)
|
||||||
docker_cmd=$2
|
docker_cmd=$2
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
@ -160,7 +167,8 @@ parse_params() {
|
|||||||
shift $((OPTIND - 1))
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
# check required params and arguments
|
# check required params and arguments
|
||||||
if [ "$docker_cmd" == "docker" ]; then docker_build_cmd="buildx build"; fi
|
if [ "$debug" = "true" ]; then set -x; fi
|
||||||
|
if [[ "$docker_cmd" == "docker" ]]; then docker_build_cmd="buildx build"; fi
|
||||||
if ! exists_in_list "docker podman", " ", "$docker_cmd"; then die "docker command must be in docker or podman"; fi
|
if ! exists_in_list "docker podman", " ", "$docker_cmd"; then die "docker command must be in docker or podman"; fi
|
||||||
if ! exists_in_list "all simple players", " ", "$run_tests"; then die "run tests (-t) must be in (all,simple,players)"; fi
|
if ! exists_in_list "all simple players", " ", "$run_tests"; then die "run tests (-t) must be in (all,simple,players)"; fi
|
||||||
if ! isuint $client_nb; then die "Number of clients must be an integer"; fi
|
if ! isuint $client_nb; then die "Number of clients must be an integer"; fi
|
||||||
@ -207,19 +215,24 @@ export STOP_SERVER="${stop_server:-true}"
|
|||||||
export FAILFAST="${failfast:-false}"
|
export FAILFAST="${failfast:-false}"
|
||||||
export DEPENDENCIES="${dependencies}"
|
export DEPENDENCIES="${dependencies}"
|
||||||
export CLIENT_IMAGE="${client_image:-registry.apps.education.fr/iri/minetest/docker_test_harness/client:latest}"
|
export CLIENT_IMAGE="${client_image:-registry.apps.education.fr/iri/minetest/docker_test_harness/client:latest}"
|
||||||
if [ -z "$($docker_cmd images -q $CLIENT_IMAGE 2> /dev/null)" ]; then
|
if ($docker_cmd manifest inspect $CLIENT_IMAGE 2>&1 /dev/null); then
|
||||||
die "CLIENT IMAGE $CLIENT_IMAGE does not exists"
|
die "CLIENT IMAGE $CLIENT_IMAGE does not exists"
|
||||||
fi
|
fi
|
||||||
export ENV_FILE=""
|
export ENV_FILE=""
|
||||||
if [ -f "$PWD/.mod_env" ]; then
|
export CURRENT_MOD=""
|
||||||
ENV_FILE="--env-file \"$PWD/.mod_env\""
|
export ADDITIONAL_MODS=""
|
||||||
|
if [ -f "$PWD/.mod_env.json" ]; then
|
||||||
|
DEPENDENCIES="$(cat "$PWD/.mod_env.json" | jq -c ".dependencies//\"\"")"
|
||||||
|
CURRENT_MOD="$(cat "$PWD/.mod_env.json" | jq -r ".current_mod//\"\"")"
|
||||||
|
CLIENT_NB="$(cat "$PWD/.mod_env.json" | jq -r ".client_nb//0")"
|
||||||
|
ADDITIONAL_MODS="$(cat "$PWD/.mod_env.json" | jq -r ".additional_mods//\"\"")"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
docker_compose_file=`mktemp --suffix=.yaml docker-composeXXXXXX`
|
docker_compose_file=`mktemp --suffix=.yaml docker-composeXXXXXX --tmpdir=.util`
|
||||||
|
|
||||||
cat "${script_dir}/docker-compose.yaml" > $docker_compose_file
|
cat "${script_dir}/docker-compose.yaml" > "$PWD/$docker_compose_file"
|
||||||
for (( clienti=1; clienti<=$client_nb; clienti++ )); do
|
for (( clienti=1; clienti<=$client_nb; clienti++ )); do
|
||||||
cat <<EOF >> $docker_compose_file
|
cat <<EOF >> "$PWD/$docker_compose_file"
|
||||||
client${clienti}:
|
client${clienti}:
|
||||||
image: \${CLIENT_IMAGE}
|
image: \${CLIENT_IMAGE}
|
||||||
restart: on-failure:10
|
restart: on-failure:10
|
||||||
@ -235,11 +248,16 @@ EOF
|
|||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ "$debug" = "true" ]; then
|
||||||
|
echo -e "$GREEN------------------ $docker_compose_file ----------------------------------$NOFORMAT"
|
||||||
|
cat "$PWD/$docker_compose_file"
|
||||||
|
echo -e "$GREEN--------------------------------------------------------------------------$NOFORMAT"
|
||||||
|
fi
|
||||||
|
|
||||||
eval $docker_cmd compose $ENV_FILE -f "${$docker_compose_file}" down
|
eval $docker_cmd compose $ENV_FILE -f "$PWD/${docker_compose_file}" down
|
||||||
eval $docker_cmd compose $ENV_FILE -f "${$docker_compose_file}" pull
|
eval $docker_cmd compose $ENV_FILE -f "$PWD/${docker_compose_file}" pull
|
||||||
eval $docker_cmd compose $ENV_FILE -f "${$docker_compose_file}" build --pull
|
eval $docker_cmd compose $ENV_FILE -f "$PWD/${docker_compose_file}" build --pull
|
||||||
eval $docker_cmd compose $ENV_FILE -f "${$docker_compose_file}" up --force-recreate --exit-code-from server --abort-on-container-exit
|
eval $docker_cmd compose $ENV_FILE -f "$PWD/${docker_compose_file}" up --force-recreate --exit-code-from server --abort-on-container-exit
|
||||||
exit_code=$?
|
exit_code=$?
|
||||||
|
|
||||||
exit $exit_code
|
exit $exit_code
|
Loading…
x
Reference in New Issue
Block a user