编写自动化部署脚本之前要先确认git 插件 maven插件以及setting文件设置 jdk 插件都已经安装并配置到jenkins中
脚本实现思路
1.将git 项目下载到jenkins的工作空间里 /var/lib/jenkins/workspace
2.使用maven 打包构建项目
3.上传文件夹构建脚本到目标服务器
3-1.修改文件夹构建脚本中项目路径变量为当前项目路径
3-2.并执行构建不存在的目标文件夹 然后删除文件夹构建脚本
4.上传jar包到目标服务器
5.上传执行脚本到目标服务器
5-1.修改执行脚本中的jar包全路径变量为当前项目jar包全路径
6.执行启动脚本
jenkins pipeline脚本示例:
node () {
def workspace = pwd()
user='root'
passwd='*******'
project_name='scf-gateway'
jar_name='scf-gateway-1.0.0-SNAPSHOT.jar'
server_path='/var/lib/jenkins/workspace/server.sh'
haveDivectory_path='/var/lib/jenkins/workspace/haveDivectory.sh'
currentpath='/data/'+project_name+'/'+jar_name
project_path='/data/'+project_name+'/'
/**
* 项目检出 新项目复制脚本只需要修改project_name 和 jar_name 两个变量 在项目结构不一致情况下需注意下方两个注释处区别
**/
stage 'checkout'
git branch: branches, credentialsId: 'git_account', url: 'http://192.168.0.246:2080/scf-ms/scf-gateway.git'
/**
* 项目构建 当项目结构为单项目体结构时使用"cd $workspace/" 项目结构为多项目结构式使用 "cd $workspace/$project_name/"
**/
stage 'Build'
sh """
cd $workspace/
/usr/local/maven/apache-maven-3.6.1/bin/mvn clean install -Dmaven.test.skip=true -P $activation
"""
stage 'delete_old'
sh """sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "rm -rf $currentpath && rm -rf /data/$project_name/server.sh"
"""
/**
* 上传文件 当项目结构为单项目体结构时使用"cd $workspace/target" 项目结构为多项目结构式使用 "cd $workspace/$project_name/target"
**/
stage 'upload'
sh """
cd $workspace/target
sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$haveDivectory_path' '$user'@'$environment_ip':/haveDivectory.sh
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "sed -i 's#targetServerPath#$project_path#g' /haveDivectory.sh"
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "cd / && sh haveDivectory.sh && rm -rf haveDivectory.sh"
sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$jar_name' '$user'@'$environment_ip':$currentpath
sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$server_path' '$user'@'$environment_ip':/data/$project_name/server.sh
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "sed -i 's#currentappath#$currentpath#g' /data/$project_name/server.sh"
"""
/**
* 启动项目
**/
stage 'restart'
sh """
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "cd $project_path && sh server.sh restart"
"""
echo 'done_______________'
}
变量说明
1.workspace=pwd() 是获取当前项目所在工作空间一般在jenkins安装目录下的workspace目录下可以找到
2.user 目标服务器的链接用户名
3.passwd 目标服务器的密码
4.project_name 当前项目名称
5.jar_name 当前项目打包后jar包名称
6.server_path 原始启动脚本(未修改项目路径的脚本)地址
7.haveDivectory_path 原始在目标服务器创建目标文件夹脚本地址(未修改项目路径的脚本)
8.currentpath 目标服务器jar包所在全路径
9.project_path 目标服务器项目所在路径
10.branches git源码分支变量(页面配置多选)
11.environment_ip 目标服务器ip地址(页面配置多选)
12.activation 配置文件环境变量 (页面配置多选。需要在maven项目中pom中设置profiles参数变量)
13.git_account 是在jenkins中配置的全局凭证(git仓库的用户名密码)
2.jenkins配置变量示例
3.原始新建文件夹脚本示例:(使用shell命令修改'targetServerPath'变量)
#!/bin/bash
if [ ! -d 'targetServerPath' ];then
mkdir targetServerPath
else
echo "文件夹已经存在"
fi
4.原始启动服务脚本示例:(修改shell命令修改'currentappath'变量)
#!/bin/bash
export JAVA_HOME=/usr/local/jdk1.8.0_101/
export JRE_HOME=/$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=currentappath
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
nohup java -jar ${APP_NAME} >info.out 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 5
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac