{"id":18993,"date":"2025-09-04T17:50:07","date_gmt":"2025-09-04T09:50:07","guid":{"rendered":"https:\/\/blog.ywdevops.cn\/?p=18993"},"modified":"2025-09-04T18:06:01","modified_gmt":"2025-09-04T10:06:01","slug":"golang-5","status":"publish","type":"post","link":"https:\/\/blog.ywdevops.cn\/index.php\/2025\/09\/04\/golang-5\/","title":{"rendered":"golang\u5b9e\u73b0\u6587\u4ef6\u53d1\u5e03\u811a\u672c"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u6b64\u811a\u672c\u53ef\u914d\u5408jenkins\u6216\u8005shell\u811a\u672c\u6765\u6267\u884c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u7406\uff1a\u5206\u4e3a\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u65b9\u5f0f\uff0c\u5ba2\u6237\u7aef\u8c03\u7528\u670d\u52a1\u7aef\u63a5\u53e3\u6765\u4e0a\u4f20\u6587\u4ef6\u5230\u670d\u52a1\u7aef\uff0c\u7136\u540e\u670d\u52a1\u7aef\u83b7\u53d6\u5230\u6587\u4ef6\u7684md5\u8fd4\u56de\u7ed9\u5ba2\u6237\u7aef\uff0c\u5ba2\u6237\u7aef\u4e5f\u8981\u83b7\u53d6\u672c\u5730\u7684md5\u6765\u8fdb\u884c\u6bd4\u5bf9\uff0c\u5982\u679c\u4e00\u6837\uff0c\u8bf4\u660e\u4f20\u9012\u8fc7\u7a0b\u6587\u4ef6\u6ca1\u635f\u5931\uff0c\u7136\u540e\u5ba2\u6237\u7aef\u518d\u6b21\u8c03\u7528\u63a5\u53e3\u628a\u6587\u4ef6\u7684\u540d\u5b57\u4f20\u9012\u8fc7\u53bb\uff0c\u670d\u52a1\u7aef\u83b7\u53d6\u5230\u540d\u5b57\u540e\uff0c\u628a\u8fd9\u4e2a\u540d\u5b57\u4f20\u9012\u7ed9\u670d\u52a1\u7aef\u4e0a\u9762\u7684shell\u811a\u672c\uff0c\u6765\u6267\u884c\u5907\u4efd\u548c\u53d1\u5e03\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">deployagent.go\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"bytes\"\n\t\"crypto\/md5\"\n\t\"encoding\/hex\"\n\t\"encoding\/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"io\/ioutil\"\n\t\"log\"\n\t\"mime\/multipart\"\n\t\"net\/http\"\n\t\"os\"\n\t\"path\/filepath\"\n\t\"strings\"\n\t\/\/ \"time\"\n)\n\ntype jtos struct {\n\tCode int    `json: code` \/\/\u7ed3\u6784\u4f53\u6807\u7b7e\u52a0\u548c\u4e0d\u52a0,\u5f71\u54cd\u4e0d\u5927\n\tData string `json: data`\n}\n\n\/\/ \u8bb0\u5f55\u65e5\u5fd7\u4fe1\u606f\nfunc loginfo(info string,value interface{}) {\n\tfile, err := os.OpenFile(\"output.log\", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)\n\tif err != nil {\n\t\tlog.Fatal(\"\u65e0\u6cd5\u6253\u5f00\u65e5\u5fd7\u6587\u4ef6:\", err)\n\t}\n\tdefer file.Close()\n\n\t\/\/ \u8bbe\u7f6e\u65e5\u5fd7\u8f93\u51fa\u5230\u6587\u4ef6\n\tlog.SetOutput(file)\n\n\t\/\/ \u73b0\u5728\u6240\u6709log\u6253\u5370\u90fd\u4f1a\u5199\u5165\u6587\u4ef6\n\tlog.Println(fmt.Sprintf(\"%s: %#v\", info, value))\n}\n\n\/\/ \u5c06json\u53cd\u5e8f\u5217\u5316\u5230\u7ed3\u6784\u4f53\u4e2d,\u4e3a\u4e86\u83b7\u53d6json\u4e2d\u7684data\u5185\u5bb9,\u4e5f\u5c31\u662f\u8fdc\u7a0b\u6587\u4ef6\u7684md5\u503c\nfunc jsonToStruct(j string) string {\n\tjts := jtos{}\n\terr := json.Unmarshal(&#91;]byte(j), &amp;jts)\n\tif err != nil {\n\t\tlog.Fatal(\"JSON\u53cd\u5e8f\u5217\u5316\u5230\u7ed3\u6784\u4f53\u62a5\u9519:\", err)\n\t}\n\treturn jts.Data\n\n}\nfunc md5Value(filename string) string {\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer f.Close()\n\thash := md5.New()\n\tif _, err := io.Copy(hash, f); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\thashBytes := hash.Sum(nil)\n\thashString := hex.EncodeToString(hashBytes)\n\treturn hashString\n\n}\nfunc dproject(filename string) {\n\tloginfo(\"\u6587\u4ef6\u540d\u4e3a:\", filename)\n\tclient := &amp;http.Client{}          \/\/\u521b\u5efa\u4e00\u4e2ahttp\u7684client\u5b9e\u4f8b,\u7528\u4e8e\u53d1\u9001http\u8bf7\u6c42\n\tbf := &amp;bytes.Buffer{}             \/\/\u521b\u5efaBuffer\u5b9e\u4f8b,\u7528\u4e8e\u5728\u5185\u5b58\u4e2d\u5b58\u50a8\u53d1\u9001\u7684nultipart\u6570\u636e\n\twriter := multipart.NewWriter(bf) \/\/\u521b\u5efawriter\u5b9e\u4f8b,\u5199\u5165\u5230buffer\u4e2d,writer\u540e\u7eed\u7528\u4e8e\u6784\u5efamultipart\/form-data\u8bf7\u6c42\u4f53\n\treq, err := http.NewRequest(\"POST\", \"http:\/\/update.abc.com\/upload\", nil)\n\tif err != nil {\n\t\tlog.Println(\"\u6784\u5efaRequest\u62a5\u9519:\", err)\n\t\tos.Exit(-1)\n\t}\n\treq.Header.Set(\"Content-Type\", writer.FormDataContentType())\n\tmd5value := md5Value(filename)\n\tloginfo(\"\u672c\u5730\u6587\u4ef6\u7684md5\u503c\u4e3a:\", md5value)\n\tfile, err := os.Open(filename)\n\tif err != nil {\n\t\tloginfo(\"\u6253\u5f00\u6587\u4ef6\u62a5\u9519\", err)\n\t\tos.Exit(-1)\n\t}\n\tdefer file.Close()\n\t\/\/\u521b\u5efa\u8868\u5355\u6587\u4ef6\u5b57\u6bb5,\u5b57\u6bb5\u540d\u4e3afilename,filepath.Base\u53ef\u4ee5\u622a\u53d6\u8def\u5f84\u6700\u540e\u7684\u6587\u4ef6\u540d\n\tpart, err := writer.CreateFormFile(\"filename\", filepath.Base(filename))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t\/\/\u5c06\u6587\u4ef6\u6570\u636e\u6d41\u590d\u5236\u5230\u8868\u5355\u5b57\u6bb5part\u4e2d\n\t_, err = io.Copy(part, file)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\terr = writer.Close()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t\/\/writer.WriteField(\"fieldName\",\"fieldValue\")  \/\/\u6dfb\u52a0\u5176\u4ed6\u5b57\u6bb5\n\treq.Body = io.NopCloser(bf)\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\tloginfo(\"\u8bf7\u6c42\u8fdc\u7a0b\u670d\u52a1\u5668\u53d1\u9001\u6587\u4ef6\u62a5\u9519:\", err)\n\t\tos.Exit(-1)\n\t}\n\tdefer resp.Body.Close()\n\tif resp.StatusCode == 200 {\n\t\tbodys, err := ioutil.ReadAll(resp.Body)\n\t\tif err != nil {\n\t\t\tloginfo(\"\u8bfb\u53d6\u54cd\u5e94\u4f53\u62a5\u9519\", err)\n\t\t\tos.Exit(-1)\n\t\t}\n\t\tr := jsonToStruct(string(bodys))\n\t\t\/\/\u53d1\u9001\u4e4b\u524d\u7684\u6587\u4ef6\u548c\u53d1\u9001\u5230\u8fdc\u7a0b\u673a\u5668\u6587\u4ef6\u7684md5\u503c\u76f8\u540c,\u8bf4\u660e\u6587\u4ef6\u4f20\u8f93\u6b63\u5e38\n\t\tif md5value == r {\n\t\t\tf1 := filepath.Ext(filepath.Base(filename))                                    \/\/\u83b7\u53d6\u62d3\u5c55\u540d\n\t\t\tdata := fmt.Sprintf(\"fname=%s\", strings.Split(filepath.Base(filename), f1)&#91;0]) \/\/\u5207\u5272\u62d3\u5c55\u540d\u524d\u9762\u90e8\u5206\uff0c\u5305\u62ec.\n\t\t\tloginfo(\"\u4f20\u9012\u5230\u670d\u52a1\u7aef\u7684\u53c2\u6570\u6587\u4ef6\u540d\u4e3a:\", data)\n\t\t\trequestBody := bytes.NewBuffer(&#91;]byte(data))\n\t\t\treqq, err := http.NewRequest(\"POST\", \"http:\/\/update.abc.com\/fparam\", requestBody)\n\t\t\tif err != nil {\n\t\t\t\tloginfo(\"\u4f20\u53c2\u5230\u8fdc\u7a0b\u670d\u52a1\u5668\u62a5\u9519\", err)\n\t\t\t\tos.Exit(-1)\n\t\t\t}\n\t\t\treqq.Header.Set(\"Content-Type\", \"application\/x-www-form-urlencoded\")\n\t\t\tresps, err := client.Do(reqq)\n\t\t\tif err != nil {\n\t\t\t\tloginfo(\"\u8bf7\u6c42\u8fdc\u7a0b\u670d\u52a1\u5668\u5e76\u4f20\u53c2\u62a5\u9519\", err)\n\t\t\t\tos.Exit(-1)\n\t\t\t}\n\t\t\tdefer reqq.Body.Close()\n\t\t\tbodyss, err := ioutil.ReadAll(resps.Body)\n\t\t\tif err != nil {\n\t\t\t\tloginfo(\"\u4f20\u9012\u53c2\u6570\u540e\u8bfb\u53d6\u54cd\u5e94\u4f53\u62a5\u9519\", err)\n\t\t\t\tos.Exit(-1)\n\t\t\t}\n\t\t\tloginfo(\"\u4f20\u9012\u53c2\u6570\u540e\u8bfb\u53d6\u7684\u54cd\u5e94\u4f53\u5185\u5bb9\u4e3a\", string(bodyss))\n\t\t} else {\n\t\t\tloginfo(\"\u8fdc\u7a0b\u6587\u4ef6\u7684md5\u503c\u548c\u672c\u5730\u7684md5\u503c\u4e0d\u4e00\u6837\uff0c\u8bf7\u91cd\u65b0\u6267\u884c\u4e0a\u4f20...\", \"\")\n\t\t\tos.Exit(-1)\n\t\t}\n\t} else {\n\t\tloginfo(\"\u8fde\u63a5\u8fdc\u7a0b\u670d\u52a1\u7aef\u5f02\u5e38:\", resp)\n\t}\n}\nfunc main() {\n\ts := os.Args&#91;1:]\n\tfor _, v := range s {\n\t\tdproject(v)\n\t}\n\t\/\/ time.Sleep(time.Second * 10)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u670d\u52a1\u7aef\u811a\u672c\u5185\u5bb9\u4e3a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"crypto\/md5\"\n\t\"encoding\/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com\/gin-gonic\/gin\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"os\/exec\"\n\t\"strings\"\n)\n\n\/\/ \u83b7\u53d6\u6587\u4ef6\u7684md5\u503c\nfunc md5Value(filename string) string {\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\tloginfo(\"\u83b7\u53d6\u6587\u4ef6md5\u503c\u65f6\u6253\u5f00\u6587\u4ef6\u62a5\u9519\", err)\n\t\tos.Exit(-1)\n\t}\n\tdefer f.Close()\n\thash := md5.New()\n\tif _, err := io.Copy(hash, f); err != nil {\n\t\tloginfo(\"\u6267\u884cio.copy\u51fa\u9519\", err)\n\t\tos.Exit(-1)\n\t}\n\thashBytes := hash.Sum(nil)\n\thashString := hex.EncodeToString(hashBytes)\n\treturn hashString\n}\n\nfunc nginx(filename string, hostNode ...string) (string, error) {\n\t\/\/hostNode\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5207\u7247\n\tstr := \"\"\n\tfor _, node := range hostNode {\n\t\tout, err := execSSH(node, fmt.Sprintf(\"\/data\/deploy\/%s\", filename), \"\/data\/deploy\", filename)\n\t\tif err != nil {\n\t\t\treturn out, err\n\t\t}\n\t\tstr = out\n\t}\n\treturn str, nil\n}\n\n\/\/ \u901a\u8fc7ssh\u65b9\u5f0f\nfunc execSSH(hostname, srcpath, destpath, filename string) (string, error) {\n\tstr := \"\"\n\t\/\/\u6587\u4ef6\u901a\u8fc7\/upload\u4e0a\u4f20\u5230\u540e\u9ed8\u8ba4\u5c31\u662f\u5230\u8fbenginx_45\u7684,\u56e0\u6b64\u5982\u679c\u8981\u5c06\u6587\u4ef6\u53d1\u5e03\u5230nginx_45(\u672c\u673a),\u5c31\u4e0d\u9700\u8981\u4f7f\u7528scp\u548cssh -t\u4e86,\u76f4\u63a5\u5728\u672c\u673a\u6267\u884c\u5373\u53ef\n\tif strings.TrimSpace(hostname) == \"192.168.10.45\" {\n\t\tbackSlice := &#91;]string{\"\/data\/deploy\/scripts\/backup.sh\"}\n\t\tdeploySlice := &#91;]string{\"\/data\/deploy\/scripts\/deploy.sh\"}\n\t\tmapp := make(map&#91;int]&#91;]string)\n\t\tmapp&#91;0] = backSlice\n\t\tmapp&#91;1] = deploySlice\n\t\tfor _, v := range mapp {\n\t\t\tloginfo(\"\u5f00\u59cb\u6267\u884cnginx_45\u5907\u4efd\u4e0e\u53d1\u5e03\u811a\u672c:\", v)\n\t\t\tloginfo(\"\u4f20\u9012\u8fc7\u6765\u7684\u6587\u4ef6\u540d\u4e3a\", filename)\n\t\t\tcmd := exec.Command(\"bash\", v&#91;0], filename)\n\t\t\tout, err := cmd.Output()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Sprintf(\"\u6267\u884cnginx_45\u8282\u70b9\u62a5\u9519:%s\", string(out)), err\n\t\t\t}\n\t\t\tstr = string(out)\n\t\t}\n\t\treturn str, nil\n\t} else if strings.TrimSpace(hostname) == \"192.168.10.44\" {\n\t\tloginfo(\"\u5f00\u59cb\u6267\u884cnginx_44\u670d\u52a1\u4e0a\u7684\u5907\u4efd\u4e0e\u53d1\u5e03\u811a\u672c......\",\"\")\n\t\t\/\/\tscpSlice := &#91;]string{fmt.Sprintf(\"%s\", srcpath), fmt.Sprintf(\"cyyzops@%s:%s\", hostname, destpath)}\n\t\tbackSlice := &#91;]string{fmt.Sprintf(\"root@%s\", hostname), fmt.Sprintf(\"\/data\/deploy\/scripts\/backup.sh %s\", filename)}\n\t\tdeploySlice := &#91;]string{fmt.Sprintf(\"root@%s\", hostname), fmt.Sprintf(\"\/data\/deploy\/scripts\/deploy.sh %s\", filename)}\n\t\tmapp := make(map&#91;int]&#91;]string)\n\t\tmapp&#91;0] = backSlice\n\t\tmapp&#91;1] = deploySlice\n\t\tfor _, v := range mapp {\n\t\t\tfmt.Println(\"\u8981\u6267\u884c\u7684\u8fdc\u7a0b\u811a\u672c\u4e3a:\", v)\n\t\t\tcmd := exec.Command(\"ssh\", v...)\n\t\t\tout, err := cmd.Output()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Sprintf(\"\u6267\u884cnginx_44\u8282\u70b9\u62a5\u9519:%s\", string(out)), err\n\t\t\t}\n\t\t\tstr = string(out)\n\t\t}\n\t\treturn str, nil\n\t} else {\n\t\treturn str, nil\n\t}\n\treturn str, nil\n}\n\n\/\/ \u901a\u8fc7ansible\u65b9\u5f0f,\u8ddf\u4e0a\u9762\u7684\u901a\u8fc7scp\u548cssh\u65b9\u5f0f\u4e00\u6837,\u6839\u636e\u60c5\u51b5\u9009\u62e9\n\/\/\n\/\/\tfunc execAnsible(hostname, srcpath, destpath string) error {\n\/\/\t\tcmdSlice := &#91;]&#91;]string{\n\/\/\t\t\t{fmt.Sprintf(\"%s\", hostname), \"-m\", \"copy\", \"-a\", fmt.Sprintf(\"src=%s dest=%s\", srcpath, destpath)},\n\/\/\t\t\t{fmt.Sprintf(\"%s\", hostname), \"-m\", \"shell\", \"-a\", \"bash \/data\/script\/backup.sh\"},\n\/\/\t\t\t{fmt.Sprintf(\"%s\", hostname), \"-m\", \"shell\", \"-a\", \"bash \/data\/script\/deploy.sh\"},\n\/\/\t\t}\n\/\/\t\tfor _, v := range cmdSlice {\n\/\/\t\t\t\/\/v\u662f\u4e00\u4e2a\u4e00\u7ef4\u5207\u7247,...\u53ef\u4ee5\u5c06\u5207\u7247\u4e2d\u5143\u7d20\u62c6\u51fa\u6765\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9Command,Command\u81f3\u5c11\u9700\u8981\u4e24\u4e2a\u53c2\u6570\n\/\/\t\t\tcmd := exec.Command(\"ansible\", v...)\n\/\/\t\t\t_, err := cmd.CombinedOutput()\n\/\/\t\t\tif err != nil {\n\/\/\t\t\t\tfmt.Println(\"errrs:\", err)\n\/\/\t\t\t\treturn err\n\/\/\t\t\t}\n\/\/\t\t\t\/\/\t\tcontinue\n\/\/\t\t}\n\/\/\t\treturn nil\n\/\/\t}\nfunc checkFilename(filename string) (string, error) {\n\tconst (\n\t\tnginx_44 = \"192.168.10.44\"\n\t\tnginx_45 = \"192.168.10.45\"\n\t\tnginx_38 = \"192.168.10.38\"\n\t\tnginx_39 = \"192.168.10.39\"\n\t)\n\tif filename == \"sign-sys-front-esignsys-new\" {\n\t\ts, err := nginx(filename, nginx_44, nginx_45)\n\t\tif err != nil {\n\t\t\treturn s, err\n\t\t}\n\t\treturn s, nil\n\t} else if filename == \"sign-sys-front-admin-esignsys\" {\n\t\ts, err := nginx(filename, nginx_44, nginx_45)\n\t\tif err != nil {\n\t\t\treturn s, err\n\t\t}\n\t\treturn s, nil\n\t} else if filename == \"sign-core-system-0.1.1-SNAPSHOTESIGNSYS\" {\n\t\ts, err := nginx(filename, nginx_45)\n\t\tif err != nil {\n\t\t\treturn s, err\n\t\t}\n\t\treturn s, nil\n\t} else {\n\t\treturn \"\", errors.New(fmt.Sprintf(\"\u4e0d\u5b58\u5728\u8fd9\u4e2a\u6587\u4ef6: %s\", filename))\n\t}\n}\n\n\/\/ \u8bb0\u5f55\u65e5\u5fd7\u4fe1\u606f\nfunc loginfo(info string,value interface{}) {\n        file, err := os.OpenFile(\"output.log\", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)\n        if err != nil {\n                log.Fatal(\"\u65e0\u6cd5\u6253\u5f00\u65e5\u5fd7\u6587\u4ef6:\", err)\n        }\n        defer file.Close()\n\n        \/\/ \u8bbe\u7f6e\u65e5\u5fd7\u8f93\u51fa\u5230\u6587\u4ef6\n        log.SetOutput(file)\n\n        \/\/ \u73b0\u5728\u6240\u6709log\u6253\u5370\u90fd\u4f1a\u5199\u5165\u6587\u4ef6\n        log.Println(fmt.Sprintf(\"%s: %#v\", info, value))\n}\n\nfunc main() {\n\trouter := gin.Default()\n\trouter.POST(\"\/upload\", func(c *gin.Context) {\n\t\t_, file, err := c.Request.FormFile(\"filename\")\n\t\tif err != nil {\n\t\t\tloginfo(\"\u4e0a\u4f20\u6587\u4ef6\u63a5\u53e3\u51fa\u73b0\u9519\u8bef\", err)\n\t\t\treturn\n\t\t}\n\t\terr = c.SaveUploadedFile(file, \"\/data\/deploy\/\"+file.Filename)\n\t\tif err != nil {\n\t\t\tloginfo(\"\u6587\u4ef6\u4fdd\u5b58\u5230\/data\/deploy\u76ee\u5f55\u51fa\u73b0\u9519\u8bef\", err)\n\t\t\treturn\n\t\t}\n\t\t\/\/\u83b7\u53d6md5\u503c\u540e\u8fd4\u56de\u7ed9\u5ba2\u6237\u7aef\u505a\u5bf9\u6bd4\n\t\tmd5v := md5Value(fmt.Sprintf(\"\/data\/deploy\/%s\", file.Filename))\n\t\tc.JSON(200, gin.H{\n\t\t\t\"code\": 200,\n\t\t\t\"data\": md5v,\n\t\t})\n\t\tfmt.Println(\"remote machine md5:\", md5v)\n\t})\n\t\/\/\u5ba2\u6237\u7aef\u4f20\u9012\u6587\u4ef6\u540d\u8fc7\u6765,\u6839\u636e\u6587\u4ef6\u540d\u5728\u670d\u52a1\u7aef\u505a\u6587\u4ef6copy\u548c\u5907\u4efd\u53d1\u5e03\u64cd\u4f5c\n\trouter.POST(\"\/fparam\", func(c *gin.Context) {\n\t\tfilename := c.PostForm(\"fname\")\n\t\tout, err := checkFilename(filename)\n\t\tif err != nil {\n\t\t\tc.JSON(200, gin.H{\"code\": 101, \"data\": out, \"error\": fmt.Sprintf(\"%s\",err)})\n\t\t} else {\n\t\t\tc.JSON(200, gin.H{\n\t\t\t\t\"code\": 200, \"data\": out, \"error\": err})\n\t\t}\n\t})\n\trouter.Run(\":8888\")\n}<\/code><\/pre>\n\n\n\n<p class=\"has-luminous-vivid-amber-background-color has-background wp-block-paragraph\">\u6ce8\uff1a\u8981\u6839\u636e\u5b9e\u9645\u8bf7\u6c42\u5bf9\u811a\u672c\u8fdb\u884c\u4fee\u6539<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">backup.sh\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n: '\n  @func: \u5907\u4efdjar\u5305,\u5982\u679cbackup\u4e2d\u6709\u4eca\u5929\u5907\u4efd\u7684,\u5c31\u4e0d\u518d\u5907\u4efd(\u65b9\u4fbf\u56de\u6eda),\u5982\u679c\u6ca1\u6709\u5c31\u5907\u4efd\n  @datetime: 20240929\n  @author: gongguan\n'\nset -e\nset -u\ncd $(dirname $0)\ndateT=$(date \"+%Y%m%d-%H:%M:%S\")\nbackup(){\n    srcpath=$1\n    #\u622a\u53d6\u65f6\u95f4\u7684\u5e74\u6708\u65e5\u90e8\u5206\n    ymd=$(echo ${dateT} | awk -F \"-\" '{print $1}')\n    filename=$2\n    backupdir=\/data\/deploy\/backup\n    #\u5224\u65ad\/data\/deploy\/backup\u8def\u5f84\u4e0b\u662f\u5426\u6709\u9664\u4e86\u5f53\u524d\u5907\u4efd\u5916\u7684\u5176\u4ed6\u65f6\u95f4\u7684\u6587\u4ef6\uff0c\u5982\u679c\u6709\uff0c\u5220\u9664\u6389\n    if find ${backupdir} -type f -name \"${filename}*\" | grep -q .;then\n           for i in $(ls ${backupdir}\/${filename}*)\n           do\n                bd=$(echo ${i} | awk -F \"-\" '{print $6}')\n                if &#91;&#91; \"${bd}\" != \"${ymd}\" ]];then\n                       rm -rf ${i}\n                fi\n           done\n    fi\n    : '\n      \u5982\u679c\u5907\u4efd\u76ee\u5f55\u4e0b\u627e\u4e0d\u5230\u6587\u4ef6\uff0c\u8bf4\u660e\u6ca1\u5907\u4efd\uff0c\u90a3\u4e48\u5c31\u6267\u884c\u5907\u4efd\uff0c\u5426\u5219\u4e0d\u6267\u884c\n      \u8fd9\u6837\u53ef\u4ee5\u4fdd\u8bc1\u5f53\u5929\u5982\u679c\u53d1\u7248\u672c\u591a\u6b21\u4f46\u662f\u53ea\u4f1a\u5907\u4efd\u4e00\u6b21\n    '\n    if ! find ${backupdir} -type f -name \"${filename}*\" |  grep -q .;then\n        if &#91; $filename == \"sign-sys-front-admin-esignsys\" ] || &#91; $filename == \"sign-sys-front-esignsys-new\" ];then\n    \t    tar --force-local -zcf  ${backupdir}\/$2-${dateT}.tgz --directory=${srcpath} .\n        elif &#91; $filename == \"sign-core-system-0.1.1-SNAPSHOTESIGNSYS\" ];then\n            filePath=\/data\/java\/sign-sys-service_esignsys_bjsfj\n            cp $filePath\/sign-core-system-0.1.1-SNAPSHOT.jar ${backupdir}\/sign-core-system-0.1.1-SNAPSHOTESIGNSYS-${dateT}.jar\n            sleep 1\n            rm -rf ${filePath}\/sign-core-system-0.1.1-SNAPSHOT.jar\n        fi\n    fi\n}\ncase $1 in \n\t\"sign-sys-front-esignsys-new\")\n        filePath=\/data\/nginx_proxy\/html\/sign-sys_html\n\tbackup ${filePath} sign-sys-front-esignsys-new\n\t;;\n        \"sign-sys-front-admin-esignsys\")\n        filePath=\/data\/nginx_proxy\/html\/sign-sys_html\n\tbackup ${filePath} sign-sys-front-admin-esignsys\n\t;;\n        \"sign-core-system-0.1.1-SNAPSHOTESIGNSYS\")\n        filePath=\/data\/java\/sign-sys-service_esignsys_bjsfj\n        backup ${filePath} sign-core-system-0.1.1-SNAPSHOTESIGNSYS\n        ;;\n        *)\n\techo \"ERROR: \u5907\u4efd\u811a\u672c\u9700\u8981\u8f93\u5165\u6b63\u786e\u7684\u53c2\u6570!!!!\"\nesac<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6b64\u811a\u672c\u53ef\u914d\u5408jenkins\u6216\u8005shell\u811a\u672c\u6765\u6267\u884c \u539f\u7406\uff1a\u5206\u4e3a\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u65b9\u5f0f\uff0c\u5ba2\u6237\u7aef\u8c03\u7528\u670d\u52a1\u7aef\u63a5\u53e3\u6765\u4e0a\u4f20\u6587 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":18994,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[111],"tags":[],"class_list":["post-18993","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-go"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"_links":{"self":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts\/18993","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/comments?post=18993"}],"version-history":[{"count":5,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts\/18993\/revisions"}],"predecessor-version":[{"id":18999,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts\/18993\/revisions\/18999"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/media\/18994"}],"wp:attachment":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/media?parent=18993"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/categories?post=18993"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/tags?post=18993"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}