最近写了一个小工具, 用来接收github webhook消息, 以在服务器上自动执行脚本

gaopengfei123123/hook

github hook server

一个用来接收webhook的server

环境

golang v1.11+ (因为用到了go mod)

安装

执行:

1
go get -u github.com/gaopengfei123123/hook

创建文件 main.go

1
2
3
4
5
6
7
8
9
package main

import (
    "github.com/gaopengfei123123/hook"
)

func main() {
    hook.Execute()
}

执行命令

1
go build -o app main.go

app 这个二进制文件就是本体了, 放到合适的地方, 执行:

1
./app start -d

后台启动, app 同目录下会创建 scripts, logs 两个目录, 和一个 hook.pid 保存pid

检测是否启动:

1
2
[root@xxx]# curl localhost:8080/ping
{"message":"pong v5"}

说明服务已经启动成功, 服务地址为0.0.0.0:8080

接口

  • 0.0.0.0:8080/ping 检测接口
  • 0.0.0.0:8080/push 接受github webhook请求, 根据 Repository.Name 去判断执行什么脚本

可用指令

1
2
3
4
reload      重新加载日志, 以及平滑重启
start       启动命令, -d 后台运行
stop        终止命令
version     程序版本

目录功能:

  • logs 存放请求日志
  • scripts 存放hook脚本, 当有对应库名的请求进来, 将执行配置好的脚本
  • hook.pid 存放进程pid

配置文件

1
2
3
4
5
6
7
8
9
{
    "github_hook": {        // 以请求消息中的 repository.name 字段来做key
        "secret": "xxxxxx", // 如果设置了secret则会用这个进行验证, 为空则不验证
        "script_path": "",  // 脚本所在绝对目录, 为空就是当前的script目录
        "event": {
            "push": "test"  // 推送事件执行的脚本
        }
    }
}

特性

  • 一键初始化
  • 平滑重启, 信号通信
  • 支持secret验证
  • 异步执行脚本
  • 规避重放
  • 脚本传递参数(TODO)
  • 事件钩子(TODO)

依赖组件

github地址

gaopengfei123123/hook