使用maven-wagon插件实现自动化部署
在项目开发过程中,经常需要部署代码到开发环境,每天可能有好多次,每次都需要mvn clean install & package,然后上传到服务器。实际上这些繁琐的步骤可以通过一个Maven插件wagon-maven-plugin来自动完成
1.导入依赖
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
</dependency>
2.在打包项目pom文件buid中配置
<build>
<finalName>ka-admin</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<!-- 需要部署的文件 : target下生成的包 -->
<fromFile>target/${pack-name}.jar</fromFile>
<!-- 服务器中上传包部署目录 -->
<url>scp://服务器账号:密码@服务器IP/其它路径</url>
<!-- 服务器执行的命令集合 -->
<commands>
<!-- 上传后执行服务器脚本 可以直接写指令,也可以写要运行得脚本路径 -->
<command>sudo sh /data/deploy/ka-admin/deploy.sh</command>
</commands>
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</plugin>
</plugins>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.10</version>
</extension>
</extensions>
</build>
其中
1.<formFile>为target下的jar包 全路径名称 如 target/ka-admin.jar
2.<url>为包上传路径 格式为 scp://服务器账号:密码@服务器IP/其它路径
3.<commands>为上传完成后需要在服务器执行的指令,可以直接写指令,也可以写在服务器中需要执行的shell脚本。一个<command>为一条指令,可以配置多条依次执行
其它配置固定
执行服务器脚本
示例
# 步骤
# 1、把旧包备份到bak目录
# 2、新包移动到工作区
# 3、杀死进程
# 4、启动服务
# 指定启动环境 以 java为例
activeProfile="test"
fileName="ka-admin"
logName="cataline.log"
#项目根路径 工作区
basePath="/data/deploy/${fileName}"
#包上传路径
uploadPath="${basePath}/data/upload"
#备份包路径
bakPath="${basePath}/data/bak"
baseJar="${basePath}/${fileName}.jar"
uploadJar="${uploadPath}/${fileName}.jar"
bakJar="${bakPath}/${fileName}.jar"
# 判断备份路径是否存在,不存在创建目录
if [ ! -d "$uploadPath" ]; then
echo "mkdir ${uploadPath}"
mkdir -p "${uploadPath}"
fi
if [ -d "$baseJar" ]; then
mv -f ${baseJar} ${bakJar}
fi
# 移动上传包到工作区
if [ -d "$uploadJar" ]; then
mv -f ${uploadJar} ${baseJar}
fi
# 查看启动进程
pid=`ps -ef|grep ${fileName}.jar | grep -v grep | awk '{print $2}'`
echo "旧进程id:${pid}"
echo "e"
# 杀死进程
kill -9 $pid
# 重启进程
if [ -e "$baseJar" ]; then
echo "开始启动此程序..."
source /etc/profile nohup java -jar ${fileName}.jar > ${logName} 2>&1 &
tail -f ${logName}
pIdNew=`ps -ef|grep ${fileName}.jar | grep -v grep | awk '{print $2}'`
echo "${fileName} 启动成功,pil:${pIdNew}..."
else
echo "${fileName}.jar 不存在,请检查..."
fi
执行打包上传命令
mvn clean package wagon:upload-single wagon:sshexec
注意
项目部署后可能会无法启动,我碰到过是找不到主类
解决办法:
在buidl中maven打包插件中加入配置指定主类
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.androidserver.server.Main(主类全路径)</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
windows复制脚本到linux不能执行,需要修改格式为unix
修改脚本格式命令:
vim xxx.sh
后
:set ff=unix
学习记录,可能会有错误,欢迎指正