从零开始的个人博客搭建06-使用webhook实现git项目在云服务器上的自动部署
什么是WebHook?
WebHook,可以简单理解为一个由特定条件触发的http请求。
例子:在Github中的每个仓库都可以配置webhook,当push触发webhook后,github会根据配置向特定的服务器发送一个http/https请求,并携带相应的信息,服务器收到请求后,可以根据信息做一系列不同的操作。
自动部署实现思路:
github远程仓库有webhook功能,在代码push时,可以配置让其向指定服务器发送一个post请求;当我们的云服务器接受到这个请求时,执行git pull命令拉取最新代码,并执行一系列bash命令即可完成自动部署。
架构图:
问题:
在实践过程中,我发现在服务器上无法直接拉取github代码,原因可能与github被墙有关,因此需要转变思路,使用国内的代码托管平台同步github上的代码,并发送webhook请求,然后服务器再拉取国内代码托管平台上的代码,最后再执行自动部署脚本完成部署
解决思路:
- 放弃使用github,改用gitee仓库来存储代码
- 使用github同步
调整后的架构:
具体实现步骤:
一、配置gitee仓库的webhook
进入到项目>管理>Webhooks,配置接口的URL,密码,事件并点击确定。
不同与github仓库,gitee仓库默认不验证ssl证书,所以不用额外配置
二、服务器端环境搭建
1.安装node环境
在node官网下载linux的node安装包,上传到服务器
解压安装包到 /usr/local/soft 目录下
1 | sudo tar -xvf node-v18.16.1-linux-x64.tar.xz -C /usr/local/soft |
进入目录为node创建关联(类似于window下配置环境变量)
1 | ln -s /usr/local/soft/node18.16/bin/node /usr/bin/node |
2.安装git
1 | sudo apt update |
查看版本验证是否安装成功
1 | git --version |
三、搭建webhook-handler服务(可在windows完成后上传到服务器);
3.1初始化项目
创建一个web-handler文件夹作为项目文件夹,并初始化项目
1 | npm init -y |
2)安装依赖
1 | npm i express && npm i child_process |
3.2使用express搭建node服务
在项目根目录创建一个main.js,写入如下代码
1 | const express = require('express') |
同样在根目录新建一个deploy.sh脚本文件,将下面的代码复制进去
1 |
|
3.3生成自签名ssl证书
将上一步中的项目文件夹上传到服务器中(我上传到了/home/lighthouse)
❗️ 仅用于测试,后期服务器绑定域名后可用域名免费生成用于生产环境的ssl证书
安装openssl
1 | sudo apt-get install openssl |
生成ssl证书和私钥
1 | openssl req -nodes -newkey rsa:2048 -keyout server.key -out server.csr |
生成自签名证书
1 | openssl x509 -req -in server.csr -signkey server.key -out server.crt |
设置私钥权限
1 | hmod 600 server.key |
4.启动服务
在服务器中,进入到项目文件夹下,执行js脚本启动服务
1 | cd /home/light-house/webhook-handler |
1 | node main.js |
启动成功提示:
四、拉取项目代码,测试Webhook
❗️ 进行到这里出现了个小问题,由于国内无法直连github从github仓库克隆,这里需要先将github仓库中的代码同步到gitee,再从gitee拉取最新代码
1.添加GithubAction脚本,向Gitee仓库同步代码
比较简单,可以参考这篇教程:https://cloud.tencent.com/developer/article/1917861
2.拉取项目到服务器
先在服务器上生成ssh
1 | ssh-keygen -t rsa -b 4096 |
生成后进入到 /root/.ssh下,复制公钥添加到gitee中(Gite公钥添加方法自行百度)
1 | cd /root/.ssh |
然后将项目克隆到本地
1 | cd 一个你要存放项目的目录(我的:/var/www) |
3.测试webhook的执行情况
在本地仓库随便提交一次并push,将触发githubAction脚本,将代码同步到gitee,gitee同步代码后触发webhook,向服务器发送POST请求,服务器收到请求后,将验证密码,并执行我们写好的deploy.sh脚本自动构建并替换静态文件。
⚠️测试技巧:Gitee发送Webhook后,会有请求历史,点击重新发送可以提高测试效率