1 #!/bin/bash
2
3 who am i
4 # 部署jar包通过cli的形式
5 set -x
6
7 #获取线上服务端口
8 PORT=$2
9
10 15
16 # 负载均衡目标组ID:register-targets
17 targets_arn="arn:aws:xxxxxxxx/elbwan-prod-mqtt-001/75dd805801b1fdce"
18
19 # 获取要部署的主机IP
20 #HOST_LIST=($(echo $HOST))
21
22 #项目名
23 REMOTE_PROJECT=$1
24
25 #远程JAR包存放目录
26 REMOTE_JARDIR=/apps/project/${REMOTE_PROJECT}
27
28
29 #远程执行用户
30 REMOTEUSER='co_dev'
31
32 # 服务器列表新增服务器都在这里面添加,因为aws ELB network loadbalance 的目标群组是instance的形式,不能通过IP的形式挂载/摘取机器所以自己建立了对应关系表
33 list[1]="prod1,i-0dae45bcc2d4f77ad,10.78.5.55"
34 list[2]="prod2,i-05c517e7856ef6f76,10.78.7.172"
35
36
37 # 查看要部署的机器
38 echo ${list[@]}
39
40 # 函数获取进程pid
41 jarpid () {
42 JAR_pid=`ssh ${REMOTEUSER}@${IP} ps -ef | grep "${REMOTE_JARDIR}/${REMOTE_PROJECT}.jar" | grep -v "grep"|awk '{print $2}'`
43 if [ -z "$JAR_pid" ] ; then break ;fi
44 }
45 ENV=`echo "$name"| awk -F ',' '{print $1}'`
46 ID=`echo "$name"| awk -F ',' '{print $2}'`
47 IP=`echo "$name"| awk -F ',' '{print $3}'`
48
49 # 获取编译后的包名
50 PACKAGE=`find ./ -name ${REMOTE_PROJECT}.jar`
51
52 # 从ELB找出负载均衡机器
53 /root/.local/bin/aws elbv2 deregister-targets --target-group-arn $targets_arn --targets Id=$ID
54 if [ $? -eq 0 ];then
55 i=1
56 while [[ $i < 5 ]]
57 do
58 jarpid
59 if [[ $i -eq 4 ]];then
60 ssh ${REMOTEUSER}@${IP} "kill -9 $JAR_pid"
61 break
62 fi
63
64 ssh ${REMOTEUSER}@${IP} "kill -15 $JAR_pid"
65 jarpid
66 sleep 10
67 let i++
68 done
69 else
70 echo “ELB 摘除机器失败,请检查”
71 exit 4
72 fi
73
74
75 # 远程主机备份.jar 包跟新新版本.jar包并启动
76 scp $PACKAGE ${REMOTEUSER}@${IP}:$REMOTE_JARDIR/${REMOTE_PROJECT}.jar
77 if [ $? -eq 0 ];then
78 jar_number=`ssh ${REMOTEUSER}@${IP} find /apps/project/${REMOTE_PROJECT} -name ${REMOTE_PROJECT}.jar | wc -l`
79 if [ $jar_number -ge 1 ];then
80 echo "${REMOTE_PROJECT}.jar 版本包已经cp 到${REMOTE_PROJECT}/bin 目录下,可以正常器启动${REMOTE_PROJECT}项目"
81 else
82 echo "${REMOTE_PROJECT}.jar No such file or directory 可能maven编译失败,请检查"
83 exit 2
84 fi
85 else
86 echo "${REMOTE_PROJECT}.jar No such file or directory 远程更新jar 失败"
87 exit 1
88 fi
89
90
91 # 启动jar 服务并检查端口
92 sleep 2
93 echo ".......................................开始启动$REMOTE_PROJECT 服务"
94 ssh ${REMOTEUSER}@${IP} "nohup /apps/sofe/jdk1.8.0_131/bin/java -jar -Xms13g -Xmx13g -Xss512k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:NewSize=11g -XX:MaxNewSize=11g -XX:SurvivorRatio=18 -XX:MaxDirectMemorySize=2g -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:-CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/apps/logs/grab_cycle_mqttserver/HeapDumpOnOutOfMemoryError -Dio.netty.allocator.type=pooled -Dspring.profiles.active="$ENV" ${REMOTE_JARDIR}/${REMOTE_PROJECT}.jar >>/apps/project/${REMOTE_PROJECT}/${REMOTE_PROJECT}.log 2>&1 &"
95 sleep 10
96 java_pid=`ssh $REMOTEUSER@$IP ps -ef | grep "${REMOTE_JARDIR}/$REMOTE_PROJECT" | egrep -v "grep"|wc -l`
97 if [[ $java_pid -ge 1 ]];then
98 echo "${REMOTE_PROJECT} startup is successful"
99 else
100 echo "${REMOTE_PROJECT} startup is filed"
101 exit 3
102 fi
103
104 # 从负载均衡器注册目标主机
105 /root/.local/bin/aws elbv2 register-targets --target-group-arn $targets_arn --targets Id=$ID
106 if [ $? -eq 0 ];then
107 echo "${IP} 服务器 ${REMOTE_PROJECT} 项目部署完毕.等待4分钟注册操作下一台机器..................................."
108 echo -e "
"
109 sleep 180
110 else
111 echo "${IP} 主机注册负载均衡失败"
112 exit 5
113 fi
114
115 done