这是关于我使用Jenkins部署Maven项目的经验之谈,包括了部署流程、Maven多模块的一些试验,以及使用Publish Over SSH的问题。

简述我这里使用Jenkins部署的流程。

  1. 从SVN将项目Checkout下来。
  2. 使用Maven打包项目,生产jar包
  3. 将部署的shell脚本传输到目标服务器。
  4. 第2步中的jar包传输到目标服务器并使用第3步中的脚本启动。

首先,新建一个任务。

图片

这里,我选择自由风格的软件项目。虽然我的项目是多模块的,但是,我的这些项目并没有直接的关联。父pom.xml只是帮助一些依赖包的管理,它们都是独立部署的,有各自的shell脚本。但是这有一个前提条件,就是父pom.xml已经再本地或远程仓库。

Jenkins会使用任务名称,在/home/<用户>/.jenkins/workspace下生成文件夹,svn检出的代码会放在这个文件夹下。

源码管理,填写源码的svn地址和用户凭证(需要Subversion插件)

图片

使用Maven构建

1
clean install -Dmaven.test.skip=true

图片

构建后操作,将项目根目录的shell脚本和jar包传到目标服务器(需要Publish Over SSH插件)

图片

图片

这里有两个Transfer Set,一个传shell脚本,并修改脚本的权限。另一个传jar包,并使用shell脚本启动jar包。

注意

1
2
#! /bin/bash
chmod 777 /app/bootapp/shell/deploy-gateway.sh

这里,如果不加#! /bin/bash, 添加这个Exec command后会出现保存不了的问题。但是去掉.sh却可以保存。

而且,如果#! /bin/bash中没有空格也会保存不上。

附一个shell示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DATE=$(date +%Y%m%d)
DIR=/app/bootapp
PROJECT_NAME=gateway
JARFILE=$PROJECT_NAME-0.0.1-SNAPSHOT.jar
# 创建备份文件夹
if [ ! -d $DIR/backup ];then
  mkdir -p $DIR/backup
fi
cd $DIR || exit
# 停服务
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
# 备份旧的jar包
mv $JARFILE backup/$JARFILE$DATE
# 新jar包拷贝到当前目录
mv -f $DIR/jenkins_output/$JARFILE .

if java -jar $JARFILE > logs/out_$PROJECT_NAME.log &
then
  sleep 30
  tail -n 50 logs/out_$PROJECT_NAME.log
fi
cd backup/ || exit
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf

注意

shell脚本换行符得是\n,这个可以在编辑的时候使用IDEA,然后在右下角修改。

图片