all: add env support, freebsd-386, freebsd-amd64-race, re-enable plan9

Update golang/go#9491
Update golang/go#8639

Change-Id: I1f43c751777f10a6d5870ca9bbb8c2a3430189bf
Reviewed-on: https://go-review.googlesource.com/3170
Reviewed-by: Andrew Gerrand <adg@golang.org>
diff --git a/dashboard/builders.go b/dashboard/builders.go
index 685aafc..f079a29 100644
--- a/dashboard/builders.go
+++ b/dashboard/builders.go
@@ -30,13 +30,17 @@
 	Go14URL     string // URL to built Go 1.4 tar.gz
 
 	// Docker-specific settings: (used if VMImage == "")
-	Image   string   // Docker image to use to build
-	cmd     string   // optional -cmd flag (relative to go/src/)
-	env     []string // extra environment ("key=value") pairs
-	dashURL string   // url of the build dashboard
-	tool    string   // the tool this configuration is for
+	Image   string // Docker image to use to build
+	cmd     string // optional -cmd flag (relative to go/src/)
+	dashURL string // url of the build dashboard
+	tool    string // the tool this configuration is for
+
+	// Use by both VMs and Docker:
+	env []string // extra environment ("key=value") pairs
 }
 
+func (c *BuildConfig) Env() []string { return append([]string(nil), c.env...) }
+
 func (c *BuildConfig) GOOS() string { return c.Name[:strings.Index(c.Name, "-")] }
 
 func (c *BuildConfig) GOARCH() string {
@@ -52,14 +56,18 @@
 // do the build and run its standard set of tests.
 // Example values are "src/all.bash", "src/all.bat", "src/all.rc".
 func (c *BuildConfig) AllScript() string {
+	if strings.HasSuffix(c.Name, "-race") {
+		if strings.HasPrefix(c.Name, "windows-") {
+			return "src/race.bat"
+		}
+		return "src/race.bash"
+	}
 	if strings.HasPrefix(c.Name, "windows-") {
 		return "src/all.bat"
 	}
 	if strings.HasPrefix(c.Name, "plan9-") {
 		return "src/all.rc"
 	}
-	// TODO(bradfitz): race.bash, etc, once the race builder runs
-	// via the buildlet.
 	return "src/all.bash"
 }
 
@@ -149,19 +157,41 @@
 
 	// VMs:
 	addBuilder(BuildConfig{
+		Name:        "freebsd-amd64-gce101",
+		VMImage:     "freebsd-amd64-gce101",
+		machineType: "n1-highcpu-2",
+		Go14URL:     "https://storage.googleapis.com/go-builder-data/go1.4-freebsd-amd64.tar.gz",
+		env:         []string{"CC=clang"},
+	})
+	addBuilder(BuildConfig{
+		Name:        "freebsd-amd64-race",
+		VMImage:     "freebsd-amd64-gce101",
+		machineType: "n1-highcpu-4",
+		Go14URL:     "https://storage.googleapis.com/go-builder-data/go1.4-freebsd-amd64.tar.gz",
+		env:         []string{"CC=clang"},
+	})
+	addBuilder(BuildConfig{
+		Name:        "freebsd-386-gce101",
+		VMImage:     "freebsd-amd64-gce101",
+		machineType: "n1-highcpu-2",
+		Go14URL:     "https://storage.googleapis.com/go-builder-data/go1.4-freebsd-amd64.tar.gz",
+		env:         []string{"GOARCH=386", "CC=clang"},
+	})
+	addBuilder(BuildConfig{
 		Name:        "openbsd-amd64-gce56",
 		VMImage:     "openbsd-amd64-56",
 		machineType: "n1-highcpu-2",
 		Go14URL:     "https://storage.googleapis.com/go-builder-data/go1.4-openbsd-amd64.tar.gz",
 	})
 	addBuilder(BuildConfig{
+		Name:    "plan9-386-gcepartial",
+		VMImage: "plan9-386",
+		Go14URL: "https://storage.googleapis.com/go-builder-data/go1.4-plan9-386.tar.gz",
 		// It's named "partial" because the buildlet sets
 		// GOTESTONLY=std to stop after the "go test std"
 		// tests because it's so slow otherwise.
-		// TODO(braditz): move that env variable to the
-		// coordinator and into this config.
-		Name:    "plan9-386-gcepartial",
-		VMImage: "plan9-386",
+		env: []string{"GOTESTONLY=std"},
+
 		// We *were* using n1-standard-1 because Plan 9 can only
 		// reliably use a single CPU. Using 2 or 4 and we see
 		// test failures. See: