欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Shell脚本的Linux下Javaweb项目一键部署

程序员文章站 2022-05-24 20:09:24
...

刚买到服务器的时候想把项目部署上去时,经常会用到各种scp、unzip之类一大堆的命令。虽然整个流程不是特别麻烦,不过学了一些Shell的命令知识之后我发现这个过程还是有优化的空间,于是大概花了几个小时完成了这样一个自动部署的脚本。

首先要解决的问题是,命令如何在远程服务器上运行,因为之前每次我都是用密码登录的,所以这个问题不解决后面的流程也就无从谈起,因此我使用了Linux下的一个expect命令,这个命令基本上就相当于是帮你自动往控制台中送输入的,于是将这个命令先封装成一个sh脚本executeCmd.sh。

#!/usr/bin/expect -f
#用途:远程执行一条任务
set user [lindex $argv 0]    #用户名
set host [lindex $argv 1]    #服务器地址
set password [lindex $argv 2]    #服务器密码
set cmd [lindex $argv 3]    #命令

spawn ssh aaa@qq.com$host $cmd
#spawn $cmd
set timeout 300
expect "aaa@qq.com$host's password:"
set timeout 300		
send "$password\r"
set timeout 300	
send "exit\r"
expect eof

如图,基本上就是先向服务器发送命令,然后等待一段时间自动输入密码参数,再等一段时间之后退出。

实现远程命令的执行之后,就可以编写主要逻辑了,基本上的思路就是

  1. 停止目标服务器的tomcat工作
  2. 复制war文件到服务器对应目录下
  3. 递归删除同名文件夹
  4. 解压缩xxx.war
  5. 运行tomcat
  6. 进入logs中,tail -f catalina.out 查看日志文件

其中,复制war文件到服务器对应目录这一步也需要输入用户名和密码,因此我们需要为它也专门写一个脚本文件来进行处理,命名为copyFile.sh,用于远程复制文件

#!/usr/bin/expect -f
#用途:远程复制文件
set user [lindex $argv 0]    #用户名
set host [lindex $argv 1]    #服务器地址
set password [lindex $argv 2]    #密码
set locaFile [lindex $argv 3]    #本地文件
set targetPath [lindex $argv 4]    #目标路径

spawn scp $locaFile aaa@qq.com$host:$targetPath
#spawn $cmd
set timeout 300
expect "aaa@qq.com$host's password:"
set timeout 300         
send "$password\r"
set timeout 300 
send "exit\r"
expect eof

基本原理和executeCmd.sh那个脚本一样。

实现这两个子脚本之后就可以实现主要逻辑了,新建文件deploy.sh,代码如下:

#!/bin/bash
#文件名: deploy.sh
#用途:向tomcat部署项目

user='xxxx'
tomcatLoca='/home/tomcat/apache-tomcat-7.0.78' #远程计算机tomcat的路径
host='xxx.xx.xxx.xx'	#远程主机的地址
password='xxxxxxxx'	#密码
filename=$1	#文件名称
curLoca=`pwd`	#当前目录
#echo 当前目录为$curLoca
#首先停止远程主机上tomcat的正常工作
executeCmd.sh $user $host $password $tomcatLoca/bin/shutdown.sh
#远程复制war到webapps目录下
copyFile.sh $user $host $password $curLoca/$filename.war $tomcatLoca/webapps
#递归删除同名文件夹
executeCmd.sh $user $host $password rm\ -rf\ $tomcatLoca/webapps/$filename
#远程解压文件
executeCmd.sh $user $host $password unzip\ $tomcatLoca/webapps/$filename.war\ -d\ $tomcatLoca/webapps/$filename
#运行tomcat
executeCmd.sh $user $host $password $tomcatLoca/bin/startup.sh
#查看日志文件
executeCmd.sh $user $host $password tail\ -f\ $tomcatLoca/logs/catalina.out

这样整体功能就完成了,使用时,需要把user、tomcatLoca等变量的值改成自己的情况,然后用如下方式调用(切记不要加.war,该脚本可以再优化一下就是判断参数中是否有.war,不过用习惯了也无所谓):

deploy.sh 项目名

最后贴一张运行图:

基于Shell脚本的Linux下Javaweb项目一键部署