-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathqiniu_upload.go
112 lines (99 loc) · 2.94 KB
/
qiniu_upload.go
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
102
103
104
105
106
107
108
109
110
111
112
package main
import (
"bytes"
"fmt"
"os"
"os/exec"
"github.com/valyala/fasthttp"
)
const (
// JSONTemplate 模板
JSONTemplate = `{
"src_dir" : "%s",
"access_key": "%s",
"secret_key": "%s",
"bucket" : "%s",
"key_prefix": "%s/",
"skip_file_prefixes": ".git",
"skip_path_prefixes": ".git",
"skip_suffixes": ".DS_Store",
"overwrite": true,
"rescan_local": true
}`
// MarkdownSuccessTemplate success 模板
MarkdownSuccessTemplate = "产品文档已经更新,点击前往:[[%s]](%s)\n\n"
// MarkdownFailureTemplate failure 模板
MarkdownFailureTemplate = "产品文档更新失败:[%s][%s]\n\n"
)
// PathIsExist 判断目录/文件是否存在
func PathIsExist(path string) bool {
_, err := os.Stat(path)
return err == nil || os.IsExist(err)
}
// cmdRun exec command
func cmdRun(ctx *fasthttp.RequestCtx, path string, name string, args ...string) error {
printCmd(ctx, path, name, args...)
cmd := exec.Command(name, args...)
cmd.Dir = path
out, err := cmd.CombinedOutput()
if err != nil {
ctx.Logger().Printf("cmd.Run() failed with %s", err)
return err
}
ctx.Logger().Printf("combined out:\n%s", string(out))
return nil
}
// printCmd print command
func printCmd(ctx *fasthttp.RequestCtx, path string, name string, args ...string) {
var buffer bytes.Buffer
buffer.WriteString(name)
for _, v := range args {
buffer.WriteString(" ")
buffer.WriteString(v)
}
ctx.Logger().Printf(buffer.String())
ctx.Logger().Printf("cmd.Run() run in %s", path)
}
func upload(prdMaps map[string]string, projectSrc string, dingAccessToken string) {
fmt.Println("start upload...")
content := ""
for prdName := range prdMaps {
prdJSONPath := cfg.JSONPath + "/" + prdName + ".json"
// JSON文件不存在则新建
if !PathIsExist(prdJSONPath) {
prdPath := projectSrc + "/" + prdName
err := createJSON(prdName, prdJSONPath, prdPath)
if err != nil {
content += fmt.Sprintf(MarkdownFailureTemplate, prdName, "新建 JSON 失败\n"+err.Error())
continue
}
}
// 七牛上传
err := quploadRun(prdJSONPath)
if err == nil {
url := cfg.BaseURL + prdName + "/index.html"
content += fmt.Sprintf(MarkdownSuccessTemplate, prdName, url)
} else {
content += fmt.Sprintf(MarkdownFailureTemplate, prdName, "调用 Qupload 失败\n"+err.Error())
}
}
// 钉钉机器人
if dingAccessToken != "" {
SendDinghook(dingAccessToken, "prd-generate", content)
}
}
func createJSON(prdName string, prdJSONPath string, prdPath string) error {
out, err := os.Create(prdJSONPath)
defer out.Close()
if err != nil {
return err
}
out.WriteString(fmt.Sprintf(JSONTemplate, prdPath, cfg.AccessKey, cfg.SecretKey, cfg.QiniuBucket, prdName))
return nil
}
// quploadRun 执行 qshell 的 qupload 命令,将产品文档的文件同步到七牛,并发上传的协程数量为 4。
func quploadRun(prdJSONPath string) error {
cmd := exec.Command(cfg.QshellPath, "qupload", "4", prdJSONPath)
_, err := cmd.CombinedOutput()
return err
}