go, 监控git是否更新, 并且自动构建

使用方式 ./command -p [git 目录] -s [每s秒查看一次git版本变化,默认60]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package main
 
import (
    "bytes"
    "flag"
    "fmt"
    "log"
    "os"
    "os/exec"
    "strings"
    "sync"
    "time"
)
 
var gitVersion = ""
var wg sync.WaitGroup
var path string
var sleepTime int
 
func ExecCommand(command string, params []string, dir string) string{
    cmd := exec.Command(command, params...)
 
    if dir != "" {
        cmd.Dir = dir
    }
 
    var out bytes.Buffer
    cmd.Stdout = &out
    err := cmd.Run()
    if err != nil {
        log.Fatal("error   ", err)
    }
 
    return out.String()
}
 
func InitArgs() {
    flag.StringVar(&path, "p", "", "git路径")
    flag.IntVar(&sleepTime, "s", 60, "每多少秒检查一次git version")
    flag.Parse()
}
 
func dirExists(p string) bool{
    fi, err := os.Stat(p)
    if err != nil {
        return false
    }
 
    return fi.IsDir()
}
 
func getVerson(vChan chan <- string){
    for {
        ExecCommand("git", []string{"pull"}, path)
        out := ExecCommand("git", []string{ "log", "-1"}, path)
        lines := strings.Split(out, "\n")
        vChan <- strings.Split(lines[0], " ")[1]
        time.Sleep( time.Second * time.Duration(sleepTime) )
    }
 
    wg.Done()
}
 
 
func do(vChan <- chan string){
    for{
        _v := <- vChan
        if _v != gitVersion {
            fmt.Println("获取到新版本,开始更新...")
            gitVersion = _v
 
            res2 := ExecCommand("yarn", []string{}, path)
            res3 := ExecCommand("yarn", []string{"build"}, path)
            fmt.Println("已经构建完成:", res2, res3)
 
            fmt.Println("当前版本为:"+gitVersion)
        }
    }
 
}
 
func main() {
    InitArgs()
 
    if path == "" {
        log.Fatal("路径参数不能为空")
    }
 
    if !dirExists(path)  {
        log.Fatal("目录不存在:" + path)
    }
 
    fmt.Println("开始监控目录:",path)
 
    vChan := make(chan string, 1)
 
    wg.Add(2)
    go getVerson(vChan)
    go do(vChan)
    wg.Wait()
}
此条目发表在go分类目录,贴了标签。将固定链接加入收藏夹。