原文出处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:

 #!/bin/bash
. /etc/profile
. ~/.bash_profile #------------------------------------------------------------------------------------------------
#程序部署目录
_workDir=/apps/zsxc-module-system #部署程序jar名称
_program=$_workDir/zsxc-module-system-1.0..jar #部署程序jar springboot启动参数如:--server.port= --spring.profiles.active=dev
#不指定参数时,可以为空
_program_param='--spring.profiles.active=dev' #是否启动远程调试: 不开启 开启
_is_remote_debug= #启动时指定日志输出文件
_default_log_file=../logs/zsxc-module-system.log #------------------------------------------------------------------------------------------------
_programid= cmd=`which java`
tmp=`dirname $`
cd $tmp #start project
function startSA(){
echo "starting $_program"
_programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'`
if [ -z $_programid ]
then
case $ in
start)
nohup $cmd -Dfile.encoding=UTF- -jar $_program $_program_param >> $_default_log_file >& &
_programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` if [ -z $_programid ]
then
echo "Failed to start program."
else
echo "program has started. Process ID:$_programid";
fi
;;
start-f)
$cmd -Dfile.encoding=UTF- -jar $_program $_program_param >&
_programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` if [ -z $_programid ]
then
echo "Failed to start program."
else
echo "program has started. Process ID:$_programid";
fi
;;
esac
else
echo "program is already running. Process ID: $_programid"
exit -;
fi
} # stop project
function stopSA(){
_programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'`
if [ -z $_programid ]
then
echo "No program"
else
echo "program process ID: $_programid"
echo "Stopping..."
kill $_programid
sleep
echo "program stoped."
fi
} # look current project status
function statusSA(){
_programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'`
if [ -z $_programid ]
then
echo "program is stoped"
else
echo "program is running"
echo "process ID: $_programid"
fi
} # jenkins app deploy
function jdeploySA(){
BUILD_ID=dontKillMe
stopSA
mv -f $_program $_program.bak
echo "backup $_program success!"
mv -f $_workDir/target/* $_workDir
rm -rf $_workDir/target/
cd $_workDir
if [ $_is_remote_debug -eq 1 ]
then
echo "$cmd -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar $_program $_program_param"
echo "service application is debugging,please run local application to debug !"
$cmd -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar $_program $_program_param
else
startSA start
fi
} # use tips
if [ $# -ge 1 ]
then
case $1 in
start)
startSA $1
;;
stop)
stopSA
;;
start-f)
startSA $1
;;
status)
statusSA
;;
restart)
stopSA
startSA start
;;
jdeploy)
jdeploySA
;;
esac
else
echo "Usage: $0 [start|start-f|stop|status|restart] "
echo " <1> ./load.sh start , start program in background."
echo " <2> ./load.sh start-f , start program in foreground."
echo " <3> ./load.sh stop , stop program."
echo " <4> ./load.sh status , show program running status."
echo " <5> ./load.sh restart , restart program."
echo " <6> other shell command , please ask jstarseven."
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项目...):

 #!/bin/bash
echo "start execute shell maven package"
cd /root/.jenkins/workspace/$JOB_NAME/
mvn clean
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:

注释:现在就可以每次提交代码到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

写个shell脚本搭载jenkins让你的程序部署飞起来的更多相关文章

  1. 自动化部署-从maven到shell脚本到jenkins

    Java代码自动部署 [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java代码的发布部署也是 ...

  2. 写个shell脚本

    以前更新网站程序都是手动噼里啪啦敲代码,即麻烦又慢,还神经紧张.终于忍不住写个shell脚本.   cd /usr/local/tomcat7/apache-tomcat-9.0.0.M4/ bin/ ...

  3. Dockerfile 构建后端springboot应用并用shell脚本实现jenkins自动构建

    Dockerfile 文件构建docker镜像 FROM centos MAINTAINER zh*****eng "z*******ch.cn" ENV LANG en_US.U ...

  4. Dockerfile 构建后端tomcat应用并用shell脚本实现jenkins自动构建

    Dockerfile 文件构建docker镜像 FROM centos MAINTAINER zhaoweifeng "zh******tech.cn" ENV LANG en_U ...

  5. Dockerfile 构建前端nginx应用并用shell脚本实现jenkins自动构建

    Dockerfile 文件构建docker镜像 FROM centos MAINTAINER zh********h.cn RUN rm -f /etc/nginx/nginx.conf COPY n ...

  6. 好记性不如烂笔头--linux学习笔记9练手写个shell脚本

    #!/bin/bash #auto make install httpd #by authors baker95935 #httpd define path variable H_FILES=http ...

  7. 写好shell脚本的13个技巧【转】

    有多少次,你运行./script.sh,然后输出一些东西,但却不知道它刚刚都做了些什么.这是一种很糟糕的脚本用户体验.我将在这篇文章中介绍如何写出具有良好开发者体验的 shell 脚本. 产品的最终用 ...

  8. 写一个shell脚本利用wget抓取股票历史数据

    今天,大数据部老大交给我一项任务——抓取股票历史数据.于是乎,我自行在网上找了一下,发现wget真真是一个非常强大的linux下载工具.我已经被深深震撼到了.下面叙述今天的一些过程,还是比较坎坷的. ...

  9. syntax error near unexpected token `do(写的shell脚本出现格式问题)--->1.问题2.展示信息3.解决方案

    1问题:Linux和windows下的回车换行符不兼容的问题 [root@node-01 script]# sh start_zk.sh art_zk.sh: line 3: syntax error ...

随机推荐

  1. 深度解密Go语言之channel

    目录 并发模型 并发与并行 什么是 CSP 什么是 channel channel 实现 CSP 为什么要 channel channel 实现原理 数据结构 创建 接收 发送 关闭 channel ...

  2. 个人永久性免费-Excel催化剂功能第68波-父子结构表转换之父子关系BOM表拆分篇

    Excel中制造业行业中,有一个非常刚需的需求是对BOM(成品物料清单)的拆解,一般系统导出的BOM表,是经过压缩处理的,由父子表结构的方式存储数据.对某些有能力使用SAP等专业ERP软件的工厂来说, ...

  3. 个人永久性免费-Excel催化剂功能第36波-新增序列函数用于生成规律性的循环重复或间隔序列

    啃过Excel函数的表哥表姐们,一定对函数的嵌套.数组公式等高级的应用有很深的体会,威力是大,但也烧死不少脑细胞,不少人就在这样的绕函数中光荣地牺牲了,走向从入门到放弃.Excel催化剂的创立,初衷就 ...

  4. 模拟ssh远程执行命令,粘包问题,基于socketserver实现并发的socket

    06.27自我总结 1.模拟ssh远程执行命令 利用套接字编来进行远程执行命令 服务端 from socket import * import subprocess server = socket(A ...

  5. 【HDOJ】2104 hide handkerchief

    Problem Description The Children’s Day has passed for some days .Has you remembered something happen ...

  6. 我狠起来连自己都打---如何简单实现Azure resource自动打标签

    你是否还在为花费大量Azure Resource打标签而烦恼呢?你是否还在因为这样低效的重复劳动而痛苦呢? 在很长一段时间内,笔者既要做云架构调整,又要做日常系统维护,还要参与各种各样的项目,在这种情 ...

  7. 【Java中级】(五)异常处理

    1.什么是异常 异常定义:导致程序的正常流程被中断的事件,叫做异常. 2.异常处理 try catch finally throws package exception; import java.io ...

  8. 单调栈&单调队列

    最近打了三场比赛疯狂碰到单调栈和单调队列的题目,第一,二两场每场各一个单调栈,第三场就碰到单调队列了.于是乎就查各种博客,找单调栈,单调队列的模板题去做,搞着搞着发现其实这两个其实是一回事,只不过利用 ...

  9. Jsp机试题 (用户登录用户注册/用户注销功能)

    1. 用户登录 实现用户登录,功能,三个页面登录页面login.jsp,登录逻辑处理页面loginSubmit.jsp,欢迎页面welcome.jsp.用户再登录页面输入用户名和密码,前台页面使用js ...

  10. BrowserSync,自动刷新,解放F5,去掉更新提示

    BrowserSync虽然这个技术不算新,但是依然有用.略微介绍下 没有安装node,先安装node,这里不再做介绍 安装 npm install -g browser-sync  全局安装,方便在任 ...