1package main 2 3import ( 4 "flag" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "os" 9 "os/exec" 10 "path/filepath" 11 12 "gopkg.in/yaml.v2" 13) 14 15func main() { 16 log.SetFlags(0) 17 log.SetPrefix("testrunner: ") 18 19 var configPath string 20 flag.StringVar(&configPath, "config", "", "location of presubmit.yml") 21 flag.Parse() 22 if configPath == "" { 23 var err error 24 configPath, err = findConfigPath() 25 if err != nil { 26 log.Fatal(err) 27 } 28 } 29 30 if err := run(configPath, flag.Args()); err != nil { 31 log.Fatal(err) 32 } 33} 34 35func run(configPath string, args []string) error { 36 configData, err := ioutil.ReadFile(configPath) 37 if err != nil { 38 return err 39 } 40 var config interface{} 41 if err := yaml.Unmarshal(configData, &config); err != nil { 42 return err 43 } 44 45 platform := config.(map[interface{}]interface{})["platforms"].(map[interface{}]interface{})["windows"].(map[interface{}]interface{}) 46 var buildFlags []string 47 for _, f := range platform["build_flags"].([]interface{}) { 48 buildFlags = append(buildFlags, f.(string)) 49 } 50 testFlags := buildFlags 51 for _, f := range platform["test_flags"].([]interface{}) { 52 testFlags = append(testFlags, f.(string)) 53 } 54 var buildTargets, testTargets []string 55 if len(args) == 0 { 56 for _, t := range platform["build_targets"].([]interface{}) { 57 buildTargets = append(buildTargets, t.(string)) 58 } 59 for _, t := range platform["test_targets"].([]interface{}) { 60 testTargets = append(testTargets, t.(string)) 61 } 62 } else { 63 buildTargets = args 64 testTargets = args 65 } 66 67 buildCmd := exec.Command("bazel", "build") 68 buildCmd.Args = append(buildCmd.Args, buildFlags...) 69 buildCmd.Args = append(buildCmd.Args, buildTargets...) 70 buildCmd.Stdout = os.Stdout 71 buildCmd.Stderr = os.Stderr 72 if err := buildCmd.Run(); err != nil { 73 return err 74 } 75 76 testCmd := exec.Command("bazel", "test") 77 testCmd.Args = append(testCmd.Args, testFlags...) 78 testCmd.Args = append(testCmd.Args, testTargets...) 79 testCmd.Stdout = os.Stdout 80 testCmd.Stderr = os.Stderr 81 if err := testCmd.Run(); err != nil { 82 return err 83 } 84 85 return nil 86} 87 88func findConfigPath() (string, error) { 89 d, err := os.Getwd() 90 if err != nil { 91 return "", err 92 } 93 for { 94 configPath := filepath.Join(d, ".bazelci/presubmit.yml") 95 _, err := os.Stat(configPath) 96 if !os.IsNotExist(err) { 97 return configPath, nil 98 } 99 parent := filepath.Dir(d) 100 if parent == d { 101 return "", fmt.Errorf("could not find presubmit.yml") 102 } 103 d = parent 104 } 105} 106