blob: b9ff2c45986141530fc86dfa4869e5b0c21ef03d [file] [log] [blame]
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package dashboard contains shared configuration and logic used by various
// pieces of the Go continuous build system.
package dashboard
import (
"fmt"
"sort"
"strconv"
"strings"
"golang.org/x/build/buildenv"
)
// Builders are the different build configurations.
// The keys are like "darwin-amd64" or "linux-386-387".
// This map should not be modified by other packages.
// Initialization happens below, via calls to addBuilder.
var Builders = map[string]BuildConfig{}
// Hosts contains the names and configs of all the types of
// buildlets. They can be VMs, containers, or dedicated machines.
var Hosts = map[string]*HostConfig{
"host-linux-kubestd": &HostConfig{
Notes: "Kubernetes container on GKE.",
KubeImage: "linux-x86-std-kube:latest",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.linux-amd64",
env: []string{"GOROOT_BOOTSTRAP=/go1.4"},
},
"host-linux-armhf-cross": &HostConfig{
Notes: "Kubernetes container on GKE built from env/crosscompile/linux-armhf-jessie",
KubeImage: "linux-armhf-jessie:latest",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.linux-amd64",
env: []string{"GOROOT_BOOTSTRAP=/go1.4"},
},
"host-linux-armel-cross": &HostConfig{
Notes: "Kubernetes container on GKE built from env/crosscompile/linux-armel-stretch",
KubeImage: "linux-armel-stretch:latest",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.linux-amd64",
env: []string{"GOROOT_BOOTSTRAP=/go1.4"},
},
"host-nacl-kube": &HostConfig{
Notes: "Kubernetes container on GKE.",
KubeImage: "linux-x86-nacl:latest",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.linux-amd64",
env: []string{"GOROOT_BOOTSTRAP=/go1.4"},
},
"host-s390x-cross-kube": &HostConfig{
Notes: "Kubernetes container on GKE.",
KubeImage: "linux-s390x-stretch:latest",
buildletURLTmpl: "https://storage.googleapis.com/$BUCKET/buildlet.linux-amd64",
env: []string{"GOROOT_BOOTSTRAP=/go1.4"},
},
"host-linux-x86-alpine": &HostConfig{
Notes: "Kubernetes alpine container on GKE.",
KubeImage: "linux-x86-alpine:latest",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.linux-amd64-static",
env: []string{"GOROOT_BOOTSTRAP=/usr/lib/go"},
},
"host-linux-clang": &HostConfig{
Notes: "Kubernetes container on GKE with clang.",
KubeImage: "linux-x86-clang:latest",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.linux-amd64",
env: []string{"GOROOT_BOOTSTRAP=/go1.4"},
},
"host-linux-sid": &HostConfig{
Notes: "Debian sid, updated occasionally.",
KubeImage: "linux-x86-sid:latest",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.linux-amd64",
env: []string{"GOROOT_BOOTSTRAP=/go1.4"},
},
"host-linux-arm": &HostConfig{
IsReverse: true,
ExpectNum: 50,
env: []string{"GOROOT_BOOTSTRAP=/usr/local/go"},
ReverseAliases: []string{"linux-arm", "linux-arm-arm5"},
},
"host-linux-arm5spacemonkey": &HostConfig{
IsReverse: true,
ExpectNum: 3,
env: []string{"GOROOT_BOOTSTRAP=/usr/local/go"},
ReverseAliases: []string{"linux-arm-arm5spacemonkey"},
},
"host-openbsd-amd64-60": &HostConfig{
VMImage: "openbsd-amd64-60",
machineType: "n1-highcpu-4",
buildletURLTmpl: "https://storage.googleapis.com/$BUCKET/buildlet.openbsd-amd64",
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/gobootstrap-openbsd-amd64-60.tar.gz",
Notes: "OpenBSD 6.0; GCE VM is built from script in build/env/openbsd-amd64",
},
"host-openbsd-386-60": &HostConfig{
VMImage: "openbsd-386-60",
machineType: "n1-highcpu-4",
buildletURLTmpl: "https://storage.googleapis.com/$BUCKET/buildlet.openbsd-386",
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/gobootstrap-openbsd-386-60.tar.gz",
Notes: "OpenBSD 6.0; GCE VM is built from script in build/env/openbsd-386",
},
"host-freebsd-93-gce": &HostConfig{
VMImage: "freebsd-amd64-gce93",
machineType: "n1-highcpu-4",
buildletURLTmpl: "https://storage.googleapis.com/$BUCKET/buildlet.freebsd-amd64",
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/go1.4-freebsd-amd64.tar.gz",
},
"host-freebsd-101-gce": &HostConfig{
VMImage: "freebsd-amd64-gce101",
Notes: "FreeBSD 10.1; GCE VM is built from script in build/env/freebsd-amd64",
machineType: "n1-highcpu-4",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.freebsd-amd64", // TODO(bradfitz): why was this http instead of https?
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/go1.4-freebsd-amd64.tar.gz",
env: []string{"CC=clang"},
},
"host-freebsd-110": &HostConfig{
VMImage: "freebsd-amd64-110",
Notes: "FreeBSD 11.0; GCE VM is built from script in build/env/freebsd-amd64",
machineType: "n1-highcpu-4",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.freebsd-amd64", // TODO(bradfitz): why was this http instead of https?
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/go1.4-freebsd-amd64.tar.gz",
env: []string{"CC=clang"},
},
"host-netbsd-71": &HostConfig{
VMImage: "netbsd-amd64-71",
Notes: "NetBSD 7.1RC1; GCE VM is built from script in build/env/netbsd-amd64",
machineType: "n1-highcpu-2",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.netbsd-amd64",
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/gobootstrap-netbsd-amd64.tar.gz",
},
"host-plan9-386-gce": &HostConfig{
VMImage: "plan9-386-v4",
Notes: "Plan 9 from 0intro; GCE VM is built from script in build/env/plan9-386",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.plan9-386",
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/gobootstrap-plan9-386.tar.gz",
// 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:
// https://golang.org/issue/8393
// https://golang.org/issue/9491
// n1-standard-1 has 3.6 GB of memory which WAS (see below)
// overkill (userspace probably only sees 2GB anyway),
// but it's the cheapest option. And plenty to keep
// our ~250 MB of inputs+outputs in its ramfs.
//
// But the docs says "For the n1 series of machine
// types, a virtual CPU is implemented as a single
// hyperthread on a 2.6GHz Intel Sandy Bridge Xeon or
// Intel Ivy Bridge Xeon (or newer) processor. This
// means that the n1-standard-2 machine type will see
// a whole physical core."
//
// ... so we used n1-highcpu-2 (1.80 RAM, still
// plenty), just so we can get 1 whole core for the
// single-core Plan 9. It will see 2 virtual cores and
// only use 1, but we hope that 1 will be more powerful
// and we'll stop timing out on tests.
machineType: "n1-highcpu-4",
env: []string{"GO_TEST_TIMEOUT_SCALE=2"},
},
"host-windows-gce": &HostConfig{
VMImage: "windows-buildlet-v2",
machineType: "n1-highcpu-4",
buildletURLTmpl: "http://storage.googleapis.com/$BUCKET/buildlet.windows-amd64",
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/go1.4-windows-amd64.tar.gz",
RegularDisk: true,
},
"host-darwin-10_8": &HostConfig{
IsReverse: true,
ExpectNum: 1,
Notes: "MacStadium OS X 10.8 VM under VMWare ESXi",
env: []string{
"GOROOT_BOOTSTRAP=/Users/gopher/go1.4",
},
ReverseAliases: []string{"darwin-amd64-10_8"},
},
"host-darwin-10_10": &HostConfig{
IsReverse: true,
ExpectNum: 2,
Notes: "MacStadium OS X 10.10 VM under VMWare ESXi",
env: []string{
"GOROOT_BOOTSTRAP=/Users/gopher/go1.4",
},
ReverseAliases: []string{"darwin-amd64-10_10"},
},
"host-darwin-10_11": &HostConfig{
IsReverse: true,
ExpectNum: 15,
Notes: "MacStadium OS X 10.11 VM under VMWare ESXi",
env: []string{
"GOROOT_BOOTSTRAP=/Users/gopher/go1.4",
},
ReverseAliases: []string{"darwin-amd64-10_11"},
},
"host-darwin-10_12": &HostConfig{
IsReverse: true,
ExpectNum: 2,
Notes: "MacStadium OS X 10.12 VM under VMWare ESXi",
env: []string{
"GOROOT_BOOTSTRAP=/Users/gopher/go1.4",
},
ReverseAliases: []string{"darwin-amd64-10_12"},
},
"host-linux-s390x": &HostConfig{
Notes: "run by IBM",
OwnerGithub: "mundaym",
IsReverse: true,
env: []string{"GOROOT_BOOTSTRAP=/var/buildlet/go-linux-s390x-bootstrap"},
ReverseAliases: []string{"linux-s390x-ibm"},
},
"host-linux-ppc64-osu": &HostConfig{
Notes: "Debian jessie; run by Go team on osuosl.org",
IsReverse: true,
ExpectNum: 5,
env: []string{"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap"},
ReverseAliases: []string{"linux-ppc64-buildlet"},
},
"host-linux-ppc64le-osu": &HostConfig{
Notes: "Debian jessie; run by Go team on osuosl.org",
IsReverse: true,
ExpectNum: 5,
env: []string{"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap"},
ReverseAliases: []string{"linux-ppc64le-buildlet"},
},
"host-linux-arm64-linaro": &HostConfig{
Notes: "Ubuntu wily; run by Go team, from linaro",
IsReverse: true,
ExpectNum: 5,
env: []string{"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap"},
ReverseAliases: []string{"linux-arm64-buildlet"},
},
"host-linux-arm64-packet": &HostConfig{
Notes: "On 96 core packet.net host (Xenial) in Docker containers (Jessie); run by Go team. See x/build/env/linux-arm64/packet",
IsReverse: true,
ExpectNum: 20,
env: []string{"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap"},
},
"host-solaris-amd64": &HostConfig{
Notes: "run by Go team on Joyent, on a SmartOS 'infrastructure container'",
IsReverse: true,
ExpectNum: 5,
env: []string{"GOROOT_BOOTSTRAP=/root/go-solaris-amd64-bootstrap"},
ReverseAliases: []string{"solaris-amd64-smartosbuildlet"},
},
"host-linux-mips": &HostConfig{
Notes: "Run by Brendan Kirby, imgtec.com",
OwnerGithub: "MIPSbkirby",
IsReverse: true,
ExpectNum: 1,
env: []string{
"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap-mips",
"GOARCH=mips",
"GOHOSTARCH=mips",
"GO_TEST_TIMEOUT_SCALE=4",
},
ReverseAliases: []string{"linux-mips"},
},
"host-linux-mipsle": &HostConfig{
Notes: "Run by Brendan Kirby, imgtec.com",
OwnerGithub: "MIPSbkirby",
IsReverse: true,
ExpectNum: 1,
env: []string{
"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap-mipsle",
"GOARCH=mipsle",
"GOHOSTARCH=mipsle",
},
ReverseAliases: []string{"linux-mipsle"},
},
"host-linux-mips64": &HostConfig{
Notes: "Run by Brendan Kirby, imgtec.com",
OwnerGithub: "MIPSbkirby",
IsReverse: true,
ExpectNum: 1,
env: []string{
"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap-mips64",
"GOARCH=mips64",
"GOHOSTARCH=mips64",
"GO_TEST_TIMEOUT_SCALE=4",
},
ReverseAliases: []string{"linux-mips64"},
},
"host-linux-mips64le": &HostConfig{
Notes: "Run by Brendan Kirby, imgtec.com",
OwnerGithub: "MIPSbkirby",
IsReverse: true,
ExpectNum: 1,
env: []string{
"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap-mips64le",
"GOARCH=mips64le",
"GOHOSTARCH=mips64le",
},
ReverseAliases: []string{"linux-mips64le"},
},
"host-darwin-amd64-eliasnaur-android": &HostConfig{
Notes: "Mac Mini hosted by Elias Naur, running the android reverse buildlet",
OwnerGithub: "eliasnaur",
IsReverse: true,
ExpectNum: 1,
env: []string{
"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap",
"GOHOSTARCH=amd64",
"GOOS=android",
},
},
"host-darwin-amd64-eliasnaur-ios": &HostConfig{
Notes: "Mac Mini hosted by Elias Naur, running the ios reverse buildlet",
OwnerGithub: "eliasnaur",
IsReverse: true,
ExpectNum: 1,
env: []string{
"GOROOT_BOOTSTRAP=/usr/local/go-bootstrap",
"GOHOSTARCH=amd64",
},
},
}
func init() {
for key, c := range Hosts {
if key == "" {
panic("empty string key in Hosts")
}
if c.HostType == "" {
c.HostType = key
}
if c.HostType != key {
panic(fmt.Sprintf("HostType %q != key %q", c.HostType, key))
}
nSet := 0
if c.VMImage != "" {
nSet++
}
if c.KubeImage != "" {
nSet++
}
if c.IsReverse {
nSet++
}
if nSet != 1 {
panic(fmt.Sprintf("exactly one of VMImage, KubeImage, IsReverse must be set for host %q; got %v", key, nSet))
}
if c.buildletURLTmpl == "" && (c.VMImage != "" || c.KubeImage != "") {
panic(fmt.Sprintf("missing buildletURLTmpl for host type %q", key))
}
}
}
// A HostConfig describes the available ways to obtain buildlets of
// different types. Some host configs can server multiple
// builders. For example, a host config of "host-linux-kube-std" can
// serve linux-amd64, linux-amd64-race, linux-386, linux-386-387, etc.
type HostConfig struct {
// HostType is the unique name of this host config. It is also
// the key in the Hosts map.
HostType string
// buildletURLTmpl is the URL "template" ($BUCKET is auto-expanded)
// for the URL to the buildlet binary.
// This field is required for GCE and Kubernetes builders. It's not
// needed for reverse buildlets because in that case, the buildlets
// are already running and their stage0 should know how to update it
// it automatically.
buildletURLTmpl string
// Exactly 1 of these must be set:
VMImage string // e.g. "openbsd-amd64-60"
KubeImage string // e.g. "linux-buildlet-std:latest" (suffix after "gcr.io/<PROJ>/")
IsReverse bool // if true, only use the reverse buildlet pool
// GCE options, if VMImage != ""
machineType string // optional GCE instance type
RegularDisk bool // if true, use spinning disk instead of SSD
// ReverseOptions:
ExpectNum int // expected number of reverse buildlets of this type
// Optional base env. GOROOT_BOOTSTRAP should go here if the buildlet
// has Go 1.4+ baked in somewhere.
env []string
// These template URLs may contain $BUCKET which is expanded to the
// relevant Cloud Storage bucket as specified by the build environment.
goBootstrapURLTmpl string // optional URL to a built Go 1.4+ tar.gz
Owner string // optional email of owner; "bradfitz@golang.org", empty means golang-dev
OwnerGithub string // optional GitHub username of owner
Notes string // notes for humans
// ReverseAliases lists alternate names for this buildlet
// config, for older clients doing a reverse dial into the
// coordinator from outside. This prevents us from updating
// 75+ dedicated machines/VMs atomically, switching them to
// the new "host-*" names.
// This is only applicable if IsReverse.
ReverseAliases []string
}
// A BuildConfig describes how to run a builder.
type BuildConfig struct {
// Name is the unique name of the builder, in the form of
// "GOOS-GOARCH" or "GOOS-GOARCH-suffix". For example,
// "darwin-386", "linux-386-387", "linux-amd64-race". Some
// suffixes are well-known and carry special meaning, such as
// "-race".
Name string
// HostType is the required key into the Hosts map, describing
// the type of host this build will run on.
// For example, "host-linux-kube-std".
HostType string
Notes string // notes for humans
TryBot bool // be a trybot
TryOnly bool // only used for trybots, and not regular builds
CompileOnly bool // if true, compile tests, but don't run them
FlakyNet bool // network tests are flaky (try anyway, but ignore some failures)
// SkipSnapshot, if true, means to not fetch a tarball
// snapshot of the world post-make.bash from the buildlet (and
// thus to not write it to Google Cloud Storage). This is
// incompatible with sharded tests, and should only be used
// for very slow builders or networks, unable to transfer
// the tarball in under ~5 minutes.
SkipSnapshot bool
// StopAfterMake causes the build to stop after the make
// script completes, returning its result as the result of the
// whole build. It does not run or compile any of the tests,
// nor does it write a snapshot of the world to cloud
// storage. This option is only supported for builders whose
// BuildConfig.SplitMakeRun returns true.
StopAfterMake bool
// numTestHelpers is the number of _additional_ buildlets
// past the first one to help out with sharded tests.
// For trybots, the numTryHelpers value is used, unless it's
// zero, in which case numTestHelpers is used.
numTestHelpers int
numTryTestHelpers int // for trybots. if 0, numTesthelpers is used
env []string // extra environment ("key=value") pairs
allScriptArgs []string
}
func (c *BuildConfig) Env() []string {
env := []string{"GO_BUILDER_NAME=" + c.Name}
if c.FlakyNet {
env = append(env, "GO_BUILDER_FLAKY_NET=1")
}
env = append(env, c.hostConf().env...)
return append(env, c.env...)
}
func (c *BuildConfig) IsReverse() bool { return c.hostConf().IsReverse }
func (c *BuildConfig) IsKube() bool { return c.hostConf().IsKube() }
func (c *HostConfig) IsKube() bool { return c.KubeImage != "" }
func (c *BuildConfig) IsGCE() bool { return c.hostConf().IsGCE() }
func (c *HostConfig) IsGCE() bool { return c.VMImage != "" }
func (c *BuildConfig) GOOS() string { return c.Name[:strings.Index(c.Name, "-")] }
func (c *BuildConfig) GOARCH() string {
arch := c.Name[strings.Index(c.Name, "-")+1:]
i := strings.Index(arch, "-")
if i == -1 {
return arch
}
return arch[:i]
}
// FilePathJoin is mostly like filepath.Join (without the cleaning) except
// it uses the path separator of c.GOOS instead of the host system's.
func (c *BuildConfig) FilePathJoin(x ...string) string {
if c.GOOS() == "windows" {
return strings.Join(x, "\\")
}
return strings.Join(x, "/")
}
func (c *BuildConfig) hostConf() *HostConfig {
if c, ok := Hosts[c.HostType]; ok {
return c
}
panic(fmt.Sprintf("missing buildlet config for buildlet %q", c.Name))
}
// BuildletBinaryURL returns the public URL of this builder's buildlet.
func (c *BuildConfig) GoBootstrapURL(e *buildenv.Environment) string {
return strings.Replace(c.hostConf().goBootstrapURLTmpl, "$BUCKET", e.BuildletBucket, 1)
}
// BuildletBinaryURL returns the public URL of this builder's buildlet.
func (c *HostConfig) BuildletBinaryURL(e *buildenv.Environment) string {
tmpl := c.buildletURLTmpl
return strings.Replace(tmpl, "$BUCKET", e.BuildletBucket, 1)
}
func (c *BuildConfig) IsRace() bool {
return strings.HasSuffix(c.Name, "-race")
}
// AllScript returns the relative path to the operating system's script to
// 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 c.Name == "" {
panic("bogus BuildConfig")
}
if c.IsRace() {
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"
}
if strings.HasPrefix(c.Name, "nacl-") {
return "src/nacltest.bash"
}
if strings.HasPrefix(c.Name, "android-") {
return "src/androidtest.bash"
}
if strings.HasPrefix(c.Name, "darwin-arm") {
return "src/iostest.bash"
}
if strings.HasPrefix(c.Name, "misc-compile") {
return "src/buildall.bash"
}
return "src/all.bash"
}
// SplitMakeRun reports whether the coordinator should first compile
// (using c.MakeScript), then snapshot, then run the tests (ideally
// sharded) using c.RunScript.
// Eventually this function should always return true (and then be deleted)
// but for now we've only set up the scripts and verified that the main
// configurations work.
func (c *BuildConfig) SplitMakeRun() bool {
switch c.AllScript() {
case "src/all.bash", "src/all.bat",
"src/race.bash", "src/race.bat",
"src/all.rc",
"src/nacltest.bash":
// These we've verified to work.
return true
}
// TODO(bradfitz): make androidtest.bash and iotest.bash work
// too. And buildall.bash should really just be N small
// Kubernetes jobs instead of a "buildall.bash". Then we can
// delete this whole method.
return false
}
func (c *BuildConfig) BuildSubrepos() bool {
if !c.SplitMakeRun() {
return false
}
// TODO(adg,bradfitz): expand this as required
switch c.Name {
case "darwin-amd64-10_8",
"darwin-amd64-10_10",
"darwin-amd64-10_11",
"darwin-386-10_11",
"freebsd-386-gce101", "freebsd-amd64-gce101",
"freebsd-386-110", "freebsd-amd64-110",
"linux-386", "linux-amd64", "linux-amd64-nocgo",
"openbsd-386-60", "openbsd-amd64-60",
"plan9-386",
"windows-386-gce", "windows-amd64-gce":
return true
case "darwin-amd64-10_12":
// Don't build subrepos on Sierra until
// https://github.com/golang/go/issues/18751#issuecomment-274955794
// is addressed.
return false
default:
return false
}
}
// AllScriptArgs returns the set of arguments that should be passed to the
// all.bash-equivalent script. Usually empty.
func (c *BuildConfig) AllScriptArgs() []string {
if strings.HasPrefix(c.Name, "darwin-arm") {
return []string{"-restart"}
}
return append([]string(nil), c.allScriptArgs...)
}
// MakeScript returns the relative path to the operating system's script to
// do the build.
// Example values are "src/make.bash", "src/make.bat", "src/make.rc".
func (c *BuildConfig) MakeScript() string {
if strings.HasPrefix(c.Name, "windows-") {
return "src/make.bat"
}
if strings.HasPrefix(c.Name, "plan9-") {
return "src/make.rc"
}
if strings.HasPrefix(c.Name, "nacl-") {
return "src/naclmake.bash"
}
return "src/make.bash"
}
// MakeScriptArgs returns the set of arguments that should be passed to the
// make.bash-equivalent script. Usually empty.
func (c *BuildConfig) MakeScriptArgs() []string {
return c.AllScriptArgs()
}
// RunScript returns the relative path to the operating system's script to
// run the test suite.
// Example values are "src/run.bash", "src/run.bat", "src/run.rc".
func (c *BuildConfig) RunScript() string {
if strings.HasPrefix(c.Name, "windows-") {
return "src/run.bat"
}
if strings.HasPrefix(c.Name, "plan9-") {
return "src/run.rc"
}
return "src/run.bash"
}
// RunScriptArgs returns the set of arguments that should be passed to the
// run.bash-equivalent script.
func (c *BuildConfig) RunScriptArgs() []string {
return []string{"--no-rebuild"}
}
// GorootFinal returns the default install location for
// releases for this platform.
func (c *BuildConfig) GorootFinal() string {
if strings.HasPrefix(c.Name, "windows-") {
return "c:\\go"
}
return "/usr/local/go"
}
// MachineType returns the GCE machine type to use for this builder.
func (c *HostConfig) MachineType() string {
if v := c.machineType; v != "" {
return v
}
return "n1-highcpu-2"
}
// ShortOwner returns a short human-readable owner.
func (c BuildConfig) ShortOwner() string {
owner := c.hostConf().Owner
if owner == "" {
return "go-dev"
}
return strings.TrimSuffix(owner, "@golang.org")
}
// OwnerGithub returns the Github handle of the owner.
func (c BuildConfig) OwnerGithub() string {
return c.hostConf().OwnerGithub
}
// PoolName returns a short summary of the builder's host type for the
// https://farmer.golang.org/builders page.
func (c *HostConfig) PoolName() string {
switch {
case c.IsReverse:
return "Reverse (dedicated machine/VM)"
case c.IsGCE():
return "GCE VM"
case c.IsKube():
return "Kubernetes container"
}
return "??"
}
// GCENumCPU reports the number of GCE CPUs this buildlet requires.
func (c *HostConfig) GCENumCPU() int {
t := c.MachineType()
n, _ := strconv.Atoi(t[strings.LastIndex(t, "-")+1:])
return n
}
func (c *BuildConfig) NumTestHelpers(isTry bool) int {
if isTry && c.numTryTestHelpers != 0 {
return c.numTryTestHelpers
}
return c.numTestHelpers
}
func init() {
addBuilder(BuildConfig{
Name: "freebsd-amd64-gce93",
HostType: "host-freebsd-93-gce",
})
addBuilder(BuildConfig{
Name: "freebsd-amd64-gce101",
HostType: "host-freebsd-101-gce",
TryBot: true,
numTestHelpers: 2,
numTryTestHelpers: 4,
})
addBuilder(BuildConfig{
Name: "freebsd-amd64-110",
HostType: "host-freebsd-110",
})
addBuilder(BuildConfig{
Name: "freebsd-amd64-race",
HostType: "host-freebsd-101-gce", // TODO(bradfitz): switch to FreeBSD 11? test first.
})
addBuilder(BuildConfig{
Name: "freebsd-386-gce101",
HostType: "host-freebsd-101-gce",
env: []string{"GOARCH=386", "GOHOSTARCH=386"},
})
addBuilder(BuildConfig{
Name: "freebsd-386-110",
HostType: "host-freebsd-110",
env: []string{"GOARCH=386", "GOHOSTARCH=386"},
})
addBuilder(BuildConfig{
Name: "linux-386",
HostType: "host-linux-kubestd",
TryBot: true,
env: []string{"GOARCH=386", "GOHOSTARCH=386"},
numTestHelpers: 1,
numTryTestHelpers: 3,
})
addBuilder(BuildConfig{
Name: "linux-386-387",
Notes: "GO386=387",
HostType: "host-linux-kubestd",
env: []string{"GOARCH=386", "GOHOSTARCH=386", "GO386=387"},
})
addBuilder(BuildConfig{
Name: "linux-amd64",
HostType: "host-linux-kubestd",
TryBot: true,
numTestHelpers: 3,
})
addBuilder(BuildConfig{
Name: "linux-amd64-alpine",
HostType: "host-linux-x86-alpine",
})
// Add the -vetall builder. The builder name suffix "-vetall" is recognized by cmd/dist/test.go
// to only run the "go vet std cmd" test and no others.
addBuilder(BuildConfig{
Name: "misc-vet-vetall",
HostType: "host-linux-kubestd",
Notes: "Runs vet over the standard library.",
TryBot: true,
numTestHelpers: 5,
})
addMiscCompile := func(suffix, rx string) {
addBuilder(BuildConfig{
Name: "misc-compile" + suffix,
HostType: "host-linux-kubestd",
TryBot: true,
TryOnly: true,
CompileOnly: true,
Notes: "Runs buildall.sh to cross-compile std packages for " + rx + ", but doesn't run any tests.",
allScriptArgs: []string{
// Filtering pattern to buildall.bash:
rx,
},
})
}
addMiscCompile("", "^(linux-arm64|linux-mips64.*|nacl-arm|solaris-amd64|freebsd-arm|darwin-386)$")
// TODO(bradfitz): add linux-mips* (or just make a "-mips" suffix builder) to add 32-bit
// mips, once that port is finished.
addMiscCompile("-ppc", "^(linux-ppc64|linux-ppc64le)$")
addMiscCompile("-netbsd", "^netbsd-")
addMiscCompile("-plan9", "^plan9-")
addBuilder(BuildConfig{
Name: "linux-amd64-nocgo",
HostType: "host-linux-kubestd",
Notes: "cgo disabled",
env: []string{
"CGO_ENABLED=0",
// This USER=root was required for Docker-based builds but probably isn't required
// in the VM anymore, since the buildlet probably already has this in its environment.
// (It was required because without cgo, it couldn't find the username)
"USER=root",
},
})
addBuilder(BuildConfig{
Name: "linux-amd64-noopt",
Notes: "optimizations and inlining disabled",
HostType: "host-linux-kubestd",
env: []string{"GO_GCFLAGS=-N -l"},
})
addBuilder(BuildConfig{
Name: "linux-amd64-ssacheck",
HostType: "host-linux-kubestd",
TryBot: true,
CompileOnly: true,
Notes: "SSA internal checks enabled",
env: []string{"GO_GCFLAGS=-d=ssa/check/on,dclstack"},
})
addBuilder(BuildConfig{
Name: "linux-amd64-race",
HostType: "host-linux-kubestd",
TryBot: true,
numTestHelpers: 2,
numTryTestHelpers: 5,
})
addBuilder(BuildConfig{
Name: "linux-386-clang",
HostType: "host-linux-clang",
Notes: "Debian jessie + clang 3.9 instead of gcc",
env: []string{"CC=/usr/bin/clang", "GOHOSTARCH=386"},
})
addBuilder(BuildConfig{
Name: "linux-amd64-clang",
HostType: "host-linux-clang",
Notes: "Debian jessie + clang 3.9 instead of gcc",
env: []string{"CC=/usr/bin/clang"},
})
addBuilder(BuildConfig{
Name: "linux-386-sid",
HostType: "host-linux-sid",
Notes: "Debian sid (unstable)",
env: []string{"GOHOSTARCH=386"},
})
addBuilder(BuildConfig{
Name: "linux-amd64-sid",
HostType: "host-linux-sid",
Notes: "Debian sid (unstable)",
})
addBuilder(BuildConfig{
Name: "linux-arm",
HostType: "host-linux-arm",
TryBot: true,
FlakyNet: true,
numTestHelpers: 2,
numTryTestHelpers: 7,
})
addBuilder(BuildConfig{
Name: "linux-arm-nativemake",
Notes: "runs make.bash on real ARM hardware, but does not run tests",
HostType: "host-linux-arm",
StopAfterMake: true,
})
addBuilder(BuildConfig{
Name: "linux-arm-arm5",
HostType: "host-linux-arm",
Notes: "GOARM=5, but running on newer-than GOARM=5 hardware",
FlakyNet: true,
env: []string{
"GOARM=5",
"GO_TEST_TIMEOUT_SCALE=5", // slow.
},
})
addBuilder(BuildConfig{
Name: "linux-arm-arm5spacemonkey",
HostType: "host-linux-arm5spacemonkey",
env: []string{"GOARM=5"},
})
addBuilder(BuildConfig{
Name: "nacl-386",
HostType: "host-nacl-kube",
TryBot: true,
numTestHelpers: 3,
env: []string{"GOOS=nacl", "GOARCH=386", "GOHOSTOS=linux", "GOHOSTARCH=amd64"},
})
addBuilder(BuildConfig{
Name: "nacl-amd64p32",
HostType: "host-nacl-kube",
TryBot: true,
numTestHelpers: 3,
env: []string{"GOOS=nacl", "GOARCH=amd64p32", "GOHOSTOS=linux", "GOHOSTARCH=amd64"},
})
addBuilder(BuildConfig{
Name: "openbsd-amd64-60",
HostType: "host-openbsd-amd64-60",
TryBot: true,
numTestHelpers: 2,
numTryTestHelpers: 5,
})
addBuilder(BuildConfig{
Name: "openbsd-386-60",
HostType: "host-openbsd-386-60",
})
addBuilder(BuildConfig{
Name: "netbsd-amd64-71",
HostType: "host-netbsd-71",
})
addBuilder(BuildConfig{
Name: "netbsd-386-71",
HostType: "host-netbsd-71",
env: []string{"GOARCH=386", "GOHOSTARCH=386"},
})
addBuilder(BuildConfig{
Name: "plan9-386",
HostType: "host-plan9-386-gce",
numTestHelpers: 1,
})
addBuilder(BuildConfig{
Name: "windows-amd64-gce",
HostType: "host-windows-gce",
env: []string{"GOARCH=amd64", "GOHOSTARCH=amd64"},
TryBot: true,
numTestHelpers: 1,
numTryTestHelpers: 5,
})
addBuilder(BuildConfig{
Name: "windows-amd64-race",
HostType: "host-windows-gce",
Notes: "Only runs -race tests (./race.bat)",
env: []string{"GOARCH=amd64", "GOHOSTARCH=amd64"},
})
addBuilder(BuildConfig{
Name: "windows-386-gce",
HostType: "host-windows-gce",
env: []string{"GOARCH=386", "GOHOSTARCH=386"},
TryBot: true,
numTestHelpers: 1,
numTryTestHelpers: 5,
})
addBuilder(BuildConfig{
Name: "darwin-amd64-10_8",
HostType: "host-darwin-10_8",
})
addBuilder(BuildConfig{
Name: "darwin-amd64-10_10",
HostType: "host-darwin-10_10",
})
addBuilder(BuildConfig{
Name: "darwin-amd64-10_11",
HostType: "host-darwin-10_11",
TryBot: true,
numTestHelpers: 2,
numTryTestHelpers: 3,
})
addBuilder(BuildConfig{
Name: "darwin-amd64-10_12",
HostType: "host-darwin-10_12",
})
addBuilder(BuildConfig{
Name: "android-arm-sdk19",
Notes: "Android ARM device running android-19 (KitKat 4.4), attatched to Mac Mini",
env: []string{"GOOS=android", "GOARCH=arm"},
})
addBuilder(BuildConfig{
Name: "android-arm64-sdk21",
Notes: "Android arm64 device using the android-21 toolchain, attatched to Mac Mini",
env: []string{"GOOS=android", "GOARCH=arm64"},
})
addBuilder(BuildConfig{
Name: "android-386-sdk21",
Notes: "Android 386 device using the android-21 toolchain, attatched to Mac Mini",
env: []string{"GOOS=android", "GOARCH=386"},
})
addBuilder(BuildConfig{
Name: "android-amd64-sdk21",
Notes: "Android amd64 device using the android-21 toolchain, attatched to Mac Mini",
env: []string{"GOOS=android", "GOARCH=amd64"},
})
addBuilder(BuildConfig{
Name: "darwin-arm-a5ios",
Notes: "iPhone 4S (A5 processor), via a Mac Mini; owned by crawshaw",
env: []string{"GOARCH=arm", "GOHOSTARCH=amd64"},
})
addBuilder(BuildConfig{
Name: "darwin-arm64-a7ios",
Notes: "iPad Mini 3 (A7 processor), via a Mac Mini; owned by crawshaw",
env: []string{"GOARCH=arm64", "GOHOSTARCH=amd64"},
})
addBuilder(BuildConfig{
Name: "darwin-arm-a1549ios",
HostType: "host-darwin-amd64-eliasnaur-ios",
Notes: "iPhone 6 (model A1549), via a Mac Mini; owned by elias.naur",
env: []string{"GOARCH=arm"},
})
addBuilder(BuildConfig{
Name: "darwin-arm64-a1549ios",
HostType: "host-darwin-amd64-eliasnaur-ios",
Notes: "iPhone 6 (model A1549), via a Mac Mini; owned by elias.naur",
env: []string{"GOARCH=arm64"},
})
addBuilder(BuildConfig{
Name: "android-arm-wiko-fever",
HostType: "host-darwin-amd64-eliasnaur-android",
Notes: "Android Wiko Fever phone running Android 6.0, via a Mac Mini",
env: []string{
"GOARCH=arm",
"GOARM=7",
"CC_FOR_TARGET=/Users/elias/android-ndk-standalone-arm/bin/clang",
},
})
addBuilder(BuildConfig{
Name: "android-arm64-wiko-fever",
HostType: "host-darwin-amd64-eliasnaur-android",
Notes: "Android Wiko Fever phone running Android 6.0, via a Mac Mini",
env: []string{
"GOARCH=arm64",
"CC_FOR_TARGET=/Users/elias/android-ndk-standalone-arm64/bin/clang",
},
})
addBuilder(BuildConfig{
Name: "solaris-amd64-smartosbuildlet",
HostType: "host-solaris-amd64",
})
addBuilder(BuildConfig{
Name: "linux-ppc64-buildlet",
HostType: "host-linux-ppc64-osu",
FlakyNet: true,
})
addBuilder(BuildConfig{
Name: "linux-ppc64le-buildlet",
HostType: "host-linux-ppc64le-osu",
FlakyNet: true,
})
addBuilder(BuildConfig{
Name: "linux-arm64-buildlet",
HostType: "host-linux-arm64-linaro",
FlakyNet: true,
})
addBuilder(BuildConfig{
Name: "linux-arm64-packet",
HostType: "host-linux-arm64-packet",
FlakyNet: true, // unknown; just copied from the linaro one
})
addBuilder(BuildConfig{
Name: "linux-mips",
HostType: "host-linux-mips",
SkipSnapshot: true,
})
addBuilder(BuildConfig{
Name: "linux-mipsle",
HostType: "host-linux-mipsle",
SkipSnapshot: true,
})
addBuilder(BuildConfig{
Name: "linux-mips64",
HostType: "host-linux-mips64",
SkipSnapshot: true,
})
addBuilder(BuildConfig{
Name: "linux-mips64le",
HostType: "host-linux-mips64le",
SkipSnapshot: true,
})
addBuilder(BuildConfig{
Name: "linux-s390x-ibm",
HostType: "host-linux-s390x",
numTestHelpers: 0,
})
addBuilder(BuildConfig{
Name: "linux-s390x-crosscompile",
HostType: "host-s390x-cross-kube",
Notes: "s390x cross-compile builder for releases; doesn't run tests",
CompileOnly: true,
TryOnly: true, // but not in trybot set for now
env: []string{
"CGO_ENABLED=1",
"GOARCH=s390x",
"GOHOSTARCH=amd64",
"CC_FOR_TARGET=s390x-linux-gnu-gcc",
},
})
}
func (c BuildConfig) isMobile() bool {
return strings.HasPrefix(c.Name, "android-") || strings.HasPrefix(c.Name, "darwin-arm")
}
// addBuilder adds c to the Builders map after doing some sanity
// checks.
func addBuilder(c BuildConfig) {
if c.Name == "" {
panic("empty name")
}
if c.isMobile() && c.HostType == "" {
htyp := "host-" + c.Name
if _, ok := Hosts[htyp]; !ok {
Hosts[htyp] = &HostConfig{
HostType: htyp,
IsReverse: true,
goBootstrapURLTmpl: "https://storage.googleapis.com/$BUCKET/go1.4-darwin-amd64.tar.gz",
ReverseAliases: []string{c.Name},
}
c.HostType = htyp
}
}
if c.HostType == "" {
panic(fmt.Sprintf("missing HostType for builder %q", c.Name))
}
if _, dup := Builders[c.Name]; dup {
panic("dup name")
}
if _, ok := Hosts[c.HostType]; !ok {
panic(fmt.Sprintf("undefined HostType %q for builder %q", c.HostType, c.Name))
}
if c.SkipSnapshot && (c.numTestHelpers > 0 || c.numTryTestHelpers > 0) {
panic(fmt.Sprintf("config %q's SkipSnapshot is not compatible with sharded test helpers", c.Name))
}
types := 0
for _, fn := range []func() bool{c.IsReverse, c.IsKube, c.IsGCE} {
if fn() {
types++
}
}
if types != 1 {
panic(fmt.Sprintf("build config %q host type inconsistent (must be Reverse, Kube, or GCE)", c.Name))
}
Builders[c.Name] = c
}
// TrybotBuilderNames returns the names of the builder configs
// with the TryBot field set true.
func TrybotBuilderNames() []string {
var ret []string
for name, conf := range Builders {
if conf.TryBot {
ret = append(ret, name)
}
}
sort.Strings(ret)
return ret
}