golang.org/x/build@v0.0.0-20240506185731-218518f32b70/types/types.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package types contains common types used by the Go continuous build 6 // system. 7 package types 8 9 import "time" 10 11 // BuildStatus is the data structure that's marshalled as JSON 12 // for the https://build.golang.org/?mode=json page. 13 type BuildStatus struct { 14 // Builders is a list of all known builders. 15 // The order that builders appear is the same order as the build results for a revision. 16 Builders []string `json:"builders"` 17 18 // Revisions are the revisions shown on the front page of build.golang.org, 19 // in the same order. It starts with the "go" repo, from recent to old, and then 20 // it has 1 each of the subrepos, with only their most recent commit. 21 Revisions []BuildRevision `json:"revisions"` 22 } 23 24 // BuildRevision is the status of a commit across all builders. 25 // It corresponds to a single row of https://build.golang.org/ 26 type BuildRevision struct { 27 // Repo is "go" for the main repo, else "tools", "crypto", "net", etc. 28 // These are repos as listed at https://go.googlesource.com/ 29 Repo string `json:"repo"` 30 31 // Revision is the full git hash of the repo. 32 Revision string `json:"revision"` 33 34 // GoRevision is the full git hash of the "go" repo, if Repo is not "go" itself. 35 // Otherwise this is empty. 36 GoRevision string `json:"goRevision,omitempty"` 37 38 // Date is the commit date of this revision, formatted in RFC3339. 39 Date string `json:"date"` 40 41 // Branch is the branch of this commit, e.g. "master" or "dev.ssa". 42 Branch string `json:"branch"` 43 44 // GoBranch is the branch of the GoRevision, for subrepos. 45 // It is empty for the main repo. 46 // Otherwise it's of the form "master", "release-branch.go1.8", etc. 47 GoBranch string `json:"goBranch,omitempty"` 48 49 // Author is the author of this commit in standard git form 50 // "Name <email>". 51 Author string `json:"author"` 52 53 // Desc is the commit message of this commit. It may be 54 // truncated. 55 Desc string `json:"desc"` 56 57 // Results are the build results for each of the builders in 58 // the same length slice BuildStatus.Builders. 59 // Each string is either "" (if no data), "ok", or the URL to failure logs. 60 Results []string `json:"results"` 61 } 62 63 // SpanRecord is a datastore entity we write only at the end of a span 64 // (roughly a "step") of the build. 65 type SpanRecord struct { 66 BuildID string 67 IsTry bool // is trybot run 68 GoRev string 69 Rev string // same as GoRev for repo "go" 70 Repo string // "go", "net", etc. 71 Builder string // "linux-amd64-foo" 72 OS string // "linux" 73 Arch string // "amd64" 74 75 Event string 76 Error string // empty for no error 77 Detail string 78 StartTime time.Time 79 EndTime time.Time 80 Seconds float64 81 } 82 83 // BuildRecord is the datastore entity we write both at the beginning 84 // and end of a build. Some fields are not updated until the end. 85 type BuildRecord struct { 86 ID string 87 ProcessID string 88 StartTime time.Time 89 IsTry bool // is trybot run 90 IsSlowBot bool // is an explicitly requested "slowbot" builder 91 GoRev string 92 Rev string // same as GoRev for repo "go" 93 Repo string // "go", "net", etc. 94 Builder string // "linux-amd64-foo" 95 ContainerHost string // "" means GKE; "cos" means Container-Optimized OS 96 OS string // "linux" 97 Arch string // "amd64" 98 99 EndTime time.Time 100 Seconds float64 101 Result string // empty string, "ok", "fail" 102 FailureURL string `datastore:",noindex"` // deprecated; use LogURL 103 LogURL string `datastore:",noindex"` 104 105 // TODO(bradfitz): log which reverse buildlet we got? 106 // Buildlet string 107 } 108 109 type ReverseBuilder struct { 110 Name string 111 HostType string 112 ConnectedSec float64 113 IdleSec float64 `json:",omitempty"` 114 BusySec float64 `json:",omitempty"` 115 Version string // buildlet version 116 Busy bool 117 } 118 119 // ReverseHostStatus is part of ReverseBuilderStatus. 120 type ReverseHostStatus struct { 121 HostType string // dashboard.Hosts key 122 Connected int // number of connected buildlets 123 Expect int // expected number, from dashboard.Hosts config 124 Idle int 125 Busy int 126 Waiters int // number of builds waiting on a buildlet host of this type 127 128 // Machines are all connected buildlets of this host type, 129 // keyed by machine self-reported unique name. 130 Machines map[string]*ReverseBuilder 131 } 132 133 // ReverseBuilderStatus is https://farmer.golang.org/status/reverse.json 134 // 135 // It is used by monitoring and the Mac VMWare infrastructure to 136 // adjust the Mac VMs based on deaths and demand. 137 type ReverseBuilderStatus struct { 138 // Machines maps from the connected builder name (anything unique) to its status. 139 HostTypes map[string]*ReverseHostStatus 140 } 141 142 func (s *ReverseBuilderStatus) Host(hostType string) *ReverseHostStatus { 143 if s.HostTypes == nil { 144 s.HostTypes = make(map[string]*ReverseHostStatus) 145 } 146 hs, ok := s.HostTypes[hostType] 147 if ok { 148 return hs 149 } 150 hs = &ReverseHostStatus{HostType: hostType} 151 s.HostTypes[hostType] = hs 152 return hs 153 } 154 155 // MajorMinor is a major-minor version pair. 156 type MajorMinor struct { 157 Major, Minor int 158 } 159 160 // Less reports whether a is less than b. 161 func (a MajorMinor) Less(b MajorMinor) bool { 162 if a.Major != b.Major { 163 return a.Major < b.Major 164 } 165 return a.Minor < b.Minor 166 } 167 168 // BuildletWaitStatus is the periodic messages we send to "gomote create" 169 // clients or show on trybot status pages to tell the user who long 170 // they're expected to wait. 171 type BuildletWaitStatus struct { 172 // Message is a free-form message to send to the user's gomote binary. 173 // If present, all other fields are ignored. 174 Message string `json:"message"` 175 176 // Ahead are the number of waiters ahead of this buildlet request. 177 Ahead int `json:"ahead"` 178 179 // TODO: add number of active builds, and number of builds 180 // creating. And for how long. And maybe an estimate of how 181 // long those builds typically take? But recognize which are 182 // dynamic vs static (reverse) builder types and don't say 183 // that "1 is creating" on a reverse buildlet that can't 184 // actually "create" any. (It can just wait for one register 185 // itself) 186 } 187 188 // ActivePostSubmitBuild is a summary of an active build that the 189 // coordinator's doing. Each one is rendered on build.golang.org as a 190 // blue gopher which links to StatusURL to watch the build live. 191 type ActivePostSubmitBuild struct { 192 Builder string `json:"builder"` // "linux-amd64" 193 Commit string `json:"commit"` // hash of commit being tested 194 GoCommit string `json:"goCommit,omitempty"` // hash of Go commit, or empty for the main repo 195 StatusURL string `json:"statusURL"` 196 }