原文出处:http://www.yund.tech/zdetail.html?type=1&id=52dfecbd218d2c2406ea31efa65f65ad
作者:jstarseven
说明:java程序部署是简单的,尤其是springboot普遍化使用以后,很多应用均采用jar方式部署
启动方式: 1.前台启动> java -jar *.jar 2.后台启动> nohup java -jar *.jar >nohup.out 2>&1 & 但是每次都需要上传jar去服务器执行命令,是不是有点不太友好呢?另外可能有些对linux不熟悉的朋友,可能每次都要去查一下启动命令,另外对服务器端代码调试也是很不方便!
解决:针对这个问题,为了统一部署方式,尽量做到简单化,博主采用shell脚本 jenkins的方式,力求做到一键部署,一键调试,节约部署成本。
一、shell脚本封装应用程序部署命令
脚本load.sh:
代码语言:javascript复制 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/* $_workDir
100 rm -rf $_workDir/target/
101 cd $_workDir
102 if [ $_is_remote_debug -eq 1 ]
103 then
104 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_param
107 else
108 startSA start
109 fi
110 }
111
112
113 # use tips
114 if [ $# -ge 1 ]
115 then
116 case $1 in
117 start)
118 startSA $1
119 ;;
120 stop)
121 stopSA
122 ;;
123 start-f)
124 startSA $1
125 ;;
126 status)
127 statusSA
128 ;;
129 restart)
130 stopSA
131 startSA start
132 ;;
133 jdeploy)
134 jdeploySA
135 ;;
136 esac
137 else
138 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
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服务,不知道安装步骤的可以参考我之前的一篇文章 https://www.cnblogs.com/jstarseven/p/9166803.html
1.jenkins任务连接svn或者git
2.svn项目远程打包
复制下列代码(无需修改,需要是maven项目...):
代码语言:javascript复制1 #!/bin/bash
2 echo "start execute shell maven package"
3 cd /root/.jenkins/workspace/$JOB_NAME/
4 mvn clean
5 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)启动本地调试应用,打好断点,访问服务器端部署程序(我这边访问的应用登录接口,做断点调试)
代码语言:javascript复制 可以看到成功进行了应用的远程调试,断点到了服务器端的请求,是不是再也不用担心服务器端代码的bug,不好调试了!调试服务器端代码,就和你在本地调试一样简单,so easy !!!
我的博客即将同步至腾讯云 社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3dd87fzb99mo0