310 lines
9.7 KiB
Bash
310 lines
9.7 KiB
Bash
#!/bin/bash
|
||
|
||
# Color definitions
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
CYAN='\033[36m'
|
||
RESET='\033[0m'
|
||
|
||
:<<'COMMENT'
|
||
通用红块场景自动化部署脚本
|
||
检测介质下载路径中是否包含以下介质:代码包和conda环境tar包,如果不存在则退出。
|
||
检测服务器节点目标conda环境是否存在,如果不存在则创建。
|
||
检测红块场景代码是否存在。
|
||
检测红块场景服务是否已启动,如果红块场景服务已启动,则终止红块场景服务。
|
||
备份红块场景代码
|
||
部署场景代码
|
||
启动场景代码
|
||
检查场景代码是否启动成功
|
||
执行curl命令验证场景代码
|
||
# Define the directory path for the red block scene
|
||
MEDIA_DOWNLOAD_PATH="/data/media"
|
||
RED_PATH="/data/redserver/red-agent-service"
|
||
RED_SCENE=$1 # 场景代码名称 外部传参
|
||
RED_SCENE_PATH="$RED_PATH/$RED_SCENE"
|
||
RED_SCENE_VERSION=$2 # 场景代码版本 外部传参
|
||
RED_SCENE_TAR="$RED_SCENE-$RED_SCENE_VERSION.tar.gz"
|
||
MINICONDA_PATH="/data/miniconda3/envs/"
|
||
CONDA_ENV=$3 # conda环境名称 外部传参
|
||
COMMENT
|
||
|
||
# 定义帮助信息
|
||
function print_help() {
|
||
echo "Usage: $0 [options]"
|
||
echo
|
||
echo "Options:"
|
||
echo " -h, --help 显示此帮助信息"
|
||
echo " --red-scene <scene> 场景代码名称,例如 'scene1'"
|
||
echo " --red-scene-version <version> 场景代码版本,例如 'V1.0.0.0'"
|
||
echo " --conda-env <conda_env> Conda环境名称,例如 'conda-scene1-V1.0.0.0'"
|
||
echo
|
||
echo "Example:"
|
||
echo " bash $0 --red-scene 'scene1' --red-scene-version 'V1.0.0.0' --conda-env 'conda-scene1-V1.0.0.0'"
|
||
}
|
||
|
||
# 初始化变量
|
||
MEDIA_DOWNLOAD_PATH="/data/media"
|
||
RED_PATH="/data/redserver/red-agent-service"
|
||
RED_SCENE=""
|
||
RED_SCENE_PATH=""
|
||
RED_SCENE_VERSION=""
|
||
RED_SCENE_TAR=""
|
||
MINICONDA_PATH="/data/miniconda3/envs/"
|
||
CONDA_ENV=""
|
||
|
||
# 检查是否有参数
|
||
if [ $# -eq 0 ]; then
|
||
echo "No arguments provided. Use -h or --help for help."
|
||
exit 1
|
||
fi
|
||
|
||
# 处理参数
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
-h|--help)
|
||
print_help
|
||
exit 0
|
||
;;
|
||
--red-scene)
|
||
shift
|
||
RED_SCENE=$1
|
||
RED_SCENE_PATH="$RED_PATH/$RED_SCENE"
|
||
shift
|
||
;;
|
||
--red-scene-version)
|
||
shift
|
||
RED_SCENE_VERSION=$1
|
||
RED_SCENE_TAR="$RED_SCENE-$RED_SCENE_VERSION.tar.gz"
|
||
shift
|
||
;;
|
||
--conda-env)
|
||
shift
|
||
CONDA_ENV=$1
|
||
shift
|
||
;;
|
||
*) # 未知选项
|
||
echo "未知选项: $1"
|
||
print_help
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# 打印参数值(调试用)
|
||
echo "MEDIA_DOWNLOAD_PATH: $MEDIA_DOWNLOAD_PATH"
|
||
echo "RED_PATH: $RED_PATH"
|
||
echo "RED_SCENE: $RED_SCENE"
|
||
echo "RED_SCENE_PATH: $RED_SCENE_PATH"
|
||
echo "RED_SCENE_VERSION: $RED_SCENE_VERSION"
|
||
echo "RED_SCENE_TAR: $RED_SCENE_TAR"
|
||
echo "MINICONDA_PATH: $MINICONDA_PATH"
|
||
echo "CONDA_ENV: $CONDA_ENV"
|
||
|
||
# 检查介质下载路径中是否包含以下介质:代码包和conda环境tar包,如果不存在则退出。
|
||
check_media_list() {
|
||
echo -e "${CYAN}Checking media files...${RESET}"
|
||
cd "$MEDIA_DOWNLOAD_PATH"
|
||
if [ -f "$RED_SCENE_TAR" ]; then
|
||
echo -e "${GREEN}The media file $RED_SCENE_TAR exists.${RESET}"
|
||
else
|
||
echo -e "${RED}The media file $RED_SCENE_TAR does not exist.${RESET}"
|
||
exit 1
|
||
fi
|
||
if [ -f "$CONDA_ENV.tar.gz" ]; then
|
||
echo -e "${GREEN}The media file $CONDA_ENV.tar.gz exists.${RESET}"
|
||
else
|
||
echo -e "${RED}The media file $CONDA_ENV.tar.gz does not exist.${RESET}"
|
||
fi
|
||
}
|
||
|
||
# 如果当前服务器节点中已存在红块场景代码,则备份红块场景代码。
|
||
backup_red_block() {
|
||
cd "$RED_PATH"
|
||
local current_time=$(date +"%Y%m%d%H%M%S")
|
||
if [ ! -d "$RED_SCENE-bak" ]; then
|
||
mkdir "$RED_SCENE-bak"
|
||
fi
|
||
mv "$RED_SCENE" "$RED_SCENE-bak/$RED_SCENE-$current_time"
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}Red block code backup succeeded.${RESET}"
|
||
else
|
||
echo -e "${RED}Red block code backup failed.${RESET}"
|
||
fi
|
||
}
|
||
|
||
# 将介质下载路径中的红块场景代码压缩包拷贝至/data/redserver/red-agent-service目录下,并解压,重命名,修改用户和用户组。
|
||
deploy_red_block() {
|
||
echo -e "${CYAN}Start deploying code.${RESET}"
|
||
cd "$RED_PATH"
|
||
cp "$MEDIA_DOWNLOAD_PATH/$RED_SCENE_TAR" ./
|
||
tar -zxf "$RED_SCENE_TAR"
|
||
mv "$RED_SCENE-$RED_SCENE_VERSION" "$RED_SCENE"
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}Red block code deployed successfully.${RESET}"
|
||
else
|
||
echo -e "${RED}Red block code deployment failed.${RESET}"
|
||
fi
|
||
chown -R inspur:inspur "$RED_SCENE_PATH"
|
||
rm -rf "$RED_SCENE_TAR"
|
||
}
|
||
|
||
# 检查服务器节点中conda环境是否存在
|
||
check_conda_env() {
|
||
cd "$MINICONDA_PATH"
|
||
if [ ! -d "$CONDA_ENV" ]; then
|
||
echo -e "${RED}The environment $CONDA_ENV does not exist.${RESET}"
|
||
return 1
|
||
else
|
||
echo -e "${GREEN}The environment $CONDA_ENV exists.${RESET}"
|
||
return 0
|
||
fi
|
||
}
|
||
|
||
# 将介质下载路径中的conda环境压缩包解压至/data/miniconda3/envs/$CONDA_ENV目录下,修改用户和用户组。
|
||
deploy_conda_env() {
|
||
cd "$MINICONDA_PATH"
|
||
mkdir "$CONDA_ENV"
|
||
cd "$MEDIA_DOWNLOAD_PATH"
|
||
tar -zxf "$CONDA_ENV.tar.gz" -C "$MINICONDA_PATH/$CONDA_ENV"
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}The environment $CONDA_ENV has been created.${RESET}"
|
||
else
|
||
echo -e "${RED}Failed to create environment $CONDA_ENV.${RESET}"
|
||
exit 1
|
||
fi
|
||
chown -R inspur:inspur "$MINICONDA_PATH/$CONDA_ENV"
|
||
}
|
||
|
||
# 调用业务代码中的check.sh脚本,检查红块服务是否已启动成功。
|
||
check_red_block_service_process() {
|
||
cd "$RED_SCENE_PATH"
|
||
check_result=$(bash check.sh)
|
||
# 检查输出内容
|
||
if [[ "$check_result" == *"SUCC"* ]]; then
|
||
return 0
|
||
elif [[ "$check_result" == *"FAIL"* ]]; then
|
||
return 1
|
||
else
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 调用业务代码中的stop.sh脚本,终止红块服务。
|
||
stop_red_block() {
|
||
cd "$RED_SCENE_PATH"
|
||
bash stop.sh > /dev/null 2>&1
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}Red block service stopped successfully.${RESET}"
|
||
else
|
||
echo -e "${RED}Failed to stop red block service.${RESET}"
|
||
fi
|
||
}
|
||
|
||
# 激活conda环境,调用业务代码中的start.sh脚本,启动红块服务。
|
||
start_red_block() {
|
||
source /etc/profile
|
||
echo -e "${CYAN}HAIRUO_ENV=$HAIRUO_ENV${RESET}"
|
||
su - inspur << EOF
|
||
source /data/miniconda3/etc/profile.d/conda.sh
|
||
conda activate $CONDA_ENV
|
||
cd "$RED_SCENE_PATH"
|
||
bash start.sh
|
||
EOF
|
||
}
|
||
|
||
# 轮询检测红块服务是否已启动成功
|
||
check_red_block_started() {
|
||
local start_time=$(date +%s)
|
||
local timeout=120
|
||
local interval=5
|
||
while true; do
|
||
sleep $interval
|
||
if check_red_block_service_process; then
|
||
echo -e "${GREEN}Red block service started successfully.${RESET}"
|
||
break
|
||
fi
|
||
local current_time=$(date +%s)
|
||
local elapsed_time=$(($current_time - $start_time))
|
||
if [ $elapsed_time -ge $timeout ]; then
|
||
echo -e "${RED}Failed to start red block service.${RESET}"
|
||
return 1
|
||
fi
|
||
done
|
||
}
|
||
|
||
# 回滚红块场景代码,暂时未用到
|
||
rollback_red_block(){
|
||
cd "$RED_PATH"
|
||
if [ ! -d "$RED_SCENE-bak" ]; then
|
||
echo -e "${RED}The backup directory does not exist and cannot be rolled back${RESET}"
|
||
else
|
||
echo -e "${GREEN}The backup directory exists, start rollback${RESET}"
|
||
rm -rf "$RED_SCENE"
|
||
local latest_backup=$(ls -td $RED_SCENE-bak/$RED_SCENE-* | head -1)
|
||
mv "$latest_backup" "$RED_SCENE"
|
||
fi
|
||
}
|
||
|
||
# 调用业务代码中的curl.sh脚本,验证红块场景代码
|
||
red_block_curl_verification(){
|
||
echo -e "${GREEN}Start to execute the curl command to verify the red block${RESET}"
|
||
cd "$RED_SCENE_PATH"
|
||
cat curl.sh
|
||
echo -e "${GREEN}The curl command returns the following results:${RESET}"
|
||
bash curl.sh
|
||
}
|
||
|
||
# Main function
|
||
main() {
|
||
echo -e "${CYAN}======================$RED_SCENE======================${RESET}"
|
||
check_media_list
|
||
if ! check_conda_env; then
|
||
deploy_conda_env
|
||
fi
|
||
if [ -d "$RED_PATH" ]; then
|
||
if [ -d "$RED_SCENE_PATH" ]; then
|
||
echo -e "${GREEN}Directory $RED_SCENE_PATH exists.${RESET}"
|
||
if check_red_block_service_process; then
|
||
echo -e "${GREEN}Red block service process already exists, starting to stop the process.${RESET}"
|
||
stop_red_block
|
||
else
|
||
echo -e "${RED}Red block service process does not exist. Start to start the model service.${RESET}"
|
||
fi
|
||
backup_red_block
|
||
else
|
||
echo -e "${RED}Directory $RED_SCENE_PATH does not exist.${RESET}"
|
||
fi
|
||
else
|
||
echo -e "${RED}Directory $RED_PATH does not exist.${RESET}"
|
||
mkdir -p "$RED_PATH"
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}Directory $RED_PATH created successfully.${RESET}"
|
||
else
|
||
echo -e "${RED}Failed to create directory $RED_PATH.${RESET}"
|
||
exit 1
|
||
fi
|
||
fi
|
||
deploy_red_block
|
||
start_red_block
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}Red block service is starting.${RESET}"
|
||
fi
|
||
check_red_block_started
|
||
:<<'COMMENT'
|
||
if [ $? -eq 1 ]; then
|
||
echo -e "${RED}Start executing rollback function.${RESET}"
|
||
rollback_red_block
|
||
start_red_block
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}Red block service is starting.${RESET}"
|
||
fi
|
||
check_red_block_started
|
||
fi
|
||
COMMENT
|
||
red_block_curl_verification
|
||
echo -e "\n${CYAN}======================$RED_SCENE======================${RESET}"
|
||
}
|
||
|
||
# Execute the main function
|
||
main
|