diff --git a/.gitignore b/.gitignore index 0f21a5e..e6ae708 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -config.json -gogs-webhook -deploy.py +/config.json +/gogs-webhook +/deploy.py .log \ No newline at end of file diff --git a/README.md b/README.md index bf0b067..bb23abc 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ - 在仓库的webhook页面正确配置 - 部署机器上项目文件夹名与Git项目名一致 - 部署过程需要有相应权限(不可sudo) -- 部署时,需要在commit message中包含`[DEPLOY]`字符标记(标记可以通过`-s`参数自定义) +- 部署时,需要在commit message中包含`{D}`字符(可以通过`config.json`参数自定义字符) - 可能需要手动切换到对应的git分支 ## 配置 @@ -13,10 +13,14 @@ ```json [ { + // repo名称:git用户名/项目名,不可为空 "repo": "lollipopkit/example", + // 项目的父文件夹路径,默认“~/pro” "path": "/home/lolli/pro", + // 脚本文件名,默认“deploy.py” "script": "deploy.py", - "signal": "[DEPLOY]" + // 信号:commit messgae里包含信号,则执行脚本,默认“{D}” + "signal": "{D}" } ] ``` @@ -26,12 +30,4 @@ Usage of gogs-webhook: -a string Address to listen on (default ":3001") - -d string - Name of deploy script (default "deploy.py") - -i string - Interpreter to use for deploy script (default "python3") - -p string - Path to projects (default "~/pro/") - -s string - Signal for deploy (default "[DEPLOY]") ``` \ No newline at end of file diff --git a/example/config.json b/example/config.json new file mode 100644 index 0000000..c9a7ab8 --- /dev/null +++ b/example/config.json @@ -0,0 +1,6 @@ +[ + { + "repo": "lollipopkit/gogs-webhook", + "signal": "[D]" + } +] \ No newline at end of file diff --git a/example/deploy.py b/example/deploy.py index 13b5fc4..6ebf73f 100644 --- a/example/deploy.py +++ b/example/deploy.py @@ -1,7 +1,8 @@ +#!/usr/bin/env python3 import os -APP_NAME = 'free_novel_web_go' -SYSTEMD_NAME = 'freenovel.service' +APP_NAME = 'gogs-webhook' +SYSTEMD_NAME = 'gogs-wh-deploy' def pull(): @@ -9,7 +10,7 @@ def pull(): code = os.system('git fetch --all') if code != 0: return False - code = os.system('git reset --hard origin/api') + code = os.system('git reset --hard') if code != 0: return False code = os.system('git pull') @@ -30,6 +31,7 @@ def kill(): pid = splited[0] if not pid: pid = splited[1] + print(f'killing pid {pid} ...') exitcode = os.system('kill ' + pid) return exitcode == 0 @@ -37,7 +39,7 @@ def kill(): def build(): print('[building...]') - code = os.system('go build') + code = os.system('/usr/local/go/bin/go build') return code == 0 diff --git a/example/systemd.service b/example/systemd.service index b6c5a3b..cd747fe 100644 --- a/example/systemd.service +++ b/example/systemd.service @@ -4,7 +4,6 @@ After=network.target [Service] Type=simple -User=lolli Restart=on-failure RestartSec=5s ExecStart=/home/lolli/pro/xxx/xxx diff --git a/main.go b/main.go index 2d7e152..4d2d845 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,7 @@ const ( var ( configs = []Config{} configsLock = &sync.RWMutex{} - logFile *os.File + logFile *os.File ) func init() { @@ -82,15 +82,26 @@ func main() { log.Printf("\nReceived: [Name] %s [Sender] %s", payload.Repository.FullName, payload.Sender.FullName) - // 寻找配置 + // 寻找包含Signal的commit for _, commit := range payload.Commits { - c := Config{} - + // 寻找配置 + c := Config{ + Path: "~/pro", + Script: "deploy.py", + Signal: "{D}", + } for _, config := range configs { if config.Repo == payload.Repository.FullName { - c.Path = config.Path - c.Script = config.Script - c.Signal = config.Signal + 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 } } @@ -100,6 +111,10 @@ func main() { 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) diff --git a/model.go b/model.go index 6fe96ed..47edc59 100644 --- a/model.go +++ b/model.go @@ -2,13 +2,13 @@ package main type Config struct { // repo名称:git用户名/项目名 - Repo string `json:"repo" default:""` + Repo string `json:"repo"` // 项目的父文件夹路径 - Path string `json:"path" default:"~/pro"` + Path string `json:"path"` // 脚本文件名 - Script string `json:"script" default:"deploy.py"` + Script string `json:"script"` // 信号:commit messgae里包含信号,则执行脚本 - Signal string `json:"signal" default:"[DEPLOY]"` + Signal string `json:"signal"` } type GogsPayload struct {