package main import ( "flag" "fmt" "io" "io/ioutil" "os" "os/exec" "path" ) type App struct { DevImage string Image string Path string CmdFile string Doc string Env string } var serviceMap = map[string]App{ "account": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/account:3.1", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/account:2.1", Path: "D:\\project\\fonchain-account\\", CmdFile: "D:\\project\\fonchain-account\\Dockerfile", Doc: "D:\\project", }, "seller": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/seller:3.1", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/seller:2.1", Path: "D:\\project\\seller-main\\", CmdFile: "D:\\project\\seller-main\\Dockerfile", Doc: "D:\\project", }, "task": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/task:3.1", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/task:2.1", Path: "D:\\project\\fonchain-task_microservice\\", CmdFile: "D:\\project\\fonchain-task_microservice\\Dockerfile", Doc: "D:\\project", }, "auth": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/auth:3.2", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/auth:2.2", Path: "D:\\project\\fonchain-auth\\", CmdFile: "D:\\project\\fonchain-auth\\Dockerfile", }, "chain": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/chain:3.2", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/chain:2.2", Path: "D:\\project\\fontree-chain_microservice\\", CmdFile: "D:\\project\\fontree-chain_microservice\\Dockerfile", Doc: "D:\\project", }, "mall": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/malltest:3.0", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/malltest:2.0", Path: "D:\\project\\fonchain-main_mall\\", CmdFile: "D:\\project\\fonchain-main_mall\\Dockerfile", Doc: "D:\\project", }, "approval": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/approval:3.3", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/approval:2.3", Path: "D:\\project\\fonchain-approval\\", CmdFile: "D:\\project\\fonchain-approval\\Dockerfile", Doc: "D:\\project", }, "order": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/order:3.1", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/order:2.1", Path: "D:\\project\\fonchain-order\\", CmdFile: "D:\\project\\fonchain-order\\Dockerfile", Doc: "D:\\project", }, "client": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/client:3.0", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/client:2.0", Path: "C:\\Users\\user054\\Documents\\fonchain-main\\", CmdFile: "C:\\Users\\user054\\Documents\\fonchain-main\\Dockerfile", }, "server": { Image: "121.229.45.214:9006/main-server", DevImage: "121.229.45.214:9006/main-server", Path: "D:\\project\\fonchain-main\\", CmdFile: "D:\\project\\fonchain-main\\Dockerfile", Doc: "D:\\project", }, "shop_mall": { Image: "121.229.45.214:9006/shop-main-server", DevImage: "121.229.45.214:9006/shop-main-server", Path: "D:\\project\\shop-main\\", CmdFile: "D:\\project\\shop-main\\Dockerfile", Doc: "D:\\project", }, "shop": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/shop:3.0", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/shop:2.0", Path: "D:\\project\\shop-main\\", CmdFile: "D:\\project\\shop-main\\Dockerfile", Doc: "D:\\project", }, "artist": { Image: "registry.cn-hangzhou.aliyuncs.com/fontree/artistinfo:3.0", DevImage: "registry.cn-hangzhou.aliyuncs.com/fontree/artistinfo:2.0", Path: "D:\\code\\go\\src\\github.com\\fonchain\\fonchain-artistinfo\\", CmdFile: "D:\\code\\go\\src\\github.com\\fonchain\\fonchain-artistinfo\\Dockerfile", Doc: "D:\\code\\go\\src\\github.com\\fonchain", }, } func main() { //查询命令所在目录,可用于判断操作系统中是否能用该命令 //docker build -f ./Dockerfile -t xxx . //cmd中执行的命令:ffmpeg -i psg.flv test.mp4 var name string var image string var env string var envDir string var appMap App fmt.Println("1--2-") flag.StringVar(&name, "n", "", "没有服务名称 auth approval account client") flag.StringVar(&envDir, "e", "", "没有使用的配置文件信息 auth approval account client") flag.Parse() fmt.Printf("---------------执行项目%s,使用配置文件%s\n", name, envDir) _, ok := serviceMap[name] if ok == false { fmt.Println("没有找对应项目项目") return } appMap = serviceMap[name] if envDir == "test" { env = "conf\\" + envDir + "\\" image = appMap.DevImage } else if envDir == "prod" { env = "conf\\" + envDir + "\\" image = appMap.Image } else { fmt.Println("没有配置配置文件") return } s, _ := GetAllFile(appMap.Path+env, []string{}) fmt.Println(s) for _, t := range s { fmt.Println(t, path.Base(t)) copyFile(t, appMap.Path+"conf\\"+path.Base(t)) } fmt.Println("----------------------------0 配置文件拷贝成功") //构建 var cmd *exec.Cmd if appMap.Doc == "" { cmd = exec.Command("docker", "build", "-f", appMap.CmdFile, "-t", image, ".") } else { cmd = exec.Command("docker", "build", "-f", appMap.CmdFile, appMap.Doc, "-t", image) } cmd.Dir = appMap.Path /* docker build -t registry.cn-hangzhou.aliyuncs.com/fontree/auth:2.2 . docker push registry.cn-hangzhou.aliyuncs.com/fontree/account:2.1 docker push registry.cn-hangzhou.aliyuncs.com/fontree/account:2.1 */ //阻塞至等待命令执行完成 fmt.Println(cmd.String()) fmt.Println("1---------------", appMap.Path) out, err1 := cmd.CombinedOutput() fmt.Printf("%s\n", out) if err1 != nil { fmt.Println(err1) fmt.Println("结束") return } fmt.Println("------------------1 Success------------------") //成功则去执行docker push操作 cmd2 := exec.Command("docker", "push", image) out2, err2 := cmd2.CombinedOutput() fmt.Printf("%s\n", out2) if err2 != nil { fmt.Println(err1) fmt.Println("结束") return } fmt.Println("------------------2 Success------------------") //开始重新构建xxx } func copyFile(old string, new string) bool { op, err1 := os.Open(old) of, err2 := os.Create(new) if err1 != nil || err2 != nil { fmt.Println("文件拷贝失败") return false } defer op.Close() defer of.Close() _, err := io.Copy(of, op) if err != nil { fmt.Println(err) return false } return true } func GetAllFile(pathname string, s []string) ([]string, error) { rd, err := ioutil.ReadDir(pathname) if err != nil { fmt.Println("read dir fail:", err) return s, err } for _, fi := range rd { if !fi.IsDir() { fullName := pathname + "/" + fi.Name() s = append(s, fullName) } else { //是文件夹 //s = append(s, ) } } return s, nil }