Webhooks allow you to build or set up integrations
在日常开发过程中,你肯定会有这样的困扰:有一些流程化的工作,甚至是一些很小的改变,都会经验:开发 - 测试 - 提交 - 打包 - 上传 - 编译 - 公布等过程,频繁的反复,大大地升高了咱们开发的乐趣!
为此,Git 通过提供 webhooks 来使咱们具备可集成的能力。艰深来说,就是 Github 针对你的一系列流动,提供了一些“钩子”,当你进行某项流动时(比方:新建一个 tag),Github 会被动向你的服务器发送一个申请,告诉你指定事件正在被触发,通过对申请进行捕捉和剖析,你能够通过脚本等形式在服务器上执行后续步骤。
关键点:
- 配置
web hooks.Payload URL
时,留神 Github 目前不反对转发服务(Redirect),如果你在服务器通过 nginx 配置了转发,且配置 Payload URL 为转发域名,则 Github 会返回 502,解决方案:裸露host:port/path
- 留神 Github 对 secret 的加密形式和比照验证
Config webhooks
首先,咱们须要在 Github 上进行设置:服务器地址,参数类型,secret,触发事件以及是否激活
- 设置 Git 须要监听哪些事件来触发 webhooks
- 在服务器内增加路由,用来承受和解决 webhooks 负载(申请)
留神:webhooks Payload URL 暂不反对域名转发,能够通过 host:port 来代替
Secret
相似 token
, 用来通知服务器以后申请来自于 Github
当设置 secret
之后,POST 申请会带上 X-Hub-Signature
和 X-Hub-Signature-256
的申请头
举荐应用 X-Hub-Signature-256
以进步安全性
Run a server
在服务器上,须要裸露给 GitHub 一个 POST 接口,它次要干三件事:
- 承受 Github 的申请,获取申请数据
- 验证 secret 和仓库信息
- 执行脚本
Talk is cheap, show me the code!
// 要害代码// common.ts, see https://docs.github.com/cn/developers/webhooks-and-events/securing-your-webhooks for detailsexport function verifyToken(bodyString: string, secret: string, signature: string) { // 编码 secret const verifyToken = HmacSHA256(bodyString, secret).toString() return signature === `sha256=${verifyToken}`}// hooks.control.ts@Controller('/hooks')export class HooksController { constructor(private hooksService: HooksService) {} @Post() async reciveHooks(@Body() data: any, @Headers() h: any ) { const signature = h['x-hub-signature-256'] || h['X-Hub-Signature-256'] // 验证通过 if (verifyToken(JSON.stringify(data), hooksSecret, signature)) { const { repository } = data // 如果是指定仓库则执行响应的打包命令 if (repository && repository.name === 'cms-apis') { try { // 执行后续步骤 this.hooksService.build('release') return this.hooksService.successed() } catch (error) { Logger.error(error) return this.hooksService.failed() } } } return this.hooksService.failed('Verify Failed!') }}
Test webhooks
所有准备就绪之后,咱们还须要验证本人搭建的流程是否可行,能够间接在 Github 上进行查看,咱们能够查看 Github 发动申请的具体信息(Headers 和 body)以及服务器返回后果
????Solo with code!????