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