1
0
mirror of https://github.com/agibalovsa/-1C_DevOps.git synced 2026-04-26 20:05:15 +02:00
Files
Sergey Agibalov ccdf038208 Выполнены задачи:
- Рефакторинг запуска контейнера 1С.
- Добавление сборки и запуска контейнера 1С:Элемент.
2026-03-01 23:54:54 +03:00

421 lines
14 KiB
Bash
Executable File

#!/usr/bin/env bash
# Initialization dockers stack building script
#
init_stack () {
local -n return_name=$1
local -n return_type=$2
local -n return_paths=$3
# shellcheck disable=SC2143
[[ $(dialog --help | grep -- "--erase-on-exit") ]] && ERASE_ON_EXIT="--erase-on-exit" || :
name=$(\
dialog --ascii-lines --no-shadow ${ERASE_ON_EXIT} --output-fd 1 --title "Enter docker build stack" \
--inputbox "" 8 40 \
)
if [ -z "${ERASE_ON_EXIT}" ]; then
clear;
fi
type=$(\
dialog --ascii-lines --no-shadow --no-tags ${ERASE_ON_EXIT} --output-fd 1 --radiolist "Please select type" 0 0 0 \
"build" "build" off \
"compose" "compose" off
)
if [ -z "${ERASE_ON_EXIT}" ]; then
clear;
fi
if [ "${type}" = "compose" ]; then
IFS=" " read -ra paths <<< "$(
dialog --ascii-lines --no-shadow --no-tags ${ERASE_ON_EXIT} --output-fd 1 --checklist "Please select applications" 0 0 0 \
"1c/compose/crs" "1C Platform (cr-server)" off \
"1c/compose/ibsrv" "1C Platform (ibsrv)" off \
"1c/compose/server" "1C Platform (server)" off \
"1c-ans/compose" "1C Ans" off \
"1c-element/compose" "1C Element" off \
"gitlab-ce/compose" "Gitlab" off \
"hasp/compose" "Hasp" off \
"fluent-bit/compose" "Fluent Bit" off \
"opensearch/compose" "Open Search" off \
"portainer/compose" "Portainer" off \
"postgres/compose" "Postgres" off \
"slc/compose" "Slc" off \
"sonarqube/compose" "Sonarqube" off \
"step-ca-cli/compose" "Step CA (cli)" off
)"
else
IFS=" " read -ra paths <<< "$(
dialog --ascii-lines --no-shadow --no-tags ${ERASE_ON_EXIT} --output-fd 1 --radiolist "Please select applications" 0 0 0 \
"1c/build/linux" "1C Platform" off \
"1c-ans/build" "1C Ans" off \
"1c-element/build" "1C Element" off \
"1c-element-script/build" "1C Element (Script)" off \
"deb-builder/build" "Deb builder" off \
"gitlab-ce/build/gitlab-auto-mr" "Gitlab MR" off \
"hasp/build" "Hasp" off \
"imagick/build" "Image Magick" off \
"jdk/build" "JDK" off \
"nginx/build" "Nginx" off \
"openssl/build" "OpenSSL" off \
"os/linux_deb/build" "OS System" off \
"oscript/build" "One Script" off \
"postgres/build" "Postgres" off \
"slc/build" "Slc" off \
"sonarqube/build" "Sonarqube" off \
"step-ca-cli/build" "Step CA (cli)" off \
"vanessa-automation/build" "Vanessa automation" off
)"
fi;
if [ -z "${ERASE_ON_EXIT}" ]; then
clear;
fi
if [ "${type}" = "compose" ]; then
add_compose=()
script_dir=$(dirname "$(readlink -f "$0")")
for path in "${paths[@]}"
do
search_compose="${script_dir}/${path}/*/*compose.yml"
for compose_file in ${search_compose};
do
if [ ! "${compose_file}" == "${search_compose}" ] ; then
compose_path="$( dirname "${compose_file}") $( dirname "${compose_file}") off\n"
# shellcheck disable=SC2076
if [[ ! $(IFS=$'|'; echo "|${add_compose[*]}|") =~ "|${compose_path}|" ]]; then
add_compose+=( "${compose_path}" )
fi
fi
done
done
if [ ${#add_compose[@]} -gt 0 ]; then
# shellcheck disable=SC2068
selected_files=$(dialog --ascii-lines --no-shadow --no-tags ${ERASE_ON_EXIT} --output-fd 1 --checklist "Please select additional compose" 0 0 0 ${add_compose[@]} )
fi;
if [ -n "${selected_files}" ]; then
paths+=( "${selected_files[@]}" )
fi
if [ -z ${ERASE_ON_EXIT} ]; then
clear;
fi
fi
# shellcheck disable=SC2034
return_name="${name}"
# shellcheck disable=SC2034
return_type="${type}"
# shellcheck disable=SC2034
return_paths=( "${paths[@]}" )
}
# Creating dockers stack compose script
# $1 - Stack name
# $2 - Stack applications
#
make_compose_stack () {
stack_name="${1}"
script_dir=$(dirname "$(readlink -f "$0")")
stack_path="${script_dir}/users/compose/${stack_name}"
if [ ! -d "${stack_path:?}" ]; then
mkdir -p "${stack_path:?}"
fi
set -a
if [ -f "${stack_path}/.env" ]; then
# shellcheck disable=SC1091
# shellcheck disable=SC1090
source "${stack_path}/.env"
rm "${stack_path}/.env"
fi
if [ -f "${stack_path}/docker-compose-up.sh" ]; then
rm "${stack_path}/docker-compose-up.sh"
fi
if [ -f "${stack_path}/docker-compose-down.sh" ]; then
rm "${stack_path}/docker-compose-down.sh"
fi
if [ -f "${stack_path}/docker-compose-logs.sh" ]; then
rm "${stack_path}/docker-compose-logs.sh"
fi
if [ -d "${stack_path:?}/${stack_name}" ]; then
rm -r "${stack_path:?}/${stack_name}"
fi
printf "%s\n" \
"#!/bin/bash" \
"" \
"set -Eeoa pipefail" \
"" \
"script_dir=\$(dirname \"\$(readlink -f \"\$0\")\")" \
"" \
"mkdir -p \"\${script_dir}/${stack_name}\"" \
"# make context file" \
"" \
"CONTEXT_ENV=\$(realpath \"\${script_dir}/${stack_name}\")" \
"{" \
"echo \"CONTEXT_ENV=\${CONTEXT_ENV}\"" \
"echo \"\"" \
"cat \"\${script_dir}/../common_context/.env\"" \
"echo \"\"" \
"cat \"\${script_dir}/.env\"" \
"} > \"\${CONTEXT_ENV}/.env\"" \
"" \
| tee "${stack_path}/docker-compose-up.sh.tmp" > /dev/null;
printf "%s\n" \
"#!/bin/bash" \
"" \
"set -Eeoa pipefail" \
"" \
"script_dir=\$(dirname \"\$(readlink -f \"\$0\")\")" \
"CONTEXT_ENV=\$(realpath \"\${script_dir}/${stack_name}\")" \
"" \
| tee "${stack_path}/docker-compose-down.sh.tmp" > /dev/null;
printf "%s\n" \
"#!/bin/bash" \
"" \
"set -Eeoa pipefail" \
"" \
"script_dir=\$(dirname \"\$(readlink -f \"\$0\")\")" \
"CONTEXT_ENV=\$(realpath \"\${script_dir}/${stack_name}\")" \
"" \
| tee "${stack_path}/docker-compose-logs.sh.tmp" > /dev/null;
compose_files=""
paths=( "${!2}" )
for path in "${paths[@]}"
do
rel_path="${path#"${script_dir}"/}"
proj_name=$(echo "${rel_path/\/compose/}" | tr '/' '-')
for file in "${script_dir}/${rel_path}/"* "${script_dir}/${rel_path}/".*
do
if [[ "${file}" == *"configs" ]]; then
{
echo "cp -r ${file} \"\${CONTEXT_ENV}/\""
} >> "${stack_path}/docker-compose-up.sh.tmp"
elif [ -d "${file}" ]; then
continue
elif [[ "${file}" == *".*" ]]; then
# Returning ".*" in altLinux
continue
elif [[ "${file}" == *"stack.yml" ]]; then
continue
elif [[ "${file}" == *"common-compose.yml" ]]; then
{
echo "cp ${file} \"\${CONTEXT_ENV}/common-compose-${proj_name}.yml\""
compose_files="${compose_files} -f common-compose-${proj_name}.yml"
} >> "${stack_path}/docker-compose-up.sh.tmp"
elif [[ "${file}" == *"docker-compose.yml" ]]; then
{
echo "cp ${file} \"\${CONTEXT_ENV}/docker-compose-${proj_name}.yml\""
compose_files="${compose_files} -f docker-compose-${proj_name}.yml"
} >> "${stack_path}/docker-compose-up.sh.tmp"
elif [[ "${file}" == *".env.tmpl" ]]; then
{
echo "# # ${proj_name}"
echo ""
# https://github.com/a8m/envsubst (interpolating default values in file)
envsubst < "${script_dir}/${rel_path}/.env.tmpl"
echo ""
} >> "${stack_path}/.env.tmp"
else
{
filename=$(basename "${file}")
echo "cp ${file} \"\${CONTEXT_ENV}/${filename}\""
if [[ "${file}" == *"compose.yml" ]]; then
compose_files="${compose_files} -f ${filename}"
fi
} >> "${stack_path}/docker-compose-up.sh.tmp"
fi
done
done
if [ -n "${compose_files}" ]; then
{
echo ""
echo "cd \"\${CONTEXT_ENV}\""
echo "docker compose ${compose_files} up -d"
echo "cd .."
} >> "${stack_path}/docker-compose-up.sh.tmp"
{
echo "if [ -d \"\${CONTEXT_ENV}\" ]; then"
echo " cd \"\${CONTEXT_ENV}\""
echo " docker compose ${compose_files} down"
echo " cd .."
echo " rm \"\${CONTEXT_ENV}\"/.env"
echo "fi"
} >> "${stack_path}/docker-compose-down.sh.tmp"
{
echo "if [ -d \"\${CONTEXT_ENV}\" ]; then"
echo " cd \"\${CONTEXT_ENV}\""
echo " docker compose ${compose_files} logs --follow"
echo " cd .."
echo "fi"
} >> "${stack_path}/docker-compose-logs.sh.tmp"
fi
set +a
if [ -f "${stack_path}/.env.tmp" ]; then
sed -i 's/{{/{/g' "${stack_path}/.env.tmp"
sed -i 's/}}/}/g' "${stack_path}/.env.tmp"
mv "${stack_path}/.env.tmp" "${stack_path}/.env"
fi
if [ -n "${compose_files}" ]; then
mv "${stack_path}/docker-compose-up.sh.tmp" "${stack_path}/docker-compose-up.sh"
chmod 744 "${stack_path}/docker-compose-up.sh"
mv "${stack_path}/docker-compose-down.sh.tmp" "${stack_path}/docker-compose-down.sh"
chmod 744 "${stack_path}/docker-compose-down.sh"
mv "${stack_path}/docker-compose-logs.sh.tmp" "${stack_path}/docker-compose-logs.sh"
chmod 744 "${stack_path}/docker-compose-logs.sh"
else
rm "${stack_path}/docker-compose-up.sh.tmp"
rm "${stack_path}/docker-compose-down.sh.tmp"
rm "${stack_path}/docker-compose-logs.sh.tmp"
fi
}
# Creating dockers stack building script
# $1 - Stack name
# $2 - Stack applications
#
make_build_stack () {
script_dir=$(dirname "$(readlink -f "$0")")
stack_path="${script_dir}/users/builds/${1}"
if [ ! -d "${stack_path:?}" ]; then
mkdir -p "${stack_path:?}"
fi
set -a
if [ -f "${stack_path}/.arg" ]; then
# shellcheck disable=SC1091
# shellcheck disable=SC1090
source "${stack_path}/.arg"
rm "${stack_path}/.arg"
fi
if [ -f "${stack_path}/docker-build.sh" ]; then
rm "${stack_path}/docker-build.sh"
fi
printf "%s\n" \
"#!/bin/bash" \
"" \
"set -Eeoa pipefail" \
"" \
"script_dir=\$(dirname \"\$(readlink -f \"\$0\")\")" \
"" \
"# make context file" \
"mkdir -p \"\${script_dir}/context\"" \
"CONTEXT_ARG=\$(realpath \"\${script_dir}/context\")" \
"{" \
"echo \"CONTEXT_ARG=\${CONTEXT_ARG}\"" \
"echo \"\"" \
"cat \"\${script_dir}/../common_context/.arg\"" \
"echo \"\"" \
"cat \"\${script_dir}/.arg\"" \
"} > \"\${CONTEXT_ARG}/.arg\"" \
"" \
"# shellcheck source=/dev/null" \
"source \"\${CONTEXT_ARG}/.arg\"" \
"" \
| tee "${stack_path}/docker-build.sh.tmp" > /dev/null
make_docker_build=0
paths=( "${!2}" )
for path in "${paths[@]}"
do
if [ -f "${script_dir}/${path}/docker-build.sh" ]; then
{
echo ""
echo "if [ -d \"${stack_path}/distr\" ]; then"
echo " cp -r \"${stack_path}/distr\" \"${script_dir}/${path}/context\""
echo "fi"
echo "cd \"${script_dir}/${path}\""
echo "${script_dir}/${path}/docker-build.sh \"\$1\" \"\$2\""
echo ""
} >> "${stack_path}/docker-build.sh.tmp"
make_docker_build=1
fi
{
echo "# # ${path}"
echo ""
# https://github.com/a8m/envsubst (interpolating default values in file)
envsubst < "${script_dir}/${path}/.arg.tmpl"
echo ""
} >> "${stack_path}/.arg.tmp"
done
set +a
sed -i 's/{{/{/g' "${stack_path}/.arg.tmp"
sed -i 's/}}/}/g' "${stack_path}/.arg.tmp"
mv "${stack_path}/.arg.tmp" "${stack_path}/.arg"
if [ ${make_docker_build} = 1 ]; then
{
echo "rm -r \"\${CONTEXT_ARG}\""
echo "if [ -d \"${script_dir}/${path}/context/distr\" ]; then"
echo " rm -r \"${script_dir}/${path}/context/distr\""
echo "fi"
} >> "${stack_path}/docker-build.sh.tmp"
mv "${stack_path}/docker-build.sh.tmp" "${stack_path}/docker-build.sh"
chmod 744 "${stack_path}/docker-build.sh"
else
rm "${stack_path}/docker-build.sh.tmp"
fi
}
set -Eeo pipefail
paths=( "common_context" )
make_build_stack "common_context" paths[@]
make_compose_stack "common_context" paths[@]
declare name_stack
declare type_stack
# shellcheck disable=SC2034
declare -a paths_stack
init_stack name_stack type_stack paths_stack
if [ -z "${name_stack}" ] || [ -z "${type_stack}" ] || [ "${#paths_stack[@]}" == 0 ]; then
echo "Empty entries"
exit 1
fi;
if [ "${type_stack}" = "compose" ]; then
make_compose_stack "${name_stack}" paths_stack[@]
else
make_build_stack "${name_stack}" paths_stack[@]
fi;