黑帽联盟

 找回密码
 会员注册
查看: 1176|回复: 0
打印 上一主题 下一主题

[基础服务] jenkins结合gitlab,实时更新部署网站代码

[复制链接]

895

主题

38

听众

3329

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    难过
    昨天 22:31
  • 签到天数: 1652 天

    [LV.Master]伴坛终老

    环境:
    四台centos7主机
    172.31.225.242 ---> gitlab服务器
    172.31.225.243 ---> jenkins服务器
    172.31.225.245 ---> tomcat服务器
    172.31.225.244 ---> mysql服务器(存储sonarQube扫描数据)

    gitlab安装:https://bbs.cnblackhat.com/thread-2857-1-1.html
    jenkins安装:https://bbs.cnblackhat.com/thread-2859-1-1.html
    tomcat安装:这里就不做过多赘述,自行百度,很简单

    逻辑流程:
    本地开发代码--->推送新代码至gitlab--->通过jenkins拉取代码--->sonarQube-scaner扫描测试代码BUG--->ansible批量部署web机器

    实现操作:
    这里直接jenkins服务器上就可以实现,需要安装sonarQube组件和sonarQube-scaner插件。

    sonarQube组件安装的是6.5版本,zip压缩包,直接解压,修改里面的配置文件conf/sonar.properties,需要数据库保存扫描的记录。修改的内容如下:
    sonar.jdbc.username=sonar
    sonar.jdbc.password=123456
    sonar.jdbc.url=jdbc:mysql://172.31.225.244:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
    sonar.web.host=0.0.0.0
    sonar.web.port=9000
    要求mysql版本为5.6或者5.7,低于5.6版本不行。

    运行解析目录里面的sonar.sh start即可启动服务,端口默认9000端口

    注意:如果你有php服务在运行,端口冲突,php使用的也是9000端口。

    默认的sonarQube是英文界面,需要对应的中文插件:sonar-l10n-zh-plugin-1.11.jar ,把该插件上传至该目录下extensions/plugins,但需要重启sonarqube服务,sonar.sh restart
    2121.png

    在jenkins安装插件sonarQube-scaner,这里我已经提前安装好。注意:安装好之后,需要长期jenkins服务
    22222.png

    再全局配置sonarqube,点击系统管理-->系统配置,配置如下图:(配置好,点击应用,保存)
    3333.png

    再配置sonarqube-scaner,点击系统管理-->全局工具配置,如果已经装好sonarQube-scaner,指定对应的位置即可,没有的话,就直接自动安装(最后点击应用,保存)
    4444.png

    5555.png

    下面开始新建任务,输入任务名称,选择构建一个自由风格的软件项目或者流水线(基于pipline)都可以,这里我就选择自由风格的。这里由于时间的问题,我就不介绍ansible了,我就直接用自己编写的脚本来操作了。(具体部署,看下面截图)
    1111.png

    2222.png

    3333.png

    4444.png

    然后开始构建

    6666.png

    7777.png

    目标tomcat机器打开看下内容

    8888.png

    sonarqube扫描的结果:(因为是一个静态文件,很简单的,所以没有什么什么BUG)
    9999.png


    部署脚本内容:
    #!/bin/bash

    DATE=`date +%Y-%m-%d_%H-%M-%S`
    GROUP_LIST=$2

    function IP_list(){
      if [[ ${GROUP_LIST} == "online-group1" ]];then
         Server_IP="172.31.225.245"
         echo ${Server_IP}
      elif [[ ${GROUP_LIST} == "online-group2" ]];then
         Server_IP="172.31.225.242"
         ssh root@172.31.225.243 ""echo enable  server web_port/172.31.225.245" | socat stdio /var/lib/haproxy/haproxy.sock"
         ssh root@172.31.225.244 ""echo enable  server web_port/172.31.225.242" | socat stdio /var/lib/haproxy/haproxy.sock"
         echo ${Server_IP}
      elif [[ ${GROUP_LIST} == "online-all" ]];then
         Server_IP="172.31.225.245 172.31.225.242"
         echo ${Server_IP}
      fi
    }

    #function pull_code(){
    #  rm -rf /home/tomcat/.jenkins/workspace/testweb
    #  cd /home/tomcat/.jenkins/workspace
    #  git clone git@192.168.7.202:testgroup/testweb.git
    #}

    function make_zip(){
      cd /var/lib/jenkins/workspace/test-demo1  && zip testweb.war.zip ./*
    }

    function down_node(){
      for node in ${Server_IP};do
        echo ${node}
        ssh root@172.31.225.243 ""echo disable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
        ssh root@172.31.225.244 ""echo disable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
        echo "${node} 关闭成功!"
      done  
    }

    function stop_tomcat(){
      for node in ${Server_IP};do
        ssh tomcat@${node} "/etc/init.d/tomcat stop"
        echo "${node} 关闭成功!"
      done  
    }

    function start_tomcat(){
      for node in ${Server_IP};do
        ssh tomcat@${node} "/etc/init.d/tomcat start"
        echo "${node} 启动成功!"
      done  
    }

    function scp_codefile(){
      cd /var/lib/jenkins/workspace/test-demo1
      for node in ${Server_IP};do
        scp testweb.war.zip  tomcat@${node}:/apps/tomcat_appdir
        ssh tomcat@${node} "cd /apps/tomcat_appdir && unzip testweb.war.zip -d /apps/tomcat_webdir/testweb-${DATE} && rm -rf /data/tomcat_webdir/testweb && ln -sv /apps/tomcat_webdir/testweb-${DATE} /data/tomcat_webdir/testweb"
      done
    }

    function web_test(){
      #sleep 30
      for node in ${Server_IP};do
        NUM=`curl -s  -I -m 10 -o /dev/null  -w %{http_code}  http://${node}:8080/testweb/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 [ ${node} == "192.168.8.100" ];then
           echo "192.168.8.100部署完毕,请进行代码测试!"
        else
          ssh root@172.31.225.243 ""echo enable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
          ssh root@172.31.225.244 ""echo enable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
        fi
    }

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


    main(){
       case $1  in
          deploy)
            IP_list;        
            #pull_code;
            make_zip;
            down_node;
            stop_tomcat;
            scp_codefile;
            start_tomcat;
            web_test;
             ;;
          rollback_last_version)
            IP_list;
            echo ${Server_IP}
            down_node;
            stop_tomcat;
            rollback_last_version;
            start_tomcat;
            web_test;
             ;;
        esac
    }

    main $1 $2
    tomcat启动关闭脚本:(写这个脚本的原因,有时候tomcat会关不掉,所以写这个脚本进行强制关闭)
    #!/bin/bash
    # #########################################################
    # Tomcat init script for     "中企动力科技股份有限公司"####
    ###########################################################
    # chkconfig: 2345 96 14 ###################################
    # description: 2016/11/1.  张士杰##########################
    # #########################################################

    JDK_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
    CATALINA_HOME=/apps/tomcat
    export JDK_HOME CATALINA_HOME
    source /etc/profile
    #PID=`ps -ef  | grep  -v grep  | grep java | awk  '{print $2}'`
    #NUM=`ps -ef  | grep  -v grep  | grep java | awk  '{print $2}' | wc -l`

    #case $1 in
    start() {
                echo "正在判断服务状态,请稍等!"       
                echo "请稍等3秒钟"
                echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
               if        netstat -an | grep 8080 | grep LISTEN >/dev/null
                 then
                       echo "Tomcat已经正在运行了!"  
              else
                       echo "Tomcat没有运行,1秒后启动!"
                    echo 1;sleep 1  
                      $CATALINA_HOME/bin/catalina.sh start
                      echo  "Tomcat 已经成功启动完成,5秒后判断是否启动成功"
                      echo "5";sleep 1;echo "4";sleep 1
            echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
            if  netstat -an | grep 8080 | grep LISTEN >/dev/null
                then
                    PID=`ps -ef | grep  tomcat | grep jdk | awk '{print $2}'`
                    NUM=`ps -ef | grep  tomcat | grep jdk | awk '{print $2}' | wc -l`
                    echo "Tomcat 已经成功启动${NUM} 个Tomcat进程!,PID为${PID}"
                else
                    echo "Tomcat启动失败,请重新启动!"
                    echo 1
            fi
            fi
            }
    stop() {
                    PID=`ps -ef  | grep  -v grep  | grep java | awk  '{print $2}'`
                    NUM=`ps -ef | grep  -v "color"  | grep tomcat | awk '{print $2}' | wc -l`
                    echo "正在判断服务状态,请稍等3秒钟!"       
                    echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
            if  netstat -an | grep 8080 | grep LISTEN >/dev/null
               then       
                    echo "Tomcat运行中,1秒后关闭!"
                    echo  1;sleep 1
                    echo "即将关闭Tomcat服务,请稍等!"
            $CATALINA_HOME/bin/catalina.sh stop ;echo "已经执行关闭命令,正在检查关闭了多少Tomcat进程,请稍等5秒钟!"
                    sleep 2
            echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
                    pkill java && pkill tomcat
                    if  netstat -an | grep 8080 | grep LISTEN >/dev/null;then
                            PID=`ps -ef  | grep  -v grep  | grep java | awk  '{print $2}'`
                            NUM=`ps -ef | grep  -v "color"  | grep tomcat | awk '{print $2}' | wc -l`
                            kill -9 $PID ;echo "已成功关闭${NUM} 个tomcat进程"
                    else
                              echo  "Tomcat 已经关闭完成!"
                    echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
                    fi
            else
                    echo "Tomcat 没有运行"
                    echo 1
            fi
            if  netstat -an | grep 8080 | grep LISTEN >/dev/null;then
                PID=`ps -ef  | grep  -v grep  | grep java | awk  '{print $2}'`
                #NUM=`ps -ef | grep  -v "color"  | grep tomcat | awk '{print $2}' | wc -l`
                echo "关闭失败,即将强制删除tomcat进程!"
                sleep 2
                pkill tomcat ;sleep 2
                if  netstat -an | grep 8080 | grep LISTEN >/dev/null;then
                    echo "强制关闭失败,即将再次强制删除tomcat进程!"
                    pkill java; sleep 2
                fi
            fi
            }
    restart() {
            stop
            start
    }

    case "$1" in
    start)
    start
    ;;

    stop)
    stop
    ;;

    restart)
    restart
    ;;

    *)
    echo $"Usage: $0 {start|stop|restart|status}"
    esac
    注:此脚本是针对负载均衡haproxy和高可用keepalived来写的,针对这两个程序部署,论坛之前有些过,就不多描述了


    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部