现状
项目已部署在生产环境的WebSphere服务器集群下,但公司并没有在生产环境下集成项目自动构建工具Jenkins。
但是,由于项目稳定性的需要,又不能进行全量部署或增量部署。
注:如果随意进行全量部署,可能会将线上已经稳定的代码替换掉,变成测试环境中未经严格检验的代码。
傻瓜式部署
所以,当有业务逻辑发生变更时,为了谨慎起见,只能替换发生变动的字节码文件或jsp文件。
其中,假设我们需要替换的文件是HelloWorld.class,部署的项目位于/opt/IBM路径下,那么需要执行的Linux命令如下:
找出HelloWorld.class所在路径并进入:
find /opt/IBM/ -name 'HelloWorld.class'
cd /opt/IBM/foundpath/
检查HelloWorld.class的最后修改日期:
ll HelloWorld.class
上传最新的HelloWorld.class文件:
rz -y
再次检查:
ll HelloWorld.class
一共需要执行四条命令才能完成对HelloWorld.class文件的更新操作,而且极易出错。
优化脚本
现在Shell脚本(deploy.sh
)中写入以上四条命令,以达到高效低失误执行的目的:
#将sh后的第一个参数定义为变量var
var=$1
echo var: $var
backdir=/opt/backup/
updir=/opt/upload/
#找到vars对应文件名所在的路径,并分离出文件名和路径名
wholename=`find /opt/IBM/ -name $var`
echo wholename: $wholename
#分离出路径名和文件名
dirname=${wholename%/*}
filename=${wholename##*/}
echo dirname: $dirname
echo filename: $filename
#进入文件所在的路径,检查并剪切原文件到备份文件夹下
cd $dirname
echo firstcheck:
ls -l $filename
mv $filename $backdir
#进入上传文件夹,将最新文件剪切到原文件路径下
cd $updir
mv $var $dirname
#进入文件所在的路径,进行检查
cd $dirname
echo secondcheck:
ls -l $filename
注意:以上脚本只适合对只有唯一命名的class文件进行替换。比如find命令的搜索范围/opt/IBM文件夹下只有HelloWorld.class,就可以使用以上脚本。
针对文件路径不唯一的优化
在明确知道在哪个路径部署文件的前提下,将find后面的路径写得更详细一点,把 find /opt/IBM/ -name $var
改为 find /opt/IBM/correct/path/
针对文件不存在的优化
当文件不存在上述路径中,显然deploy.sh是不适合执行的,所以需要多一步检查工作checkfile.sh
:
var=$1
echo var: $var
wholename=`find /opt/IBM/ -name $var`
echo wholename: $wholename
如果执行checkfile.sh
能打印出文件的完整路径,那么就可以执行deploy.sh
部署文件。
./checkfile.sh HelloWorld.class
./deploy.sh HelloWorld.class
Shell脚本中涉及到提取路径名和文件名的操作:
提取文件名
${var##*/}
该方式是从左开始最大化匹配到字符”/”,然后截掉左边内容(包括字符”/”),返回余下右侧部分。
提取路径名
${var%/*}
该方式是从右开始第一次匹配到字符”/”,然后截掉右边内容(包括字符”/”),返回余下左侧部分。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/19603.html