git-hook/git_hook.go

114 lines
2.7 KiB
Go

// Package git_hook...
//
// Description : git_hook...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-10-13 11:11 上午
package main
import (
"encoding/json"
"time"
"git.zhangdeman.cn/zhangdeman/gopkg/cmd"
"git.zhangdeman.cn/zhangdeman/git-hook/define"
"git.zhangdeman.cn/zhangdeman/gopkg/git_hook"
"git.zhangdeman.cn/zhangdeman/gopkg/util"
"github.com/gin-gonic/gin"
)
var (
// CLIParamConfig ...
CLIParamConfig map[string]string
// TaskList 任务列表
TaskList []define.Task
)
func main() {
parseCLIParam()
go func() {
// 初始化配置
byteData, err := util.ReadFileContent(CLIParamConfig["config_path"] + "/task.json")
if nil != err {
panic("任务配置文件读取失败 : " + err.Error())
}
if err = json.Unmarshal(byteData, &TaskList); nil != err {
panic("任务配置文件解析失败 : " + err.Error())
}
// 每分钟自动更新一次任务
time.Sleep(60 * time.Second)
}()
router := gin.Default()
// 注册回调路由
_ = git_hook.RegisterGitHookRouter(router, func(ctx *gin.Context, hookData *git_hook.HookData) *git_hook.ResponseData {
// 检测仓库是否建立了相关任务
taskConfig, exist := getTaskConfig(hookData.Repository.Name)
if !exist {
// 没有配置相关任务
return &git_hook.ResponseData{
Code: 0,
Message: "成功接收到web hook通知, " + hookData.Repository.Name + " 没有配置任何任务, 不做处理",
Data: hookData,
}
}
if hookData.Ref != "refs/heads/master" {
// 不是master分支, 不触发相应逻辑
return &git_hook.ResponseData{
Code: 0,
Message: "成功接收到web hook通知, 非master分支,不做任何处理",
Data: hookData,
}
}
taskRunResult := cmd.Execute(cmd.Config{
WorkDir: taskConfig.WorkDir,
Command: taskConfig.Command,
Script: taskConfig.Script,
ParameterList: taskConfig.Parameter,
})
if nil != taskRunResult.Err {
return &git_hook.ResponseData{
Code: -1,
Message: "task任务执行失败 : " + taskRunResult.Err.Error(),
Data: gin.H{
"command": taskRunResult.ExecuteCommand,
"output": string(taskRunResult.Output),
},
}
}
return &git_hook.ResponseData{
Code: 0,
Message: "成功接收到web hook通知",
Data: gin.H{
"command": taskRunResult.ExecuteCommand,
"output": string(taskRunResult.Output),
},
}
})
_ = router.Run(":12590")
}
func parseCLIParam() {
paramList := []string{"config_path"}
CLIParamConfig = util.ParseCLIParameter(paramList)
}
func getTaskConfig(taskFlag string) (define.Task, bool) {
for _, item := range TaskList {
if item.Flag == taskFlag {
return item, true
}
}
return define.Task{}, false
}