简介
基于 springboot+Jenkins+github 实现自动化部署项目到阿里云服务器。
准备工作
1.github 上创建一个 springboot 测试项目。
2.服务器上安装如下软件并配置好环境。
-
Jdk
-
git
-
maven
3.安装Jenkins
下载地址:www.jenkins.io/zh/download…
直接下载 war 包,然后放在 Tomcat 的 webapps 就行了,然后运行 Tomcat。
全局工具配置
ssh配置
系统管理->系统配置->Publish over SSH->点开高级,配置阿里云服务器的账号密码
最后点击右下角的 test 测试,出现 success 即为成功。
新建任务
点击首页“新建任务”
General
源码管理
构建环境
server.sh是一个 shell 脚本,用来启动 springboot 打成的 jar,见文末附录。
构建
最后保存
构建
查看控制台输出
如果是第一次构建,会去 maven 仓库下载 jar 包,如果 maven 没有配置国内的镜像地址的话会比较慢。
成功后可以先通过服务器的 ip 去访问项目测试一下。如果失败,可以通过控制台来排错。
Webhooks
使用 github 的 Webhooks 功能实现,当我们 push 修改后的代码后,Jenkins自动进行构建。
登录GitHub,进入"Settings"页面,点击左下角的"Developer settings",如下图
跳转到"Developer settings"页面后,点击左下角的“Personal access tokens”,如下图
跳转到创建token的页面,如下图所示,输入note,再勾选"repo"和"admin:repo_hook",再点击底部的"Generate token"按钮,就能产生一个新的access token,将此字符串复制下来,下一步中会用到
系统管理->系统配置->Github->添加
添加凭证
增加之前的任务的配置
最后手动修改项目源码,push 后观察该任务有没有自动构建
梳理过程
git push 代码的时候会触发github 的 Webhooks 功能并向 Jenkins 发送请求。Jenkins 接收到请求后会去 github 上 clone 代码到该任务的工作空间,接着 maven 进行打包,将 springboot 项目打成 jar 包,等连接上阿里云服务器后,会将 target/*.jar 上传到目标路径下。然后会执行 cd 命令进入 jar 的目录,最后执行 server.sh 脚本。最终成功启动项目。
附
server.sh
将该脚本放在 jar 包所在路径下
使用示例:sh server.sh 项目.jar start
注意:启动命令 java -jar 一定要用绝对路径,不然会导致 Jenkins 构建成功,shell 脚本也执行成功,但是最终服务器上的项目并没有成功启动。网上有说法是因为 Jenkins 构建完成后会关闭所有相关的进程。我最终是通过加绝对路径的方式解决的。
#!/bin/sh
# 应用名称:命令行输入的第一个参数
APP_NAME=$1
# 日志文件路径
LOG_NAME=./info.log
# 使用说明,用来提示输入参数
usage() {
echo "Usage: sh 脚本.sh [APP_NAME] [start|stop|restart|status]"
exit 1
}
# 检查程序是否在运行
is_exist(){
# 获取PID
PID=$(ps -ef |grep ${APP_NAME} | grep -v $0 |grep -v grep |awk '{print $2}')
# -z "${pid}"判断pid是否存在,如果不存在返回1,存在返回0
if [ -z "${PID}" ]; then
# 如果进程不存在返回1
return 1
else
# 进程存在返回0
return 0
fi
}
# 定义启动程序函数
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running, PID=${PID}"
else
# 真正的启动命令,如果有其他参数,可以在此添加
nohup /project/jdk/jdk1.8.0_251/bin/java -jar ${APP_NAME} >${LOG_NAME} 2>&1 &
PID=$(echo $!)
echo "${APP_NAME} start success, PID=$!"
fi
}
# 停止进程函数
stop(){
is_exist
if [ $? -eq "0" ]; then
# 强制关机
kill -9 ${PID}
echo "${APP_NAME} process stop, PID=${PID}"
else
echo "There is not the process of ${APP_NAME}"
fi
}
# 重启进程函数
restart(){
stop
start
}
# 查看进程状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running, PID=${PID}"
else
echo "There is not the process of ${APP_NAME}"
fi
}
case $2 in
"start")
start
;;
"stop")
stop
;;
"restart")
restart
;;
"status")
status
;;
*)
usage
;;
esac
exit 0