github.com/StackExchange/blackbox/v2@v2.0.1-0.20220331193400-d84e904973ab/build/build.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "os" 8 "os/exec" 9 "strings" 10 "time" 11 ) 12 13 var sha = flag.String("sha", "", "SHA of current commit") 14 15 var goos = flag.String("os", "", "OS to build (linux, windows, or darwin) Defaults to all.") 16 17 func main() { 18 flag.Parse() 19 flags := fmt.Sprintf(`-s -w -X main.SHA="%s" -X main.BuildTime=%d`, getVersion(), time.Now().Unix()) 20 pkg := "github.com/StackExchange/blackbox/v2/cmd/blackbox" 21 22 build := func(out, goos string) { 23 log.Printf("Building %s", out) 24 cmd := exec.Command("go", "build", "-o", out, "-ldflags", flags, pkg) 25 os.Setenv("GOOS", goos) 26 os.Setenv("GO111MODULE", "on") 27 cmd.Stderr = os.Stderr 28 cmd.Stdout = os.Stdout 29 err := cmd.Run() 30 if err != nil { 31 log.Fatal(err) 32 } 33 } 34 35 for _, env := range []struct { 36 binary, goos string 37 }{ 38 {"blackbox-Linux", "linux"}, 39 {"blackbox.exe", "windows"}, 40 {"blackbox-Darwin", "darwin"}, 41 } { 42 if *goos == "" || *goos == env.goos { 43 build(env.binary, env.goos) 44 } 45 } 46 } 47 48 func getVersion() string { 49 if *sha != "" { 50 return *sha 51 } 52 // check teamcity build version 53 if v := os.Getenv("BUILD_VCS_NUMBER"); v != "" { 54 return v 55 } 56 // check git 57 cmd := exec.Command("git", "rev-parse", "HEAD") 58 v, err := cmd.CombinedOutput() 59 if err != nil { 60 return "" 61 } 62 ver := strings.TrimSpace(string(v)) 63 // see if dirty 64 cmd = exec.Command("git", "diff-index", "--quiet", "HEAD", "--") 65 err = cmd.Run() 66 // exit status 1 indicates dirty tree 67 if err != nil { 68 if err.Error() == "exit status 1" { 69 ver += "[dirty]" 70 } else { 71 log.Printf("!%s!", err.Error()) 72 } 73 } 74 return ver 75 }