// GetBuildForCommit returns the build number of the build which included the // given commit, or -1 if no such build exists. It is used by the buildbot // package's FindCommitsForBuild function. func (bf *buildFinder) GetBuildForCommit(builder, master, hash string) (int, error) { if b, ok := bf.buildsByCommit[hash]; ok { return b.Number, nil } // Fall back on getting the build from the database. b, err := buildbot.GetBuildForCommit(builder, master, hash) if err != nil { return -1, fmt.Errorf("Failed to get build for %s at %s: %v", builder, hash[0:7], err) } return b, nil }
// step does a single step in ingesting builds from tradefed and pushing the results into the buildbot database. func step(targets []string, buildService *androidbuildinternal.Service, repos *gitinfo.RepoMap) { glog.Errorf("step: Begin") if err := repos.Update(); err != nil { glog.Errorf("Failed to update repos: %s", err) return } // Loop over every target and look for skia commits in the builds. for _, target := range targets { r, err := buildService.Build.List().Branch(SKIA_BRANCH).BuildType("submitted").Target(target).ExtraFields("changeInfo").MaxResults(40).Do() if err != nil { glog.Errorf("Failed to load internal builds: %v", err) continue } // Iterate over the builds in reverse order so we ingest the earlier Git // hashes first and the more recent Git hashes later. for i := len(r.Builds) - 1; i >= 0; i-- { b := r.Builds[i] commits := androidbuild.CommitsFromChanges(b.Changes) glog.Infof("Commits: %#v", commits) if len(commits) > 0 { var cachedBuild *buildbot.Build = nil // Only look at the first commit in the list. The commits always appear in reverse chronological order, so // the 0th entry is the most recent commit. c := commits[0] // Create a buildbot.Build from the build info. key, build := buildFromCommit(b, c) glog.Infof("Key: %s Hash: %s", key, c.Hash) // Store build.Builder (the codename) with its pair build.Target.Name in a local leveldb to serve redirects. if err := codenameDB.Put([]byte(build.Builder), []byte(b.Target.Name), nil); err != nil { glog.Errorf("Failed to write codename to data store: %s", err) } buildNumber, err := buildbot.GetBuildForCommit(build.Builder, build.Master, c.Hash) if err != nil { glog.Errorf("Failed to find the build in the database: %s", err) continue } glog.Infof("GetBuildForCommit at hash: %s returned %d", c.Hash, buildNumber) if buildNumber != -1 { cachedBuild, err = buildbot.GetBuildFromDB(build.Builder, build.Master, buildNumber) if err != nil { glog.Errorf("Failed to retrieve build from database: %s", err) continue } } if cachedBuild == nil { // This is a new build we've never seen before, so add it to the buildbot database. // First calculate a new unique build.Number. number, err := buildbot.GetMaxBuildNumber(build.Builder) if err != nil { glog.Infof("Failed to find next build number: %s", err) continue } build.Number = number + 1 if err := buildbot.IngestBuild(build, repos); err != nil { glog.Errorf("Failed to ingest build: %s", err) continue } cachedBuild = build } // If the state of the build has changed then write it to the buildbot database. if buildsDiffer(build, cachedBuild) { // If this was a failure then we need to check that there is a mirror // failure on the main branch, at which point we will say that this // is a warning. if build.Results == buildbot.BUILDBOT_FAILURE && brokenOnMaster(buildService, target, b.BuildId) { build.Results = buildbot.BUILDBOT_WARNING } cachedBuild.Results = build.Results cachedBuild.Finished = build.Finished glog.Infof("Writing updated build to the database: %s %d", cachedBuild.Builder, cachedBuild.Number) if err := buildbot.IngestBuild(cachedBuild, repos); err != nil { glog.Errorf("Failed to ingest build: %s", err) } } } liveness.Update() } } }