Webhook github地址: https://github.com/adnanh/webhook, 以下以springboot项目为例进行说明
自动更新部署springboot项目
自动部署的原理
- 部署安装Webhook,配置好Webhook之后会以类似nginx的方式暴露一个url,调用此url会执行Webhook中配置的脚本文件,而脚本文件中大致包含代码拉取、打包、重启等操作
- Gitlab配置Hooks,在接收到代码推送之后根据Hooks的配置去调用上一步配好的url
- 本地开发好之后推送代码到Gitlab服务端指定分支(比如test)
需要条件
- 一台运行java服务的服务器(我的是centos7.4)
- JDK环境(或者Jre)
- Maven环境
- Git
- Webhook(重要)
- Gitlab配置
前面几项都很好安装,我只说明Webhook的安装和配置
安装Webhook
github官方代码库中有说明几种安装方式
文件下载
上Release页面根据系统类型下载文件
上传文件并解压
上传webhook-linux-amd64.tar.gz到/opt目录下,然后解压并移动到/usr/local/webhook,并可以添加可执行权限
定义webhook服务的钩子
webhook服务的钩子支持json格式和yaml/yml文件格式,比如我这里编写了一个重新部署lims前后端的json文件redeploy-lims.json
[
{
"id": "redeploy-lims-web",
"execute-command": "/var/scripts/redeploy-lims-web.sh",
"command-working-directory": "/var/webhook",
"pass-arguments-to-command":
[
{
"source": "payload",
"name": "user_name"
}
],
"response-message": "Executing redeploy-lims-web script",
"trigger-rule":
{
"match":
{
"type": "value",
"value": "195ec940-7b64-e614-0fc9-82b616988091",
"parameter":
{
"source": "header",
"name": "X-Gitlab-Token"
}
}
}
},
{
"id": "redeploy-lims-server",
"execute-command": "/var/scripts/redeploy-lims-server.sh",
"command-working-directory": "/var/webhook",
"pass-arguments-to-command":
[
{
"source": "payload",
"name": "user_name"
}
],
"response-message": "Executing redeploy-lims-server script",
"trigger-rule":
{
"match":
{
"type": "value",
"value": "<YOUR-GENERATED-TOKEN>",
"parameter":
{
"source": "header",
"name": "X-Gitlab-Token"
}
}
}
}
]
redeploy-lims.json文件中可以配置多个部署服务,我这里有两个,id不同,后面调用url的时候就是根据id调用的;execute-command表示执行的命令文件路径;command-working-directory表示命令执行工作目录,大致理解为命令执行输出日志的目录即可,目录必须手动提前创建好;注意这里的trigger-rule,表示触发规则,内容匹配请求header中包含name为"X-Gitlab-Token",value为"<YOUR-GENERATED-TOKEN>"的请求,注意这里的<YOUR-GENERATED-TOKEN>要改成自己的token,我这里是生成的一个uuid,然后就是说请求调用url中必须添加header:
从redeploy-lims.json中的id: redeploy-lims-server的配置可以看出,我这里有一个shell脚本"/var/scripts/redeploy-lims-server.sh",那么接下来就需要编写此脚本
编写Shell脚本
redeploy-lims-server.sh文件内容
#!/bin/bash
# 转到项目目录
cd /usr/local/lims/java/HUGO.lims.Server
# 拉取最新的代码
git pull origin master
# maven安装
mvn clean install -Dmaven.test.skip=true
# 重新启动
cd .. && sh hugo.sh restart
# 输出一些信息以便调试
echo "Hugo-Lims-server updated successfully"
从redeploy-lims-server.sh文件中可以看到我们需要:
- 从git仓库中master分支拉取代码,所以需要先安装好git,并配置好git登录账户参考
- 需要安装maven
- 还需要另外一个脚本hugo.sh,脚本就是执行java服务的启动相关,内容如下
#替换这里jar包的路径,其它代码无需更改
APP_NAME=/usr/local/lims/java/HUGO.lims.Server/target/hugo.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh item.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} --spring.profiles.active=test >item.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
启动Webhook服务
在webhook可执行文件的目录下执行
nohup ./webhook -hooks redeploy-lims.json -port 9000 -verbose &
看到以上内容表示webhook服务启动成功,并且url也告诉你了http://0.0.0.0:9000/hooks/{id},只要替换ip和id即可
Gitlab配置
找到gitlab中的项目,然后设置下面有个Webhooks
- 网址就是Webhook服务提供的url,注意url中最后那一部分要替换成要重启的服务配置id,就是前文中提到的那两个id
- Secret Token就是自己生成的<YOUR-GENERATED-TOKEN>的值,要webhook配置的一样
- 触发来源-推送事件,填写test表示通过推送代码到test分支触发webhook调用
- 我这里没有SSL验证
到这里整个配置就算完成了,接下来就可以进行测试
测试
正常推送代码更新的方式或者点击gitlab中webhooks的测试按钮
评论区