美文网首页
Jenkins持续集成使用集锦

Jenkins持续集成使用集锦

作者: 爱蛇 | 来源:发表于2017-07-10 16:00 被阅读0次

    Maven+Git+Shell持续集成教程

    http://blog.csdn.net/xlgen157387/article/details/50353317

    更改启动端口

    java -jar jenkins.war --httpPort=7000

    Maven+Git+Shell+Tomcat+Java Application方式配置所需插件

    Git Plugin 用于配置项目的"源码管理"一项
    Maven Integration plugin 用于创建maven 部署项目

    配置JDK:

    从位置: Global Tool Configuration->JDK配置,取消自动安装JDK的选项

    jdk 配置.png

    配置MAVEN:

    从位置: Global Tool Configuration->MAVEN配置,取消自动安装MAVEN的选项

    maven 配置.png

    构件错误:mvn: not found

    在构建步骤添加了一个Execute shell: mvn clean install -Pdev
    在构建时提示下面错误
    /tmp/jenkins5303088740826333885.sh: 2: /tmp/jenkins5303088740826333885.sh: mvn: not found
    Build step 'Execute shell' marked build as failure
    Finished: FAILURE
    已经尝试过ssh登录服务器,检查过maven变量没有问题,但还提示这个错误

    解决方法:
    使用maven构件项目来构件

    Maven构件项目增加Post-Steps

    用于maven构件成功后执行的脚本


    Post Steps.png

    完整示例:

    export BUILD_ID=build_release
    
    build_path=${WORKSPACE}/buildAll/release
    
    rsync -uvr "${build_path}/providerXXX/." "jufuns@192.168.1.100:/opt/providerXXX"
    echo "provider synchronize success"
    
    curl 'https://oapi.dingtalk.com/robot/send?access_token=6af3157c0ac425e744b2f7252883b2693f362463283bd1c437a7179c170d759e' \
       -H 'Content-Type: application/json' \
       -d '
      {"msgtype": "text", 
        "text": {
            "content": "### 开发环境更新完毕 ###"
         },
         "at":{
         "atMobiles": ["158000111222"], 
         "isAtAll": false
         }
      }'
    
    

    startup_all.sh 脚本主要用于重启服务,重启tomcat:

    #! /bin/sh
    
    start(){
    
      echo "run all-provider..."
      cd /opt/providers/all-provider/
      nohup java -jar all-provider-1.5.0-dev.jar &
      echo "run all-provider done"
    
      echo "run event-listener..."
      cd /opt/providers/event-listener/
      nohup java -jar event-listener-1.5.0-dev.jar &
      echo "run event-listener done"
    
      echo "run tomcat..." 
      sh /opt/tomcat-8080/bin/startup.sh
      echo "run tomcat done"
    }
    
    stop(){
      echo "try to stop"
      echo "kill tomcat"  
      ps -ef|grep tomcat|awk '{print $2}'|xargs kill
      echo "kill all providers"
      ps -ef|grep xxxx-provider|awk '{print $2}'|xargs kill
      echo "stop done"
    }
    
    restart(){
      echo "restart..."
      stop;
      echo "sleep 5 seconds to wait all service stop by soft"
      sleep 5
      start;
    }
    
    
    case "$1" in
     start)
        start
        ;;
     stop)
        stop
        ;;
     restart)
        restart
        ;;
     *)
       echo "Usage {start|stop|restart}"
    sac
    

    执行构件操作,发现启动脚本也echo 了一些东西出来,但ps -ef一下却没发现进程启动了,在网上找了一下资料,说是要有一个BUILD_ID的环境变量,所以在POST BUILD的Execute shell那里加上一句:

    export BUILD_ID=XXXX
    sh /opt/startup_all.sh restart
    

    在重启后加入钉钉机器人通知功能:
    1.在钉钉群里添加自定义机器人,复制机器人api URL
    2.在重启脚本执行完后,通过curl 调用api

    curl 'https://oapi.dingtalk.com/robot/send?access_token=6af3157c0ac425e744b2f7252883b2693f362463283bd1c437a7179c170d759e' \
       -H 'Content-Type: application/json' \
       -d '
      {"msgtype": "text", 
        "text": {
            "content": "### 开发环境更新完毕 ###"
         },
         "at":{
         "atMobiles": ["158000111222"], 
         "isAtAll": false
         }
      }'
    

    定时执行 - Poll SCM

    Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。如下图配置:
    /5 * * * (每5分钟检查一次源码变化)

    Build periodically:周期进行项目构建(它不关心源码是否发生变化),如下图配置:
    H 2 * * * (每天2:00 必须build一次源码)

    在 Schedule 中填写 0 * * * *。
    <pre>
    第一个参数代表的是分钟 minute,取值 0~59;

    第二个参数代表的是小时 hour,取值 0~23;

    第三个参数代表的是天 day,取值 1~31;

    第四个参数代表的是月 month,取值 1~12;

    最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
    </pre>

    所以 0 * * * * 表示的就是每个小时的第 0 分钟执行构建。

    线上服务器处理篇

    如果单纯用jenkins编译生成文件后,然后通过scp,或者ftp 等方式上传文件,
    那每次都会上传很多文件,如果文件比较多,则影响服务器更新效率。

    解决方法:
    使用svn,来传输,因为svn 有识别有什么文件已修改,所以这种方式可以只上传发生变化的文件,而不用全部上传。
    步骤:
    1.在线上服务器搭建svn服务,并将发布的文件目录添加到svn
    2.在jenkins 部署的服务器将线上服务器 发布文件的svn 目录 checkout下来
    3.增加Jenkins Post-Step shell 脚本将maven生成的文件拷贝到svn目录。
    4.通过svn add 命令和svn commit命令将新改动的文件提交svn
    这里需要注意的是,maven生成的文件里包含很多多余文件,这需要手动切换到svn目录,并将这些多余文件忽略掉,这样不至于执行svn add . 的时候会吧文件都纳入svn中。
    5.通过ssh命令发送一条重启服务的命令,例如:

    ssh xxx@xxx.xx.xx.xx /opt/startup.sh
    命令在文章最后参考
    

    在使用这个方式来重启之前,需要先准备好ssh 自动认证 的条件。
    (可以查看我另外一篇文章做参考: http://www.jianshu.com/p/be12171a3b14 )

    当然,线上服务器应该人工来干预,例如数据库表的更新,程序的配置等,为了确保更新没有问题,所以一般来说,第5点只是一个可选的操作(能自动把更新的文件传到服务器上已经很不错了)

    线上环境更新脚本示例:

    #! /bin/sh
    
    start(){
    
      echo "run all-provider..."
      cd /opt/jufuns/providers/all-provider/
      nohup java -jar all-provider-1.5.0-release.jar &
      echo "run all-provider done"
    
      echo "run event-listener..."
      #cd /opt/jufuns/providers/event-listener/
      #nohup java -jar listener-1.5.0-release.jar &
      echo "run event-listener done"
    
      echo "run system-task..."
      cd /opt/jufuns/providers/system-task/
      ##nohup java -jar systemtask-1.5.0-release.jar &
      echo "run event-listener done"
    
      echo "run tomcat..." 
      cd /opt/jufuns/tomcat-8090/bin
      sh ./startup.sh
      echo "run tomcat done"
    }
    
    stop(){
      echo "try to stop"
      echo "kill tomcat"  
      ps -ef|grep tomcat-8090|awk '{print $2}'|xargs kill -9
      echo "kill all providers"
      ps -ef|grep -e .*release|awk '{print $2}'|xargs kill
      echo "stop done"
    }
    
    restart(){
      echo "restart..."
      stop;
      echo "sleep 10  seconds to wait all service stop by soft"
      sleep 10
      start;
    }
    
    
    #check if need update files
    if [ "$2" = "-update" ] ; then
      echo "update all files..."
      cd /opt/jufuns/providers
      # 这里要使用 --force 参数强制更新,避免遇到错误终止更新
      svn up . --force
      
    fi
    
    case "$1" in
     start)
        start
        ps -ef|grep cn
        ps -ef|grep tomcat-8090
        ;;
     stop)
        stop
        ps -ef|grep cn
        ps -ef|grep tomcat-8090
        ;;
     restart)
        restart
        ps -ef|grep cn
        ps -ef|grep tomcat-8090
        ;;
     *)
       echo "Usage {start|stop|restart} [-update]"
    
    esac
    

    开发环境更新脚本示例:

    从build目录复制文件到指定位置脚本 copy_from_build.sh

    ! /bin/sh
    
    
    if [ -z $1 ] ; then
      echo "Provider-Directory-Name is requried!"
      echo "Usage: {Provider-Directory-Name} {Target-Provider-Name}"
      exit 0
    fi
    
    
    #if [ -z $2 ] ; then
    #  echo "Target-Provider--Name is requried!"
    #  echo "Usage: {Provider-Directory-Name} {Target-Provider-Name}"
    #  exit 0
    #fi
    
    
    BUILD_ROOT=/home/vital/.jenkins/workspace/MeiHaoHui-Dev/buildAll/dev/$1
    TARGET_ROOT=/opt/providers/$2
    
    
    if [ ! -d $TARGET_ROOT ]; then
      mkdir -p $TARGET_ROOT
    fi
    
    echo "ready to update from path ${BUILD_ROOT} to path ${TARGET_ROOT}...";
    
    jar_file=`find $BUILD_ROOT -maxdepth 1 -iname "*.jar"`
    
    if [ "$3" = "-tomcat" ]; then
      echo  "Using tomcat copying mode"
      echo "execute shell: rm ${TARGET_ROOT}/WEB-INF"
      rm -rf ${TARGET_ROOT}/WEB-INF
      echo "rm done!"
    
      echo "execute shell: /bin/cp -rf ${BUILD_ROOT} ${TARGET_ROOT}"
      /bin/cp -rf "${BUILD_ROOT}/." "${TARGET_ROOT}"
      echo "cp done!"
    else
    
      echo /bin/cp -rf "${jar_file}" "${TARGET_ROOT}/"
      /bin/cp -rf "${jar_file}" "${TARGET_ROOT}/"
      echo /bin/cp -rf "${BUILD_ROOT}/lib" "${TARGET_ROOT}/"
      /bin/cp -rf "${BUILD_ROOT}/lib" "${TARGET_ROOT}/"
    
    fi
    
    echo "done"
    

    startup_all.sh脚本(包含了copy_from_build.sh 的调用)

    #! /bin/sh
    
    start(){
    
      echo "run all-provider..."
      cd /opt/providers/all-provider/
      find . -iname "*.jar" -maxdepth 1 -exec nohup java -jar {} \; &
      echo "run all-provider done"
    
      echo "run event-listener..."
      cd /opt/providers/event-listener/
      find . -iname "*.jar" -maxdepth 1 -exec nohup java -jar {} \; &
      echo "run event-listener done"
    
      echo "run system-task..."
      cd /opt/providers/system-task/
      find . -iname "*.jar" -maxdepth 1 -exec nohup java -jar {} \; &
      echo "run system-task done"
    
    
      echo "run tomcat..." 
      cd /opt/tomcat-8080/bin
      sh startup.sh
      echo "run tomcat done"
    }
    
    stop(){
      echo "try to stop"
      echo "kill tomcat"  
      ps -ef|grep tomcat-8080|awk '{print $2}'|xargs kill -9
      echo "kill all providers"
      ps -ef|grep -e cn-jufuns-residences.*dev|awk '{print $2}'|xargs kill
      echo "stop done"
    }
    
    restart(){
      echo "restart..."
      stop;
      echo "sleep 10 seconds to wait all service stop by soft"
      sleep 10;
      start;
    }
    
    
    #check if need update files
    if [ "$2" = "-update" ] ; then
      echo "update all files..."
      update=/opt/copy_from_build.sh
      $update "cn-jufuns-residences-all-provider" "all-provider"
      $update "cn-jufuns-residences-event-listener" "event-listener"
      $update "cn-jufuns-residences-search-provider" "search-provider"
      $update "cn-jufuns-residences-systemtask" "system-task"
      $update "cn-jufuns-residences-origin-web/web" "web" -tomcat
      $update "cn-jufuns-residences-origin-admin/admin" "admin" -tomcat
    fi
    
    
    
    case "$1" in
     start)
        start
        ;;
     stop)
        stop
        ;;
     restart)
        restart
        ;;
     *)
       echo "Usage {start|stop|restart} [-update]"
    
    esac
    

    相关文章

      网友评论

          本文标题:Jenkins持续集成使用集锦

          本文链接:https://www.haomeiwen.com/subject/gzxuhxtx.html