123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #!/bin/bash
- ####################################
- # @description 远程服务器-部署脚本
- # @params $? => 代表上一个命令执行后的退出状态: 0->成功,1->失败
- # @example => sh ssh-publish.sh 参数值1 参数值2 参数值n ...
- # @author Zenas
- # @date 2025/01/23
- ####################################
- # 在执行过程中若遇到使用了未定义的变量或命令返回值为非零,将直接报错退出
- set -eu
- # 仅测试时期查看脚本传参使用
- echo ${*} >> /var/jenkins_home/workspace/weichi-crm-server/logs/run.log
- # 检查参数个数
- if [ "${#}" -ne 9 ]; then
- echo "脚本参数不合法,程序终止!"
- exit
- fi
- # 当前时间
- CURRENT_TIME=`date +"%Y-%m-%d %H:%M:%S"`
- # 执行脚本时传过来的参数
- DOCKER_REGISTRY_AUTH_CMD=${1}
- PROJECT_SERVICE_LOG_HOME=${2}
- current_app_name=${3}
- app_docker_image_name=${4}
- app_docker_image_tag=${5}
- app_docker_image=${6}
- ETH_VALUE=${7}
- current_app_port=${8}
- JAVA_OPTS=${9}
- # 本机内网ip
- INET_IP=`ifconfig ${ETH_VALUE} | grep inet | grep -v inet6 | awk '{print $2}'`
- # 远程服务器下依次执行如下命令
- # ----------------------------------------------------------------------------------------------------------------------
- # 初始化
- function init() {
- # 镜像仓库认证
- ${DOCKER_REGISTRY_AUTH_CMD}
- # 创建日志文件
- mkdir -p ${PROJECT_SERVICE_LOG_HOME}
- cd ${PROJECT_SERVICE_LOG_HOME}
- touch ${current_app_name}.log
- }
- init
- # ----------------------------------------------------------------------------------------------------------------------
- # 判断当前端口是否被占用,没被占用返回0,反之1
- function Listening {
- TCPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
- UDPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`
- (( Listeningnum = TCPListeningnum + UDPListeningnum ))
- if [ $Listeningnum == 0 ]; then
- echo "0"
- else
- echo "1"
- fi
- }
- # 获取随机端口
- function get_random_port {
- # 随机端口值
- random_port=0
- temp_num=0
- while [ ${random_port} == 0 ]; do
- # 指定区间随机数
- temp_num=`shuf -i ${1}-${2} -n1`
- # echo "temp_num=${temp_num}"
- if [ `Listening ${temp_num}` == 0 ] ; then
- random_port=${temp_num}
- fi
- done
- echo "${random_port}"
- }
- # 获取sentinel随机端口
- SENTINEL_PORT=`get_random_port 30100 30200`
- echo "${CURRENT_TIME} sentinel随机端口号: ${SENTINEL_PORT}" >> ${PROJECT_SERVICE_LOG_HOME}/run.log
- # ----------------------------------------------------------------------------------------------------------------------
- # 运行程序
- function run() {
- # 删除旧容器
- docker ps -a | grep ${app_docker_image_name} | grep ${app_docker_image_tag} | awk '{print $1}' | xargs -i docker stop {} | xargs -i docker rm {}
- # 删除旧镜像
- docker images | grep -E ${app_docker_image_name} | grep ${app_docker_image_tag}| awk '{print $3}' | uniq | xargs -I {} docker rmi --force {}
- # 拉取新镜像
- docker pull ${app_docker_image}
- # 运行日志记录
- echo "****** ${CURRENT_TIME} docker run -d -p ${current_app_port}:${current_app_port} -p ${SENTINEL_PORT}:${SENTINEL_PORT} \
- -e JAVA_OPTS="${JAVA_OPTS} -Dspring.cloud.nacos.discovery.ip=${INET_IP} \
- -Dspring.cloud.sentinel.transport.client-ip=${INET_IP} -Dspring.cloud.sentinel.transport.port=${SENTINEL_PORT}" \
- -v ${PROJECT_SERVICE_LOG_HOME}/${current_app_name}.log:/home/${current_app_name}.log \
- --name ${current_app_name} ${app_docker_image}" >> ${PROJECT_SERVICE_LOG_HOME}/run.log
- # 运行
- docker run -d -p ${current_app_port}:${current_app_port} -p ${SENTINEL_PORT}:${SENTINEL_PORT} \
- -e JAVA_OPTS="${JAVA_OPTS} -Dspring.cloud.nacos.discovery.ip=${INET_IP} \
- -Dspring.cloud.sentinel.transport.client-ip=${INET_IP} -Dspring.cloud.sentinel.transport.port=${SENTINEL_PORT}" \
- -v ${PROJECT_SERVICE_LOG_HOME}/${current_app_name}.log:/home/${current_app_name}.log \
- --name ${current_app_name} ${app_docker_image}
- }
- run
|