
- 测试机器:若干台外网测试或者生产主机。
- Jenkins服务器:搭建Jenkins服务器主机
-
测试环境目录结构
在根目录下创建data
下面的目录一定要创建好,不然sh脚本会报错,不会自动创建目录/data: 项目总目录/data/exec:执行脚本目录/data/pid:记录各个程序运行时pid/data/work:项目应用程序存放目录
目录结构思路
使用maven构建项目
构建后使用Publish Over SSH部署到远程服务器:
关闭应用
备份应用到lastDepoly目录
上传新版本的Jar包(或者war包)
启动应用
其中,关闭、备份、删除和启动应用都是由脚本来完成, 部署脚本 deploy.sh 放在 /data/exec下(内容见 相关脚本 章节)。
Pushlish Over SSH的执行顺序是先上传文件再执行脚本,所以对于每个应用每个服务器我都设置了两个 Transfer Set :
先执行清理脚本:关闭,备份和删除旧版应用jar包deploy.sh cps-platform-1.0.0 clean
再执行启动脚本启动应用
deploy.sh chl-tss start
cps-platform-1.0.0 为项目打包的名称,替换自己的 *.jar 名称即可。
jenkins
下载Jenkins
在https://jenkins.io/download/下载Jenkins的最新版本。建议下载LTS(LongTermSuport) jenkins.war。
创建Jenkins目录结构,部署到jenkins服务器
在Jenkins服务器上创建以下结构
| - /jenkins/| + pid # 记录jenkins运行pid| + conf # jenkins工作目录| + log| jenkins.sh # jenkins.sh是为了方便启动和停止jenkins服务器| jenkins.war
启动jenkins :
./jenkins.sh start
关闭jenkins:
./jenkins.sh stop
将下载的jenkins.war包上传到Jenkins服务器上,使用一下命令启动:
nohup java -Xms256m -Xmx1024m -XX:MaxPermSize=512m -jar jenkins.war --ajp13Port=-1 --httpPort=8099 > jenkins.out 2>&1 &
增加 Publish Over SSH 插件
在 系统设置->插件管理->可选插件 搜索 Publish Over SSH,选中点击立即安装即可安装。
设置SSH远程服务器
在系统管理-系统配置中,下拉找到Push Over SSH

点击新增,添加远程服务器注意,远程目录以及脚本执行目录一定要保持一致

项目配置
注意,使用流水线构建方式,没有构建环境的配置,选maven构建模式。(需要安装插件maven)
构建环境中勾选 Send files or execute commands over SSH after the build runs,然后点击 Add Server,即可新增目标远程服务器:
Name:新增的远程服务器
Source files:需要上传的文件,可以使用通配符和Jenkins变量。
Exec command:在远程服务器上执行的脚本,这里我的想法是,先清理一下远程服务器,关闭服务并备份程序。

cd /home/admin/data/execsh ./deploy.sh cps-platform-1.0.0 clean
点击Add Transfer Set,新增一组设置:
Source files:需要上传的文件。**/cps-platform-1.0.0.jar。即maven打包生成后的jar包文件。路径相对于maven工程的根目录。
Exec command:在远程服务器上执行的脚本。这里需要先上传文件到服务器,再执行启动脚本
cd /home/admin/data/execsh ./deploy.sh web-0.0.1-SNAPSHOT start
- 点开“高级”之后勾选上 Flatten files,扁平化文件。只上传文件,不上传文件所属文件夹。否则上传到远程文件夹之后就会多一级 target 目录。

注意,如果构建后,报错找不到settings文件,在上图右下角高级按钮处点击,然后配置maven的settings路径,一定要正确
相关脚本
jenkins.sh
#!/bin/sh## java envexport JAVA_HOME=/usr/java/jdk1.8.0_261-amd64export JRE_HOME=$JAVA_HOME/jreexport JENKINS_HOME=/jenkins/conf## exec shell nameEXEC_SHELL_NAME=jenkins\.sh## service nameSERVICE_NAME=jenkinsSERVICE_DIR=/jenkinsJAR_NAME=$SERVICE_NAME\.warPID=pid/$SERVICE_NAME\.pidcd $SERVICE_DIRcase "$1" instart)nohup java -Xms256m -Xmx1024m -XX:MaxPermSize=512m -jar $JAR_NAME --ajp13Port=-1 --httpPort=8099 > log/jenkins.out 2>&1 &echo $! > $SERVICE_DIR/$PIDecho "#### start $SERVICE_NAME";;stop)kill `cat $SERVICE_DIR/$PID`rm -rf $SERVICE_DIR/$PIDecho "#### stop $SERVICE_NAME"sleep 8TEMP_PID=`ps -ef | grep -w "$SERVICE_NAME" | grep "java" | awk '{print $2}'`if [ "$TEMP_PID" == "" ]; thenecho "#### $SERVICE_NAME process not exists or stop success"elseecho "#### $SERVICE_NAME process pid is:$TEMP_PID"kill -9 $TEMP_PIDfi;;restart)$0 stopsleep 2$0 startecho "#### restart $SERVICE_NAME";;esacexit 0
deploy.sh
#!/bin/sh## java envexport JAVA_HOME=/usr/local/jdk8export JRE_HOME=$JAVA_HOME/jre## exec shell nameEXEC_SHELL_NAME=$1\.sh## service nameSERVICE_NAME=$1SERVICE_DIR=/home/admin/java-data/dataJAR_NAME=$SERVICE_DIR/$SERVICE_NAME\.jarPID=pid/$SERVICE_NAME\.pidWORK_DIR=$SERVICE_DIR/work#function startstart(){cd $WORK_DIRif [ ! -d "log" ]; thenmkdir logfinohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME --spring.profiles.active=test >log/$SERVICE_NAME.out 2>&1 &echo $! > $SERVICE_DIR/$PIDecho "#### start $SERVICE_NAME"}# function stopstop(){cd $WORK_DIRif [ -f "$SERVICE_DIR/$PID" ]; thenkill `cat $SERVICE_DIR/$PID`rm -rf $SERVICE_DIR/$PIDfiecho "#### stop $SERVICE_NAME"sleep 6TEMP_PID=`ps -ef | grep -w "$SERVICE_NAME" | grep "java" | awk '{print $2}'`echo "#### TEMP_PID $TEMP_PID"if [ "$TEMP_PID" == "" ]; thenecho "#### $SERVICE_NAME process not exists or stop success"elseecho "#### $SERVICE_NAME process pid is:$TEMP_PID ."kill -9 $TEMP_PIDfi}# function cleanclean(){cd $WORK_DIRif [ ! -d "lastDeploy" ]; thenmkdir lastDeployelserm lastDeploy/$SERVICE_NAME*fiif [ -f "$JAR_NAME" ]; thenmv $JAR_NAME lastDeployfi}case "$2" instart)start;;stop)stop;;restart)stopsleep 2startecho "#### restart $SERVICE_NAME";;clean)stopsleep 2cleanecho "#### clean $SERVICE_NAME";;*)## restartstopsleep 2start;;esacexit 0
问题:
构建maven项目时,报错
Error: Could not find or load main class .usr.local.maven
原因是在全局配置了maven,取消配置即可
系统配置=》Maven项目配置
完整示例








补充,远程目录在Jenkins全局配置里设置即可,项目里不要再设置,否则会叠加
