jenkins滚动发布脚本

 

 

#!/bin/bash
# 环境变量
export JAVA_HOME=/usr/local/jdk-17.0.1
export MAVEN_HOME=/usr/local/apache-maven-3.8.8
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
# 应用名称
app_name="szsh-ali"
# 环境
env="dev"
base_dir="/data/jenkins/build/${app_name}"
timestamp=$(date +%Y-%m-%d-%H-%M-%S)
mkdir -p "${base_dir}/${timestamp}"
cp -r . "${base_dir}/${timestamp}/"
cd "${base_dir}/${timestamp}"

# 主机 IP 映射
dev01="192.168.2.104"
dev02="192.168.2.105"
hosts="dev01,dev02"

# 输出绿色文本
function info() {
  echo -e "\033[32m$1\033[0m"
}

# 输出红色文本
function error() {
  echo -e "\033[31m$1\033[0m"
}

if [ -z "${servers_online}" ] && [ -z "${servers_offline}" ]; then
     error "没有选择服务器!"
     exit 1
fi

# 打包
if mvn clean package -DskipTests; then
    info "✅打包成功!"
else
    error "❌打包失败,退出!"
    exit 1
fi

# 部署服务
function deploy() {
  local servers=$1
  ansible "${servers}" -m copy -a "src=${base_dir}/${timestamp}/ali-client/target/${app_name}.jar dest=/data/apps/${app_name}.jar" || exit 1
  ansible "${servers}" -m shell -a "supervisorctl restart ${app_name}" || exit 1
}

# 下线服务
function offline(){
  local servers=$1
  ansible "$servers" -m shell -a "supervisorctl stop ${app_name}" || exit 1
  info "✅ ${app_name} 在 $servers 下线成功!"
}

# 检查服务注册,这种检查方式不太好,弃用
function check_register() {
  local servers=$1
  local python_script="/data/scripts/query_service_detail.py"
  info "等待注册中..."
  sleep 60
  for server in $servers; do
    if [[ "$hosts" == *"$server"* ]]; then
      ip=$(eval echo \$${server})
      result=$(python "$python_script" ${env} "$app_name")
      if [[ "$result" == *"$ip"* ]]; then
        info "✅ $app_name 在 $server 注册成功"
      else
        error "❌ $app_name 在 $server 注册失败"
        exit 1
      fi
    fi
  done
}

function check_register_b() {
    local servers=$1
    local python_script="/data/scripts/query_service_detail.py"
    timeout=60                  # 最长等待时间,单位秒
    interval=5                  # 每隔5秒请求一次
    elapsed=0
    found=0                     # 标志位

    while [ $elapsed -lt $timeout ]; do
        for server in $servers; do
            if [[ "$hosts" == *"$server"* ]]; then
                ip=$(eval echo \$${server})
                result=$(python "$python_script" ${env} "ali")
                if [[ "$result" == *"$ip"* ]]; then
                    info "✅ $app_name 在 $server 注册成功"
                    found=1
                    break 2     # 🛑 跳出 while + for
                else
                    info "在注册中,请等待5秒"
                fi
            fi
        done
        sleep $interval
        elapsed=$((elapsed + interval))
    done

    if [[ $found -eq 0 ]]; then
        error "超过一分钟未注册,退出!"
        exit 1
    fi
}

if [ -z "${servers_online}" ]; then
    info "本次没有要上线的机器"
else
    info  "上线:${servers_online}"
    deploy  ${servers_online}
    check_register_b  ${servers_online}
fi

if [ -z "${servers_offline}" ]; then
    info "本次没有要下线的机器"
else
    info  "下线:${servers_offline}"
    offline ${servers_offline}
fi

  

posted @ 2025-07-11 17:51  羊脂玉净瓶  阅读(4)  评论(0)    收藏  举报