jenkins/deploy_red_agent_service.sh
2025-04-22 10:44:36 +08:00

310 lines
9.7 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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