分布式项目一键发布脚本
1代码管理
目前我这边接触的是使用svn进行管理的项目,对于git管理的目前只接触了两个项目,经验不是很丰富,就不多说了。主要记录基于svn管理的代码发布。
cd 脚本目录
case $1 in
条件1)
svn co --username svn用户名--password svn密码 svn地址 ../svn/aiesb
;;
条件2)
ssvn co --username svn用户名--password svn密码 svn地址 ../svn/aopopr
;;
*)
echo "请输入 条件1/条件2"
;;
esac
2编译打包
目前使用的是ant进行编译打包,代码和配置分离的打包方式。需要基于ant
用xml进行配置。
<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="process">
<property file="build.properties" />
<target name="init">
<delete dir="${build.tmp.dir}" />
<delete dir="${build.dist.dir}" />
<mkdir dir="${build.dist.dir}" />
<mkdir dir="${build.tmp.dir}/${project.esb.name}" />
<mkdir dir="${build.tmp.dir}/${project.esb.name}/classes" />
<mkdir dir="${build.tmp.dir}/${project.esb.name}/config" />
<mkdir dir="${build.tmp.dir}/${project.esb.name}/lib" />
</target>
<target name="compile_esb" depends="init">
<echo message="Start Compile java - esb" />
<javac fork="true" srcdir="${build.svn.dir}/aiesb/src;" destdir="${build.tmp.dir}/${project.esb.name}/classes" debug="true" debuglevel="lines,vars,source" nowarn="true" includeAntRuntime="no" failonerror="true" >
<!--<compilerarg line="-encoding UTF-8 -J-Xms1024m -J-Xmx1024m"/>-->
<classpath>
<fileset dir="${build.svn.dir}/aiesb/lib" includes="*.jar" />
<fileset dir="${build.lib.dir}" includes="*.jar" />
</classpath>
<include name="**/*.*" />
<!--<exclude name="test/**/*.*" />-->
<!--<exclude name="**/test/*.*" />-->
<exclude name="example/**/*.*" />
</javac>
<echo message="Compile Success" />
<echo message="Generate compiled Class to jar" />
<jar destfile="${build.dist.dir}/${project.esb.name}.jar">
<fileset dir="${build.tmp.dir}/${project.esb.name}/classes">
<include name="**/*.class" />
</fileset>
</jar>
<echo message="Generate Jar Success" />
</target>
<target name="process" depends="compile_esb">
<echo message="Copy File" />
<copy todir="${build.tmp.dir}/${project.esb.name}/config">
<fileset dir="${build.svn.dir}/aiesb/config" includes="**/*"/>
</copy>
<copy todir="${build.tmp.dir}/${project.esb.name}/config" overwrite="true">
<fileset dir="${build.config.dir}/${project.esb.name}/config" includes="**/*"/>
</copy>
<echo message="config overwrite finished" />
<!--<delete file="${build.tmp.dir}/${project.esb.name}/config/system/service/defaults.xml" />-->
<delete file="${build.tmp.dir}/${project.esb.name}/config/system/isb/deployment.xml" />
<!--<delete file="${build.tmp.dir}/${project.esb.name}/config/socketLog.properties" />-->
<delete file="${build.tmp.dir}/${project.esb.name}/config/log4j.properties" />
<copy todir="${build.tmp.dir}/${project.esb.name}/lib">
<fileset file="${build.dist.dir}/${project.esb.name}.jar" />
<fileset dir="${build.svn.dir}/aiesb/lib" includes="*.jar" />
<!--<fileset dir="${build.lib.dir}" includes="tools.jar" />-->
</copy>
<jar destfile="${build.dist.dir}/${project.esb.name}_config.jar" basedir="${build.tmp.dir}/${project.esb.name}/config"/>
<jar destfile="${build.dist.dir}/${project.esb.name}_lib.jar" basedir="${build.tmp.dir}/${project.esb.name}/lib"/>
</target>
</project>
3可执行代码同步应用主机
使用rsync进行此操作。rsync的基本命令可以参考rsync同步介绍
rsync是基于ssh端口的,如果ssh不是默认端口会报错
#!/bin/bash
source ./ip.config
version=版本源地址/
todir=版本目标地址
user=${appuser}
case $1 in
all)
echo "all-- ${ips[@]} --"
for ip in ${ips[@]}; do
echo "${ip} 开始同步版本"
rsync -avz $version $user@$ip:$todir
done
;;
BST)
echo "BST-- ${BSTips[@]} --"
for ip in ${BSTips[@]}; do
echo "${ip} 开始同步版本"
rsync -avz $version $user@$ip:$todir
done
;;
LC)
echo "LC-- ${LCips[@]} --"
for ip in ${LCips[@]}; do
echo "${ip} 开始同步版本"
rsync -avz $version $user@$ip:$todir
done
;;
JRY)
echo "JRY-- ${JRYips[@]} --"
for ip in ${JRYips[@]}; do
echo "${ip} 开始同步版本"
rsync -avz $version $user@$ip:$todir
done
;;
DMZ)
echo "DMZ-- ${DMZips[@]} --"
for ip in ${DMZips[@]}; do
echo "${ip} 开始同步版本"
rsync -avz $version $user@$ip:$todir
done
;;
test)
echo "test-- ${testips[@]} --"
for ip in ${testips[@]}; do
echo "${ip} 开始同步版本"
rsync -avz $version $user@$ip:$todir
done
;;
*)
echo "请输入 all/BST/LC/JRY/DMZ"
;;
esac
echo '==aiesb version sync over=='
4rsync配合主机间的shh免密登录更容易移植
主机间的免密登录可以参考linux主机间的免密登录
5生成可运行的节点
可以在应用主机上预先写好生成节点的脚本genOpcfesb.sh
,在发布机上通过免密登录,登录到应用主机上执行此脚本,根据同步过来的基础版本生成可以运行的节点。这一步需要根据实际需要编写个性化的脚本genOpcfesb.sh
。
#!/bin/bash
source ./ip.config
user=${appuser}
cmd="sh ${apphome}/sbin/genOpcfesb.sh"
case $1 in
all)
echo "all-- ${ips[@]} --"
for ip in ${ips[@]}; do
echo "start generate opcfesb for ${ip} "
ssh $user@$ip $cmd
done
;;
BST)
echo "BST-- ${BSTips[@]} --"
for ip in ${BSTips[@]}; do
echo "start generate opcfesb for ${ip} "
ssh $user@$ip $cmd
done
;;
LC)
echo "LC-- ${LCips[@]} --"
for ip in ${LCips[@]}; do
echo "start generate opcfesb for ${ip} "
ssh $user@$ip $cmd
done
;;
JRY)
echo "JRY-- ${JRYips[@]} --"
for ip in ${JRYips[@]}; do
echo "start generate opcfesb for ${ip} "
ssh $user@$ip $cmd
done
;;
DMZ)
echo "DMZ-- ${DMZips[@]} --"
for ip in ${DMZips[@]}; do
echo "start generate opcfesb for ${ip} "
ssh $user@$ip $cmd
done
;;
test)
echo "test-- ${testips[@]} --"
for ip in ${testips[@]}; do
echo "start generate opcfesb for ${ip} "
ssh $user@$ip $cmd
done
;;
*)
echo "请输入 all/BST/LC/JRY/DMZ"
;;
esac
echo "==genOpcfesb over=="
6启停脚本
根据ip列表和每台应用主机上预留的单主机全量启停脚本,通过ssh免密登录到ip列表中的每台主机进行此步操作。
start-opcfesb.sh
#!/bin/bash
source ./ip.config
user=${appuser}
cmd="sh ${apphome}/sbin/start_all.sh"
case $1 in
all)
echo "all-- ${ips[@]} --"
for ip in ${ips[@]}; do
echo "开始启动 ${ip}"
ssh $user@$ip $cmd
done
;;
BST)
echo "BST-- ${BSTips[@]} --"
for ip in ${BSTips[@]}; do
echo "开始启动 ${ip}"
ssh $user@$ip $cmd
done
;;
LC)
echo "LC-- ${LCips[@]} --"
for ip in ${LCips[@]}; do
echo "开始启动 ${ip}"
ssh $user@$ip $cmd
done
;;
JRY)
echo "JRY-- ${JRYips[@]} --"
for ip in ${JRYips[@]}; do
echo "开始启动 ${ip}"
ssh $user@$ip $cmd
done
;;
DMZ)
echo "DMZ-- ${DMZips[@]} --"
for ip in ${DMZips[@]}; do
echo "开始启动 ${ip}"
ssh $user@$ip $cmd
done
;;
test)
echo "test ${testips[@]} "
for ip in ${testips[@]}; do
echo "开始启动 ${ip}"
ssh $user@$ip $cmd
done
;;
*)
echo "请输入 all/BST/LC/JRY/DMZ"
;;
esac
echo '==start over=='
stop-opcfesb.sh
#!/bin/bash
source ./ip.config
user=${appuser}
cmd="sh ${apphome}/sbin/stop_all.sh"
case $1 in
all)
echo "all-- ${ips[@]} --"
for ip in ${ips[@]}; do
echo "开始停 ${ip}"
ssh $user@$ip $cmd
done
;;
BST)
echo "BST-- ${BSTips[@]} --"
for ip in ${BSTips[@]}; do
echo "开始停 ${ip}"
ssh $user@$ip $cmd
done
;;
LC)
echo "LC-- ${LCips[@]} --"
for ip in ${LCips[@]}; do
echo "开始停 ${ip}"
ssh $user@$ip $cmd
done
;;
JRY)
echo "JRY-- ${JRYips[@]} --"
for ip in ${JRYips[@]}; do
echo "开始停 ${ip}"
ssh $user@$ip $cmd
done
;;
DMZ)
echo "DMZ-- ${DMZips[@]} --"
for ip in ${DMZips[@]}; do
echo "开始停 ${ip}"
ssh $user@$ip $cmd
done
;;
test)
echo "test ${testips[@]} "
for ip in ${testips[@]}; do
echo "开始停 ${ip}"
ssh $user@$ip $cmd
done
;;
*)
echo "请输入 all/BST/LC/JRY/DMZ"
;;
esac
echo "==stop over=="
ip.config
#!/bin/bash
#应用主机用户
appuser=应用主机用户
apphome=应用主机HOME目录全路径
testips=(ip1 ip2 ip3)
refreships=(ip1 ip2 ip3)
#所有应用主机
ips=(ip1 ip2 ip3 ip4 ip5 ip6 ip11 ip12 ip13 ip14 ip15 ip16)
#按照中心分
BSTips=(ip1 ip2 ip3 ip4 ip5 ip6)
LCips=(ip11 ip12 ip13 ip14 ip15 ip16)
#按照归属域分
JRYips=(ip4 ip5 ip6)
DMZips=(ip14 ip15 ip16)
7将涉及到的每个步骤合并形成一键发布脚本
#!/bin/bash
input=$1
if [ ! -n "$1" ]; then
echo "请输入 all/BST/LC/JRY/DMZ"
exit -1
fi
echo "inputParam is ${input}"
# 代码拉取
sh check_svn.sh 条件1
# 编译
sh create-esb.sh
# 将编译后的jar整理成基础版本
sh preAiesb.sh
sh rsync-aiesb.sh $input
sh stop-opcfesb.sh $input
sh gen-opcfesb.sh $input
# 睡眠足够长时间,让连接释放,单位秒s
sleep 120
sh start-opcfesb.sh $input
8节点健康状态检查
按端口进行检测,根据实际情况修改
#!/bin/bash
source ./ip.config
user=${appuser}
cmd="netstat -na|grep 700 | grep 'LISTEN' | wc -l"
for ip in ${ips[@]}; do
echo "${ip} LISTEN PORT Nums:"
ssh $user@$ip $cmd
done
9一键缓存刷新
根据实际情况编写,我的思路是在同一个域中只互相连通的主机中取一台作为刷新机,在该台主机上预留刷新整个域的刷新脚本,刷新整个域,所以有几个域就配置几个刷新机就可以了,不用每台都登录上去执行。