jenkins的灰度发布

环境如图:
简单环境搭建:

keepalived

MASTER38

root@38:~# vim /etc/keepalived/keepalived.conf
...
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    garp_master_delay 10
    #smtp_alert
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.88 dev eth0 label eth0:1
    }
}

BACKUP

root@48:~# vim /etc/keepalived/keepalived.conf
...
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    garp_master_delay 10
    #smtp_alert
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.88 dev eth0 label eth0:1
    }
}

haproxy

38

root@38:~# echo >> "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
root@38:~# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
root@38:~# sysctl -a | grep nonlocal
net.ipv4.ip_nonlocal_bind = 1

root@38:~# vim /etc/haproxy/haproxy.cfg
...
listen tomcat-web-80
  bind 10.0.0.88:80
  mode http
  balance roundrobin
  server tomcat-1 10.0.0.58:8080 check inter 3s fall 3 rise 3
  server tomcat-2 10.0.0.68:8080 check inter 3s fall 3 rise 3

listen status
  bind :9009
  stats enable
  stats uri /haproxy-status
  stats realm HAProxy\ Stats\ Page
  stats auth haadmin:lijie
  stats auth admin:lijie

48

root@48:~# echo >> "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
root@48:~# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
root@48:~# sysctl -a | grep nonlocal
net.ipv4.ip_nonlocal_bind = 1

root@48:~# vim /etc/haproxy/haproxy.cfg
...
listen tomcat-web-80
  bind 10.0.0.88:80
  mode http
  server tomcat-1 10.0.0.58:8080 check inter 3s fall 3 rise 3
  server tomcat-2 10.0.0.68:8080 check inter 3s fall 3 rise 3

listen status
  bind :9009
  stats enable
  stats uri /haproxy-status
  stats realm HAProxy\ Stats\ Page
  stats auth haadmin:lijie
  stats auth admin:lijie

tomcat

appBase目录如下
<Host name="localhost"  appBase="/data/tomcat/tomcat_webapps"
            unpackWARs="true" autoDeploy="true">

root@58:~# hostname -I > /data/tomcat/tomcat_webdir/myapp/index.jsp
root@58:~# tree /data/tomcat/
/data/tomcat/
├── tomcat_appdir
├── tomcat_webapps
│   └── myapp -> /data/tomcat/tomcat_webdir/myapp
└── tomcat_webdir
    └── myapp
        └── index.jsp

root@68:~# hostname -I > /data/tomcat/tomcat_webdir/myapp/index.jsp
root@68:~# tree /data/tomcat/
/data/tomcat/
├── tomcat_appdir
├── tomcat_webapps
│   └── myapp -> /data/tomcat/tomcat_webdir/myapp/
└── tomcat_webdir
    └── myapp
        └── index.jsp

5 directories, 1 file

访问测试

root@18:~# curl http://10.0.0.88/myapp/
10.0.0.58 
root@18:~# curl http://10.0.0.88/myapp/
10.0.0.68 
root@18:~# curl http://10.0.0.88/myapp/
10.0.0.58 
root@18:~# curl http://10.0.0.88/myapp/
10.0.0.68 

jenkins的job脚本

代码clone:

首先需要完成gitlab中添加jenkins的公钥作为ssh-key实现非交互式代码克隆

代码部署:

需要将jenkins的公钥推送到web服务器,实现代码非交互式拷贝;

root@28:~# ssh-copy-id root@10.0.0.68
root@28:~# ssh-copy-id root@10.0.0.58
root@28:~# ssh root@10.0.0.68 'hostname -I'
10.0.0.68 
root@28:~# ssh root@10.0.0.58 'hostname -I'
10.0.0.58 

部署脚本

#!/bin/bash
DATE=`date +%Y-%m-%d_%H_%M_%S`
METHOD=$1
BRANCH=$2
GROUP_LIST=$3
HA1="10.0.0.38"
HA2="10.0.0.48"
OK_COLOR="echo -e \e[1;32m"
ERR_COLOR="echo -e \e[1;35m"
END="\e[0m"

host_list(){
  if [ ${GROUP_LIST} = group1 ];then
	  hosts="10.0.0.58"
  elif [ ${GROUP_LIST} = group2 ];then
	  hosts="10.0.0.68"
  else
	  hosts="10.0.0.58 10.0.0.68"
  fi
}

code_clone(){
  cd /data/gitdata/ && rm -rf ./*
  ${OK_COLOR} "开始clone ${BRANCH}分支代码到`pwd`" ${END}
  git clone -b ${BRANCH} git@10.0.0.18:magedu/test.git && echo "代码克隆完成" && echo "代码克隆完成"
}

code_scanner(){
  echo "开始代码扫描"
}

code_compress(){
  cd /data/gitdata/test && tar czvf code.tar.gz ./index.html && echo "代码打包完成"
}

node_down(){
  ssh root@${HA1} "echo "disable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock" && echo ${hosts}从HA1下线成功
  ssh root@${HA2} "echo "disable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock" && echo ${hosts}从HA2下线成功
}

tomcat_down(){
  echo "${node}即将停止tomcat服务"
  ssh root@${node} "/apps/tomcat/bin/catalina.sh stop" && echo "tomcat服务已停止"
  sleep 1 && echo 3
  sleep 1 && echo 2
  sleep 1 && echo 1
}

code_deploy(){
  scp /data/gitdata/test/code.tar.gz root@${node}:/data/tomcat/tomcat_appdir/code-${DATE}.tar.gz && echo "${node}代码拷贝完成"
  ssh root@${node} "mkdir /data/tomcat/tomcat_webdir/code-${DATE} && tar xzvf /data/tomcat/tomcat_appdir/code-${DATE}.tar.gz -C /data/tomcat/tomcat_webdir/code-${DATE} && rm -rf /data/tomcat/tomcat_webapps/myapp && ln -sv /data/tomcat/tomcat_webdir/code-${DATE} /data/tomcat/tomcat_webapps/myapp"
}

tomcat_up(){
  echo "${node}正在启动tomcat"
  ssh root@${node} "/apps/tomcat/bin/catalina.sh start" && echo "tomcat服务已启动"
  sleep 1 && echo 3
  sleep 1 && echo 2
  sleep 1 && echo 1
  curl http://${node}:8080/myapp && echo "${node}部署完成"
}

node_up(){
   ssh root@${HA1} "echo "enable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock"\
   && echo ${node}从HA1上线成功 
   ssh root@${HA2} "echo "enable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock"\
   && echo ${node}从HA2上线成功 
}

code_del(){
  ssh root@${node} "rm -rf /data/tomcat/tomcat_appdir/*"
  VER_NUM=`ssh root@${node} "/bin/ls -ldrt /data/tomcat/tomcat_webdir/code-* | wc -l"`
  if [ ${VER_NUM} -gt 3 ];then
    OLD_CODE_DIR=`ssh root@${node} ""/bin/ls -ldrt /data/tomcat/tomcat_webdir/code-* | head -n1 | awk '{print $NF}'""`
    ssh root@${node} "rm -rf ${OLD_CODE_DIR}" && "旧代码${OLD_CODE_DIR}删除成功"
  else
    echo "旧代码未超过3个版本无需删除"
  fi
}

code_rollback(){
  NOW_VER=`ssh root@${node} ""/bin/ls -ld /data/tomcat/tomcat_webapps/myapp | awk '{print $NF}'""`
  NOW_VER=`basename ${NOW_VER}`
  echo "当前代码版本是: ${NOW_VER}"
  PRE_VER=`ssh root@${node} ""/bin/ls -lrt /data/tomcat/tomcat_webdir/ | grep -B 1 ${NOW_VER} | head -n1 | awk '{print $NF}'""`
  echo "前一版本: ${PRE_VER}"
  ssh root@${node} "rm -rf /data/tomcat/tomcat_webapps/myapp && ln -sv /data/tomcat/tomcat_webdir/${PRE_VER} /data/tomcat/tomcat_webapps/myapp"
}

case $METHOD in
deploy)
    host_list
    code_clone
    code_scanner
    code_compress
    #code_scanner
    for node in ${hosts};do
      node_down
      tomcat_down
      code_deploy
      tomcat_up
      node_up
      code_del
    done
    ;;
rollback)
    host_list
  for node in ${hosts};do
    node_down
    tomcat_down
    code_rollback
    tomcat_up
    node_up
  done
    ;;
esac
posted @ 2021-11-19 23:04  windman  阅读(954)  评论(0编辑  收藏  举报