dashboard/coordinator: notify dashboard when we're building

Fixes golang/go#9494

Change-Id: Ib9451d41b2dd02d30d2efddbc0ec410a34bdb42c
Reviewed-on: https://go-review.googlesource.com/2583
Reviewed-by: Andrew Gerrand <adg@golang.org>
This commit is contained in:
Brad Fitzpatrick 2015-01-08 15:34:45 -08:00
parent 5f779d76c1
commit e083199384
1 changed files with 29 additions and 0 deletions

View File

@ -80,6 +80,7 @@ var (
projectID string projectID string
projectZone string projectZone string
computeService *compute.Service computeService *compute.Service
externalIP string
) )
func initGCE() error { func initGCE() error {
@ -101,6 +102,10 @@ func initGCE() error {
return errors.New("The coordinator is not running with access to read and write Compute resources. VM support disabled.") return errors.New("The coordinator is not running with access to read and write Compute resources. VM support disabled.")
} }
externalIP, err = metadata.ExternalIP()
if err != nil {
return fmt.Errorf("ExternalIP: %v", err)
}
ts := google.ComputeTokenSource("default") ts := google.ComputeTokenSource("default")
computeService, _ = compute.New(oauth2.NewClient(oauth2.NoContext, ts)) computeService, _ = compute.New(oauth2.NewClient(oauth2.NoContext, ts))
return nil return nil
@ -163,6 +168,29 @@ func (b *buildConfig) recordResult(ok bool, hash, buildLog string, runTime time.
return dash("POST", "result", args, req, nil) return dash("POST", "result", args, req, nil)
} }
// pingDashboard is a goroutine that periodically POSTS to build.golang.org/building
// to let it know that we're still working on a build.
func pingDashboard(st *buildStatus) {
u := "https://build.golang.org/building?" + url.Values{
"builder": []string{st.name},
"key": []string{builderKey(st.name)},
"hash": []string{st.rev},
"url": []string{fmt.Sprintf("http://%v/logs?name=%s&rev=%s&st=%p", externalIP, st.name, st.rev, st)},
}.Encode()
for {
st.mu.Lock()
done := st.done
st.mu.Unlock()
if !done.IsZero() {
return
}
if res, _ := http.PostForm(u, nil); res != nil {
res.Body.Close()
}
time.Sleep(60 * time.Second)
}
}
type watchConfig struct { type watchConfig struct {
repo string // "https://go.googlesource.com/go" repo string // "https://go.googlesource.com/go"
dash string // "https://build.golang.org/" (must end in /) dash string // "https://build.golang.org/" (must end in /)
@ -290,6 +318,7 @@ func main() {
conf := builders[work.name] conf := builders[work.name]
if st, err := startBuilding(conf, work.rev); err == nil { if st, err := startBuilding(conf, work.rev); err == nil {
setStatus(work, st) setStatus(work, st)
go pingDashboard(st)
} else { } else {
log.Printf("Error starting to build %v: %v", work, err) log.Printf("Error starting to build %v: %v", work, err)
} }