#!/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 场景代码名称,例如 'scene1'" echo " --red-scene-version 场景代码版本,例如 'V1.0.0.0'" echo " --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