| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| "path/filepath" |
| "strings" |
| |
| "go.skia.org/infra/go/exec" |
| "go.skia.org/infra/go/git" |
| "go.skia.org/infra/go/sklog" |
| "go.skia.org/infra/task_driver/go/lib/dirs" |
| "go.skia.org/infra/task_driver/go/lib/golang" |
| "go.skia.org/infra/task_driver/go/lib/os_steps" |
| "go.skia.org/infra/task_driver/go/td" |
| ) |
| |
| var ( |
| // Required properties for this task. |
| projectId = flag.String("project_id", "", "ID of the Google Cloud project.") |
| taskId = flag.String("task_id", "", "ID of this task.") |
| taskName = flag.String("task_name", "", "Name of the task.") |
| workdir = flag.String("workdir", ".", "Working directory") |
| |
| // Optional flags. |
| local = flag.Bool("local", false, "True if running locally (as opposed to on the bots)") |
| output = flag.String("o", "", "If provided, dump a JSON blob of step data to the given file. Prints to stdout if '-' is given.") |
| ) |
| |
| func main() { |
| // Setup. |
| ctx := td.StartRun(projectId, taskId, taskName, output, local) |
| defer td.EndRun(ctx) |
| |
| // Setup Go. |
| wd, err := os_steps.Abs(ctx, *workdir) |
| if err != nil { |
| td.Fatal(ctx, err) |
| } |
| ctx = golang.WithEnv(ctx, wd) |
| infraDir := filepath.Join(wd, "buildbot") |
| |
| // We get depot_tools via isolate. It's required for some tests. |
| ctx = td.WithEnv(ctx, []string{fmt.Sprintf("SKIABOT_TEST_DEPOT_TOOLS=%s", dirs.DepotTools(*workdir))}) |
| |
| // Initialize the Git repo. We receive the code via Isolate, but it |
| // doesn't include the .git dir. |
| gd := git.GitDir(infraDir) |
| if gitVer, err := gd.Git(ctx, "version"); err != nil { |
| td.Fatal(ctx, err) |
| } else { |
| sklog.Infof("Git version %s", gitVer) |
| } |
| if _, err := gd.Git(ctx, "init"); err != nil { |
| td.Fatal(ctx, err) |
| } |
| if _, err := gd.Git(ctx, "config", "--local", "user.name", "Skia bots"); err != nil { |
| td.Fatal(ctx, err) |
| } |
| if _, err := gd.Git(ctx, "config", "--local", "user.email", "fake@skia.bots"); err != nil { |
| td.Fatal(ctx, err) |
| } |
| if _, err := gd.Git(ctx, "add", "."); err != nil { |
| td.Fatal(ctx, err) |
| } |
| if _, err := gd.Git(ctx, "commit", "--no-verify", "-m", "Fake commit to satisfy recipe tests"); err != nil { |
| td.Fatal(ctx, err) |
| } |
| |
| // For Large/Race, start the Cloud Datastore emulator. |
| if strings.Contains(*taskName, "Large") || strings.Contains(*taskName, "Race") { |
| runEmulators := filepath.Join(infraDir, "scripts", "run_emulators", "run_emulators") |
| if _, err := exec.RunCwd(ctx, infraDir, runEmulators, "start"); err != nil { |
| td.Fatal(ctx, err) |
| } |
| ctx = td.WithEnv(ctx, []string{ |
| "DATASTORE_EMULATOR_HOST=localhost:8891", |
| "BIGTABLE_EMULATOR_HOST=localhost:8892", |
| "PUBSUB_EMULATOR_HOST=localhost:8893", |
| "FIRESTORE_EMULATOR_HOST=localhost:8894", |
| }) |
| defer func() { |
| if _, err := exec.RunCwd(ctx, infraDir, runEmulators, "stop"); err != nil { |
| td.Fatal(ctx, err) |
| } |
| }() |
| } |
| |
| // Print Go info. |
| goExc, goVer, err := golang.Info(ctx) |
| if err != nil { |
| td.Fatal(ctx, err) |
| } |
| sklog.Infof("Using Go from %s", goExc) |
| sklog.Infof("Go version %s", goVer) |
| |
| // Sync dependencies. |
| if err := golang.ModDownload(ctx, infraDir); err != nil { |
| td.Fatal(ctx, err) |
| } |
| if err := golang.InstallCommonDeps(ctx, infraDir); err != nil { |
| td.Fatal(ctx, err) |
| } |
| |
| // Run the tests. |
| //cmd := []string{"run", "./run_unittests.go", "--alsologtostderr"} |
| cmd := []string{"./..."} |
| if strings.Contains(*taskName, "Race") { |
| cmd = append(cmd, "--race", "--large", "--medium", "--small") |
| } else if strings.Contains(*taskName, "Large") { |
| cmd = append(cmd, "--large") |
| } else if strings.Contains(*taskName, "Medium") { |
| cmd = append(cmd, "--medium") |
| } else { |
| cmd = append(cmd, "--small") |
| } |
| if err := golang.Test(ctx, infraDir, cmd...); err != nil { |
| td.Fatal(ctx, err) |
| } |
| |
| // Sanity check; none of the above should have modified the go.mod file. |
| if _, err := gd.Git(ctx, "diff", "--no-ext-diff", "--exit-code", "go.mod"); err != nil { |
| td.Fatal(ctx, err) |
| } |
| } |