博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写个shell脚本搭载jenkins让你的程序部署飞起来
阅读量:4615 次
发布时间:2019-06-09

本文共 6615 字,大约阅读时间需要 22 分钟。

转载请注明】:

原文出处:    作者:jstarseven    码字挺辛苦的..... 


说明:java程序部署是简单的,尤其是springboot普遍化使用以后,很多应用均采用jar方式部署

启动方式:

    1.前台启动> java -jar *.jar
    2.后台启动> nohup java -jar *.jar >nohup.out 2>&1 &
     但是每次都需要上传jar去服务器执行命令,是不是有点不太友好呢?另外可能有些对linux不熟悉的朋友,可能每次都要去查一下启动命令,另外对服务器端代码调试也是很不方便!

解决:针对这个问题,为了统一部署方式,尽量做到简单化,博主采用shell脚本+jenkins的方式,力求做到一键部署,一键调试,节约部署成本。

一、shell脚本封装应用程序部署命令                             

脚本load.sh: 

1 #!/bin/bash  2 . /etc/profile  3 . ~/.bash_profile  4   5 #------------------------------------------------------------------------------------------------  6 #程序部署目录  7 _workDir=/apps/zsxc-module-system  8   9 #部署程序jar名称 10 _program=$_workDir/zsxc-module-system-1.0.0.jar 11  12 #部署程序jar springboot启动参数如:--server.port=9000 --spring.profiles.active=dev 13 #不指定参数时,可以为空 14 _program_param='--spring.profiles.active=dev' 15  16 #是否启动远程调试: 0 不开启 1 开启 17 _is_remote_debug=0 18  19 #启动时指定日志输出文件 20 _default_log_file=../logs/zsxc-module-system.log 21  22 #------------------------------------------------------------------------------------------------ 23 _programid=0 24  25 cmd=`which java` 26 tmp=`dirname $0` 27 cd $tmp 28  29 #start project  30 function  startSA(){ 31     echo "starting $_program" 32     _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 33     if [ -z $_programid ] 34     then 35         case $1 in 36         start) 37             nohup $cmd -Dfile.encoding=UTF-8  -jar $_program  $_program_param >> $_default_log_file 2>&1 & 38             _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 39  40             if [ -z $_programid ] 41             then  42                 echo "Failed to start program." 43             else 44                 echo "program has started. Process ID:$_programid"; 45             fi 46             ;; 47         start-f) 48             $cmd -Dfile.encoding=UTF-8  -jar $_program  $_program_param 2>&1 49             _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 50  51             if [ -z $_programid ] 52             then  53                 echo "Failed to start program." 54             else 55                 echo "program has started. Process ID:$_programid"; 56             fi 57         ;; 58         esac 59     else 60         echo "program is already running. Process ID: $_programid" 61         exit -1; 62     fi 63 } 64  65 # stop project  66 function stopSA(){ 67      _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 68     if [ -z $_programid ] 69     then 70         echo "No program" 71     else 72         echo "program process ID: $_programid" 73         echo "Stopping..." 74         kill $_programid 75         sleep 1 76         echo "program stoped." 77     fi 78 } 79  80 # look current project status 81 function statusSA(){ 82     _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 83     if [ -z $_programid ] 84     then 85         echo "program is stoped" 86     else 87         echo "program is running" 88         echo "process ID: $_programid" 89     fi 90 } 91  92  93 # jenkins app deploy 94 function jdeploySA(){ 95     BUILD_ID=dontKillMe 96     stopSA 97     mv -f $_program $_program.bak 98     echo "backup $_program success!" 99     mv -f $_workDir/target/* $_workDir100     rm -rf  $_workDir/target/101     cd $_workDir102     if [ $_is_remote_debug -eq 1 ]103     then104         echo "$cmd -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar $_program  $_program_param"105         echo "service application is debugging,please run local application to debug !"106         $cmd -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar $_program  $_program_param107     else108         startSA start109     fi110 }111 112 113 # use tips114 if [ $# -ge 1 ]115 then116     case $1 in117     start)118         startSA $1119         ;;120     stop)121         stopSA122         ;;123     start-f)124         startSA $1125         ;;126     status)127         statusSA128         ;;129     restart)130         stopSA131         startSA start132         ;;133     jdeploy)134         jdeploySA135         ;;136     esac137 else138     echo "Usage: $0 [start|start-f|stop|status|restart] "139     echo "       <1> ./load.sh start , start program in background."140     echo "       <2> ./load.sh start-f , start program in foreground."141     echo "       <3> ./load.sh stop , stop program."142     echo "       <4> ./load.sh status , show program running status."143     echo "       <5> ./load.sh restart , restart program."144     echo "       <6> other shell command , please ask jstarseven."145 fi
View Code

1.脚本提供:./load.sh start 后台启动应用程序

2.脚本提供:./load.sh start-f 前台启动应用程序

3.脚本提供:./load.sh stop 停止应用程序

4.脚本提供:./load.sh status 查看应用程序状态

5.脚本提供:./load.sh restart 重启应用程序

6.上面五条命令可以在服务器端手动执行,脚本中jdeploySA方法提供jenkins自动化部署使用

 jdeploySA 方法采用./load.sh jdeploy方式提供jenkins调用,实现程序远程部署重启、调试等

二、配置jenkins任务                                                  

前提:安装jenkins服务,不知道安装步骤的可以参考我之前的一篇文章

     

1.jenkins任务连接svn或者git

2.svn项目远程打包

 复制下列代码(无需修改,需要是maven项目...):

1 #!/bin/bash2 echo "start execute shell maven package"3 cd /root/.jenkins/workspace/$JOB_NAME/4 mvn clean5 mvn package

 3.发送文件并且调用shell脚本:load.sh

1)load.sh 脚本在项目中的位置

 2)配置Publish over SSH 插件发送文件的信息

 3)上面配置的 Remote directory /zsxc-module-system ,此处真实路径对应Publish over SSH 插件中的配置路径 /apps 加上 /zsxc-module-system  /apps/zsxc-module-system(可以根据自身情况修改)

   OK,至此脚本 load.sh 配合jenkins的配置全部完成,看着有点长,其实配置很简单的,一劳永逸!下面就来看一下具体怎么使用。

三、查看jenkins任务输出日志                                      

拉到日志输出的最下面,看到程序已经正常启动,并且打印出了进程ID:8316

注释:现在就可以每次提交代码到svn上,在jenkins上选择构建,发布最新的应用了

四、调整脚本参数让部署、调试更加灵活                       

1.想要启动时,追加启动参数怎么办?

 

脚本参数描述:

_workDir :程序部署目录,jenkins Over SSH 配置中的Remote directory 也是服务器端程序部署的路径

_program : 部署程序jar名称,对应maven项目打包后的程序jar

_program_param : 程序启动参数,可以为空,如:--server.port=9000 --spring.profiles.active=dev

_is_remote_debug : 是否开启远程调试

_default_log_file : 日志文件,默认存放为应用程序jar的上级logs目录下,以项目名称命名的日志文件 

2.有人可能会问,我开发环境、测试环境和正式环境都在不同服务器上啊?

这个我们是这样做的,开发是在svn或者git上dev分支,dev分支对应的是jenkins开发环境任务(这里只需要修改over ssh的服务器信息即可),load.sh对应开发环境的参数 --spring.profiles.active=dev等

开发到一个时间点,做code merge到test分支提供测试,test分支对应是jenkins测试环境的任务(对应测试服务器)

测试完成,将test分支merge到master,对应jenkins正式任务,但也不一定全是采用jenkins的,毕竟有些非互联网的项目,还要考虑到内网的情况。。。。

如果说,你们没那么多步骤,那你就可以随便玩了,哈哈哈

3.如何开启远程调试,调试服务器端代码?

 1)将参数 _is_remote_debug 的值改为 1 提交代码值svn 

2)配置本地调试应用 idea版(eclipse类似)

3)在jenkins上选择构建,查看日志(显示正在等待调试连接)

4)启动本地调试应用,打好断点,访问服务器端部署程序(我这边访问的应用登录接口,做断点调试)

  可以看到成功进行了应用的远程调试,断点到了服务器端的请求,是不是再也不用担心服务器端代码的bug,不好调试了!调试服务器端代码,就和你在本地调试一样简单,so easy !!!

 

 


 -END-

 

   我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3dd87fzb99mo0

转载于:https://www.cnblogs.com/jstarseven/p/11399251.html

你可能感兴趣的文章
Python可视化:Seaborn库热力图使用进阶
查看>>
Linux下使用pv监控进度
查看>>
MySQL(MariaDB)默认密码和修改方法
查看>>
用jQuery File Upload实现简单的文件上传
查看>>
Luogu P4901 排队 fib数列+树状数组+倍增
查看>>
PHP 锁机制
查看>>
每天CookBook之Python-036
查看>>
Django 之 cookie & session
查看>>
反转字符串
查看>>
CRM客户关系管理系统(十二)
查看>>
洛谷P2776 [SDOI2007]小组队列 链表 + 模拟
查看>>
ORA-39006错误原因及解决办法
查看>>
linux常用目录与作用
查看>>
更换CentOS7的下载源为阿里云
查看>>
jQuery点击收缩展开滑动显示内容竖直手风琴代码
查看>>
PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
查看>>
浏览器端Less
查看>>
codeforces 622B B. The Time
查看>>
个人日报0628
查看>>
BeanDefinition的Resource定位——2
查看>>