148 lines
3.1 KiB
Go
148 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
path = "/"
|
|
logDir = ".log/"
|
|
perm = 0770
|
|
)
|
|
|
|
var (
|
|
configs = []Config{}
|
|
configsLock = &sync.RWMutex{}
|
|
logFile *os.File
|
|
)
|
|
|
|
func init() {
|
|
go func() {
|
|
for {
|
|
os.Mkdir(logDir, perm)
|
|
file := ".log/" + time.Now().Format("2006-01-02") + ".txt"
|
|
|
|
var err error
|
|
logFile, err = os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, perm)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
log.SetOutput(logFile)
|
|
time.Sleep(time.Minute)
|
|
}
|
|
}()
|
|
|
|
go func() {
|
|
for {
|
|
data, err := ioutil.ReadFile("config.json")
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
configsLock.Lock()
|
|
if err := json.Unmarshal(data, &configs); err != nil {
|
|
log.Printf("Error unmarshalling configs: %v\n", err)
|
|
}
|
|
configsLock.Unlock()
|
|
time.Sleep(time.Second * 10)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func main() {
|
|
addr := flag.String("a", ":3001", "Address to listen on")
|
|
flag.Parse()
|
|
|
|
http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
|
|
// 解析Payload
|
|
reqBody, err := ioutil.ReadAll(r.Body)
|
|
if err != nil {
|
|
log.Printf("Error reading request body: %v\n", err)
|
|
w.Write([]byte(fmt.Sprintf("Read body error: %s", err)))
|
|
return
|
|
}
|
|
|
|
var payload GogsPayload
|
|
err = json.Unmarshal(reqBody, &payload)
|
|
if err != nil {
|
|
log.Printf("Error unmarshalling request body: %v\n", err)
|
|
w.Write([]byte(fmt.Sprintf("Unmarshal body error: %s", err)))
|
|
return
|
|
}
|
|
|
|
log.Printf("\nReceived: [Name] %s [Sender] %s", payload.Repository.FullName, payload.Sender.FullName)
|
|
|
|
// 寻找包含Signal的commit
|
|
for _, commit := range payload.Commits {
|
|
// 寻找配置
|
|
c := Config{
|
|
Path: "~/pro",
|
|
Script: "deploy.py",
|
|
Signal: "{D}",
|
|
}
|
|
for _, config := range configs {
|
|
if config.Repo == payload.Repository.FullName {
|
|
c.Repo = config.Repo
|
|
if config.Path != "" {
|
|
c.Path = config.Path
|
|
}
|
|
if config.Script != "" {
|
|
c.Script = config.Script
|
|
}
|
|
if config.Signal != "" {
|
|
c.Signal = config.Signal
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
// 包含部署信号
|
|
if strings.Contains(commit.Message, c.Signal) {
|
|
log.Printf("Commit: [SHA] %s [Message] %s", commit.ID, commit.Message)
|
|
log.Println("Ready to deploy")
|
|
|
|
if c.Repo == "" {
|
|
log.Println("Using default config")
|
|
}
|
|
|
|
projectPath := fmt.Sprintf(c.Path+"/%s/", payload.Repository.Name)
|
|
scriptPath := projectPath + c.Script
|
|
log.Printf("Running script: %s\n", scriptPath)
|
|
|
|
// 开始执行脚本
|
|
cmd := exec.Command(scriptPath)
|
|
cmd.Stdout = logFile
|
|
cmd.Stderr = logFile
|
|
cmd.Dir = projectPath
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
log.Printf("Error running deploy script: %v\n", err)
|
|
w.Write([]byte(fmt.Sprintf("Deploy script error: %s", err)))
|
|
}
|
|
|
|
return
|
|
}
|
|
}
|
|
|
|
log.Println("No deploy commit found")
|
|
w.Write([]byte("No deploy commit found. Skip."))
|
|
})
|
|
|
|
log.Println("Webhook service started at " + *addr)
|
|
|
|
err := http.ListenAndServe(*addr, nil)
|
|
if err != nil {
|
|
log.Println("Error starting webhook service: " + err.Error())
|
|
}
|
|
}
|