前言
修改完代码后直接提交代码然后解放双手,懒得再手动上传打包部署,那就试试webhook,只需要搞一次以后就可以修改完代码无需再去手动部署,提高你的上线效率。
什么是webhook
Webhook(网络钩子)是一种用于实现应用程序之间实时通信的方式。它允许一个应用程序通过简单的HTTP请求向另一个应用程序发送数据或触发事件。Webhook通常用于集成不同系统、自动化流程以及实现应用程序之间的实时更新。
以下是典型的Webhook工作方式:
- 一个应用程序,称为“发起方”,将一个HTTP请求发送到另一个应用程序,即“接收方”,并指定一个特定的URL作为目标。
- 接收方应用程序在其服务器上设置一个称为“终端点”的URL,用于接收来自发起方的请求。
- 发起方应用程序将请求发送到接收方的终端点URL,并携带所需的数据和参数。
- 接收方应用程序接收到请求后,可以执行相应的操作,例如处理数据、更新数据库、发送通知等。
- 接收方应用程序可以对处理结果进行响应,将响应发送回发起方应用程序,以便发起方可以得知请求的处理情况。
Webhook提供了一种方便而灵活的方式,使得应用程序能够实时地传递信息和触发操作。它可以用于各种场景,如通知、数据同步、自动化流程等。
准备及安装
1.下载webhook
在服务器上下载webhook,然后解压。比如在/home/www目录下载,本文以该目录为例,写这篇文章时最新版本为2.8.1
下载,注意系统类型
wget https://github.com/adnanh/webhook/releases/download/2.8.1/webhook-linux-amd64.tar.gz
解压并且将文件夹改名,文件夹名根据自己需求来
tar -zxvf webhook-linux-amd64.tar.gz && mv webhook-linux-amd64 webhook2.8.1
2.新建hook.json文件(或者hook.yaml,支持json和yaml两种类型的文件,本文以json文件为例)
cd webhook2.8.1 && touch hook.json
3.往hook.json文件中写入配置信息
[
{
"id": "demo2023",
"execute-command": "/home/www/webhook2.8.1/demo2023.sh",
"command-working-directory": "/home/www/webhook2.8.1",
"pass-arguments-to-command":
[{
"source":"payload",
"name": "ref"
}],
"response-message": "执行成功"
}
]
参数说明
id
: 指定钩子的ID。此值用于创建 HTTP 端点 (http://yourserver:port/hooks/your-hook-id)execute-command
: 指定触发钩子时应执行的命令,就是进行代码拉取等操作的脚本command-working-directory
: 指定执行脚本时将用于脚本的工作目录pass-arguments-to-command
: 指定将传递给命令的参数列表。 检查引用请求值页面以了解如何从请求中引用值。 如果要将静态字符串值传递给命令,可以将其指定为 { "source": "string", "name": "argumentvalue" }response-message
: 指定将返回给钩子发起者的字符串,就是响应的内容
想要了解更多配置及参数说明可以查看原文档
4.编写拉取的脚本
touch demo2023.sh #注意这个文件名和上面的json文件中execute-command参数的文件一致
脚本内容示例(根据自己项目实际情况编写):
#!/bin/sh
branch="master"
if [[ $1 = "refs/heads/$branch" ]];then
# mylog 是当前站点的拉取日志位置
mylog="/home/www/webhook2.8.1/logs/demo2023.log"
# mygitroot 是当前站点的拉取目录,即源码目录
mygitroot="/home/www/demo2023"
# echo "--------------------------------------------------------" >> $mylog
# echo "开始:" date --date='0 days ago' "+%Y-%m-%d %H:%M:%S" >> $mylog
cd $mygitroot && git checkout $branch >> /dev/null && git fetch && git reset --hard HEAD && git clean -df && git merge '@{u}' && git pull >> /dev/null 2>&1
# echo "本地仓库(不包含未合并内容)简洁最新记录:" >> $mylog
# echo "" >> $mylog
cd $mygitroot && git log --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit -2 >> $mylog
# echo "dev拉取完成" >> $mylog
echo "" >> $mylog
echo "--------------------------------------------------------" >> $mylog
exit;
else
echo "当前推送的非$branch分支,不进行拉取"
fi
exit
注意
- 这个示例里面有一个日志目录,记得去新建日志目录或者自行调节脚本内容
5.生成公钥,然后将当前用户的公钥添加到github、gitlab等存储库,建议使用web程序运行的用户的公钥,拉取的时候使用该用户可避免拉取失败以及文件权限等问题
6.启动webhook程序
测试的时候可以用这种方式启动,在/home/www/webhook2.8.1底下执行
./webhook -port 9999 -hooks ./hook.json -verbose -hotreload
能正常使用没问题了可以通过守护进程的方式启动
nohup /home/www/webhook2.8.1/webhook -port 9999 -logfile /home/www/webhook2.8.1/nohup.out -hooks /home/www/webhook2.8.1/hook.json -verbose -hotreload &
关于启动命令的参数看文档
如果是root用户想要指定其他用户启动可以用这个命令:
# 使用www用户启动这个脚本
sudo -H -u www bash -c "nohup /home/www/webhook2.8.1/webhook -port 9999 -logfile /home/www/webhook2.8.1/nohup.out -hooks /home/www/webhook2.8.1/hook.json -verbose -hotreload &"
注意:
- 服务器防火墙关闭webhook启动时的端口或者添加ip白名单
- 启动的时候是用的web程序目录,即第5步中提到的用户,否则拉取的时候会拉取失败,因为公钥用的是该用户的公钥
7.测试
在浏览器中访问http://域名:端口/hooks/demo2023,如果能够成功访问那就成功大半了
8.添加webhooks
在github、gitlab等存储库中的项目里面的设置功能,找到webhooks,填写步骤7里面的地址,然后保存,可以点击一下测试,看看响应是否成功,如果失败,查看哪一步出了问题,一定记住打开防火墙端口
然后就可以修改一下代码,提交并推送看看是否成功
最后
整体的搭建就是这些的,细节比较多,出问题了多查查日志、官方文档等,本文章涉及到的日志文件如下:
- /home/www/webhook2.8.1/nohup.out 启动命令里面的参数控制,主要是webhook的运行日志
- /home/www/webhook2.8.1/logs/demo2023.log 脚本里面,git拉取后存储库的提交日志
相关文档:
评论 (0)