侧边栏壁纸
博主头像
昂洋编程 博主等级

鸟随鸾凤飞腾远,人伴贤良品自高

  • 累计撰写 71 篇文章
  • 累计创建 79 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Gitlab+Webhook自动推送并更新Springboot项目

Administrator
2023-08-01 / 0 评论 / 0 点赞 / 123 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-08-30,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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官方代码库中有说明几种安装方式

文件下载

image-qfxp.png

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文件中可以看到我们需要:

  1. 从git仓库中master分支拉取代码,所以需要先安装好git,并配置好git登录账户参考
  2. 需要安装maven
  3. 还需要另外一个脚本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 &

image-hfdk.png

image-1690889013175看到以上内容表示webhook服务启动成功,并且url也告诉你了http://0.0.0.0:9000/hooks/{id},只要替换ip和id即可

Gitlab配置

找到gitlab中的项目,然后设置下面有个Webhooks

image-anuk.png

  1. 网址就是Webhook服务提供的url,注意url中最后那一部分要替换成要重启的服务配置id,就是前文中提到的那两个id
  2. Secret Token就是自己生成的<YOUR-GENERATED-TOKEN>的值,要webhook配置的一样
  3. 触发来源-推送事件,填写test表示通过推送代码到test分支触发webhook调用
  4. 我这里没有SSL验证

到这里整个配置就算完成了,接下来就可以进行测试

测试

正常推送代码更新的方式或者点击gitlab中webhooks的测试按钮

image-npwk.png

0

评论区