DevOps-Jenkins 实现DevOps流水线代码部署-参数化构建基础


 新建job任务

参数化构建

在执行构建时可根据参数选项执行

 

执行脚本并传递参数

点击立即构建可以看到会有参数选择,执行时根据自己需求构建

下列是参考脚本

#!/bin/bash
DATE=`date +%Y-%m-%d_%H-%M-%S`
METHOD=$1
BRANCH=$2
GROUP_LIST=$3

function IP_list(){
  if [[ ${GROUP_LIST} == "GROUP1" ]];then
     Server_IP="192.168.0.142"
     echo ${Server_IP}
     #ssh root@172.31.0.103 ""echo disable  server linux39-web-80-master/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
     #ssh root@172.31.0.104 ""echo disable  server linux39-web-80-master/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
  elif [[ ${GROUP_LIST} == "GROUP2" ]];then
     Server_IP="192.168.0.79"
     echo ${Server_IP}
     #从调度器下线后端服务器,如果调度器开启了多进程,则需要从每一个进程都下线
     #ssh root@172.31.0.103 ""echo enable  server linux39-web-80-master/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
     #ssh root@172.31.0.104 ""echo enable  server linux39-web-80-master/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
  elif [[ ${GROUP_LIST} == "GROUP3" ]];then
     Server_IP="192.168.0.142 192.168.0.79"
     echo ${Server_IP}
  fi
}

function clone_code(){
  cd /data/git/linux39/ && rm -rf web1
  git clone -b ${BRANCH} git@159.138.5.152:linux39/web1.git
  echo "代码clone完成"
}

#代码质量扫描
#function scanner_code(){
#  cd /data/git/linux39/web1 && /usr/local/sonar-scanner/bin/sonar-scanner
#  echo "代码扫描完成,请打开sonarqube查看扫描结果"
#}

function code_maven(){
  echo  "cd /data/git/linux39/web1 && mvn clean package -Dmaven.test.skip=true"
  echo "代码编译完成"
}


function make_zip(){
  cd /data/git/linux39/web1   && zip -r code.zip ./
  echo "代码打包完成"
}

#下线后端服务器
#down_node(){
  #for node in ${Server_IP};do
    #jenkins到后端服务器免密钥登录
    #ssh root@172.31.0.103 "echo "disable server  linux39-web-80-master/${node}" | socat stdio /run/haproxy/admin.sock"
    #echo "${node} 从负载均衡172.31.0.103下线成功"
    #ssh root@172.31.0.104 "echo "disable server  linux39-web-80-master/${node}" | socat stdio /run/haproxy/admin.sock"
    #echo "${node} 从负载均衡172.31.0.104下线成功"
  #done
#}

function stop_tomcat(){
  for node in ${Server_IP};do
    ssh www@${node}   "/opt/apps/tomcat.sh stop"
  done
}

function scp_zipfile(){
  for node in ${Server_IP};do
    scp /data/git/linux39/web1/code.zip  www@${node}:/data/tomcat/tomcat_appdir/code-${DATE}.zip
    ssh www@${node} "unzip /data/tomcat/tomcat_appdir/code-${DATE}.zip  -d /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"
  done
}


function start_tomcat(){
  for node in ${Server_IP};do
    ssh www@${node}   "/etc/init.d/tomcat start"
    #sleep 5
  done
}

function web_test(){
  sleep 5
  for node in ${Server_IP};do
    NUM=`curl -s  -I -m 10 -o /dev/null  -w %{http_code}  http://${node}:8080/myapp/index.html`
    if [[ ${NUM} -eq 200 ]];then
       echo "${node} 测试通过,即将添加到负载"
       add_node ${node}
    else
       echo "${node} 测试失败,请检查该服务器是否成功启动tomcat"
    fi
  done
}

function add_node(){
   node=$1
    echo ${node},"----->"
    #if [[ ${GROUP_LIST} == "GROUP2" ]];then
    #  ssh root@172.31.0.103 ""echo enable  server linux39-web-80-master/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
    #  ssh root@172.31.0.104 ""echo enable  server linux39-web-80-master/172.31.0.105" | socat stdio /run/haproxy/admin.sock"     
    #fi
    ##########################################
    if [ ${node} == "172.31.0.105" ];then
       echo "172.31.0.105 部署完毕,请进行代码测试!"
    else
      ssh root@172.31.0.103 ""echo enable  server linux39-web-80-master/${node}" | socat stdio /run/haproxy/admin.sock"
      ssh root@172.31.0.104 ""echo enable  server linux39-web-80-master/${node}" | socat stdio /run/haproxy/admin.sock"
    fi
}

function rollback_last_version(){
  for node in ${Server_IP};do
   echo $node
   NOW_VERSION=`ssh www@${node} ""/bin/ls -l  -rt /data/tomcat/tomcat_webapps/ | awk -F"->" '{print $2}'  | tail -n1""`
   NOW_VERSION=`basename ${NOW_VERSION}`
   echo $NOW_VERSION,"NOW_VERSION"
    NAME=`ssh  www@${node}  ""ls  -l  -rt  /data/tomcat/tomcat_webdir/ | grep -B 1 ${NOW_VERSION} | head -n1 | awk '{print $9}'""`
   echo $NAME,""NAME
   ssh www@${node} "rm -rf /data/tomcat/tomcat_webapps/myapp && ln -sv  /data/tomcat/tomcat_webdir/${NAME} /data/tomcat/tomcat_webapps/myapp"
  done 
}

function delete_history_version(){
  for node in ${Server_IP};do
    ssh www@${node} "rm -rf /data/tomcat/tomcat_appdir/*"
    NUM=`ssh www@${node}  ""/bin/ls -l -d   -rt /data/tomcat/tomcat_webdir/code-* | wc -l""`
    echo $NUM
      if [ ${NUM} -gt 10 ];then
         NAME=`ssh www@${node} ""/bin/ls -l -d   -rt /data/tomcat/tomcat_webdir/code-* | head -n1 | awk '{print $9}'""`
         ssh www@${node} "rm -rf ${NAME}"
        echo "${node} 删除历史版本 /data/tomcat/tomcat_webdir/${NAME}成功!"
      fi
  done 
}

main(){
   case $1  in
      deploy)
        IP_list;        
        clone_code;
        #scanner_code;
        make_zip;
        #down_node;
        stop_tomcat;
        scp_zipfile;
        start_tomcat;
        web_test;
        delete_history_version;
         ;;
      rollback_last_version)
        IP_list;
        #echo ${Server_IP}
        down_node;
        stop_tomcat;
        rollback_last_version;
        start_tomcat;
        web_test;
         ;;
    esac
}

main $1 $2 $3

版本回滚方式

1. 基于git reset

    重新执行代码编译,代码编译时间比较长

2. 重新升级

  开发修复完bug重新提交代码,也是需要重新执行代码编译,代码编译时间比较长

3. 基于备份代码目录恢复

  基于已经存在的历史版本目录

    1. 当前所处的版本

     v1->v2(升级失败)->v3(又失败)

     如何回滚到稳定的v1版本

     v3->v2->v1

    2. 将web服务器的代码目录/webapps/myapp 软连接到稳定版本

    3. 重启服务