ssh-publish.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/bin/bash
  2. ####################################
  3. # @description 远程服务器-部署脚本
  4. # @params $? => 代表上一个命令执行后的退出状态: 0->成功,1->失败
  5. # @example => sh ssh-publish.sh 参数值1 参数值2 参数值n ...
  6. # @author Zenas
  7. # @date 2025/01/23
  8. ####################################
  9. # 在执行过程中若遇到使用了未定义的变量或命令返回值为非零,将直接报错退出
  10. set -eu
  11. # 仅测试时期查看脚本传参使用
  12. echo ${*} >> /var/jenkins_home/workspace/weichi-crm-server/logs/run.log
  13. # 检查参数个数
  14. if [ "${#}" -ne 9 ]; then
  15. echo "脚本参数不合法,程序终止!"
  16. exit
  17. fi
  18. # 当前时间
  19. CURRENT_TIME=`date +"%Y-%m-%d %H:%M:%S"`
  20. # 执行脚本时传过来的参数
  21. DOCKER_REGISTRY_AUTH_CMD=${1}
  22. PROJECT_SERVICE_LOG_HOME=${2}
  23. current_app_name=${3}
  24. app_docker_image_name=${4}
  25. app_docker_image_tag=${5}
  26. app_docker_image=${6}
  27. ETH_VALUE=${7}
  28. current_app_port=${8}
  29. JAVA_OPTS=${9}
  30. # 本机内网ip
  31. INET_IP=`ifconfig ${ETH_VALUE} | grep inet | grep -v inet6 | awk '{print $2}'`
  32. # 远程服务器下依次执行如下命令
  33. # ----------------------------------------------------------------------------------------------------------------------
  34. # 初始化
  35. function init() {
  36. # 镜像仓库认证
  37. ${DOCKER_REGISTRY_AUTH_CMD}
  38. # 创建日志文件
  39. mkdir -p ${PROJECT_SERVICE_LOG_HOME}
  40. cd ${PROJECT_SERVICE_LOG_HOME}
  41. touch ${current_app_name}.log
  42. }
  43. init
  44. # ----------------------------------------------------------------------------------------------------------------------
  45. # 判断当前端口是否被占用,没被占用返回0,反之1
  46. function Listening {
  47. TCPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
  48. UDPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`
  49. (( Listeningnum = TCPListeningnum + UDPListeningnum ))
  50. if [ $Listeningnum == 0 ]; then
  51. echo "0"
  52. else
  53. echo "1"
  54. fi
  55. }
  56. # 获取随机端口
  57. function get_random_port {
  58. # 随机端口值
  59. random_port=0
  60. temp_num=0
  61. while [ ${random_port} == 0 ]; do
  62. # 指定区间随机数
  63. temp_num=`shuf -i ${1}-${2} -n1`
  64. # echo "temp_num=${temp_num}"
  65. if [ `Listening ${temp_num}` == 0 ] ; then
  66. random_port=${temp_num}
  67. fi
  68. done
  69. echo "${random_port}"
  70. }
  71. # 获取sentinel随机端口
  72. SENTINEL_PORT=`get_random_port 30100 30200`
  73. echo "${CURRENT_TIME} sentinel随机端口号: ${SENTINEL_PORT}" >> ${PROJECT_SERVICE_LOG_HOME}/run.log
  74. # ----------------------------------------------------------------------------------------------------------------------
  75. # 运行程序
  76. function run() {
  77. # 删除旧容器
  78. docker ps -a | grep ${app_docker_image_name} | grep ${app_docker_image_tag} | awk '{print $1}' | xargs -i docker stop {} | xargs -i docker rm {}
  79. # 删除旧镜像
  80. docker images | grep -E ${app_docker_image_name} | grep ${app_docker_image_tag}| awk '{print $3}' | uniq | xargs -I {} docker rmi --force {}
  81. # 拉取新镜像
  82. docker pull ${app_docker_image}
  83. # 运行日志记录
  84. echo "****** ${CURRENT_TIME} docker run -d -p ${current_app_port}:${current_app_port} -p ${SENTINEL_PORT}:${SENTINEL_PORT} \
  85. -e JAVA_OPTS="${JAVA_OPTS} -Dspring.cloud.nacos.discovery.ip=${INET_IP} \
  86. -Dspring.cloud.sentinel.transport.client-ip=${INET_IP} -Dspring.cloud.sentinel.transport.port=${SENTINEL_PORT}" \
  87. -v ${PROJECT_SERVICE_LOG_HOME}/${current_app_name}.log:/home/${current_app_name}.log \
  88. --name ${current_app_name} ${app_docker_image}" >> ${PROJECT_SERVICE_LOG_HOME}/run.log
  89. # 运行
  90. docker run -d -p ${current_app_port}:${current_app_port} -p ${SENTINEL_PORT}:${SENTINEL_PORT} \
  91. -e JAVA_OPTS="${JAVA_OPTS} -Dspring.cloud.nacos.discovery.ip=${INET_IP} \
  92. -Dspring.cloud.sentinel.transport.client-ip=${INET_IP} -Dspring.cloud.sentinel.transport.port=${SENTINEL_PORT}" \
  93. -v ${PROJECT_SERVICE_LOG_HOME}/${current_app_name}.log:/home/${current_app_name}.log \
  94. --name ${current_app_name} ${app_docker_image}
  95. }
  96. run