利用webhook实现代码自动化部署

利用webhook实现代码自动化部署

binscor
2023-06-12 / 0 评论 / 285 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年09月22日,已超过309天没有更新,若内容或图片失效,请留言反馈。

前言

修改完代码后直接提交代码然后解放双手,懒得再手动上传打包部署,那就试试webhook,只需要搞一次以后就可以修改完代码无需再去手动部署,提高你的上线效率。

什么是webhook

Webhook(网络钩子)是一种用于实现应用程序之间实时通信的方式。它允许一个应用程序通过简单的HTTP请求向另一个应用程序发送数据或触发事件。Webhook通常用于集成不同系统、自动化流程以及实现应用程序之间的实时更新。

以下是典型的Webhook工作方式:

  1. 一个应用程序,称为“发起方”,将一个HTTP请求发送到另一个应用程序,即“接收方”,并指定一个特定的URL作为目标。
  2. 接收方应用程序在其服务器上设置一个称为“终端点”的URL,用于接收来自发起方的请求。
  3. 发起方应用程序将请求发送到接收方的终端点URL,并携带所需的数据和参数。
  4. 接收方应用程序接收到请求后,可以执行相应的操作,例如处理数据、更新数据库、发送通知等。
  5. 接收方应用程序可以对处理结果进行响应,将响应发送回发起方应用程序,以便发起方可以得知请求的处理情况。

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

评论 (0)

取消