def getHeadBuild(self, builder): """Get the most recent build for the given builder. """ build = builder.getBuild(-1) # HACK: Work around #601, the head build may be None if it is # locked. if build is None: build = builder.getBuild(-2) return build
def fn(session): # pr = yield db.prcc.getPullRequest(prid) builders = self.context.master.botmaster.builders builder = builders.get(self.name, None) # : type builder: buildbot.process.builder.Builder assert isinstance(builder, Builder) b = builder.getBuild(build.number) bstatus = db.scc.getStatusForBuildRequest(prid, self.bid, b.requests[0].id) if not bstatus: # TODO Workaround logger.warning("buildStarted(%s): #PR%s: can't find build status. Ignore" % (builderName, prid)) return sha = properties.getProperty('head_sha', None) if sha != bstatus.head_sha: logger.error('buildStarted(%s): #PR%d: wrong commit hash (build %s vs expected %s). Ignore' % (builderName, prid, sha, bstatus.head_sha)) return logger.info('buildStarted(%s): #PR%d' % (builderName, prid)) bstatus.status = BuildStatus.BUILDING bstatus.build_number = build.number db.scc.updateStatus(bstatus) if not bstatus.active: logger.warning('buildStarted(%s): #PR%d. Stop inactive build' % (builderName, prid)) try: logger.info("Cancel build #%s on %s..." % (bstatus.build_number, builderName)) @defer.inlineCallbacks def cancel(): yield b.stopBuild("canceled by PR service (run inactive)") yield mainThreadCall(cancel) except: log.err()
def getChild(self, path, request): if path == "delete": return DeleteProject(self.project) builder = self.getStatus(request).getBuilder(self.project) build = builder.getBuild(int(path)) if build: return Build(build) return HtmlResource.getChild(self, path, request)
def getBuildsForRevision(self, request, builder, builderName, lastRevision, numBuilds, debugInfo): """Return the list of all the builds for a given builder that we will need to be able to display the console page. We start by the most recent build, and we go down until we find a build that was built prior to the last change we are interested in.""" revision = lastRevision builds = [] build = self.getHeadBuild(builder) number = 0 while build and number < numBuilds: debugInfo["builds_scanned"] += 1 number += 1 # Get the last revision in this build. # We first try "got_revision", but if it does not work, then # we try "revision". got_rev = -1 try: got_rev = build.getProperty("got_revision") if not self.comparator.isValidRevision(got_rev): got_rev = -1 except KeyError: pass try: if got_rev == -1: got_rev = build.getProperty("revision") if not self.comparator.isValidRevision(got_rev): got_rev = -1 except: pass # We ignore all builds that don't have last revisions. # TODO(nsylvain): If the build is over, maybe it was a problem # with the update source step. We need to find a way to tell the # user that his change might have broken the source update. if got_rev and got_rev != -1: details = self.getBuildDetails(request, builderName, build) devBuild = DevBuild(got_rev, build.getResults(), build.getNumber(), build.isFinished(), build.getText(), build.getETA(), details, build.getTimes()[0]) builds.append(devBuild) # Now break if we have enough builds. current_revision = self.getChangeForBuild( builder.getBuild(-1), revision) if self.comparator.isRevisionEarlier( devBuild, current_revision): break build = build.getPreviousBuild() return builds
def getBuildsForRevision(self, request, builder, builderName, lastRevision, numBuilds, debugInfo): """Return the list of all the builds for a given builder that we will need to be able to display the console page. We start by the most recent build, and we go down until we find a build that was built prior to the last change we are interested in.""" revision = lastRevision cachedRevision = self.cache.getRevision(builderName) if cachedRevision and cachedRevision > lastRevision: revision = cachedRevision builds = [] build = self.getHeadBuild(builder) number = 0 while build and number < numBuilds: debugInfo["builds_scanned"] += 1 number += 1 # Get the last revision in this build. # We first try "got_revision", but if it does not work, then # we try "revision". got_rev = -1 try: got_rev = build.getProperty("got_revision") if not self.comparator.isValidRevision(got_rev): got_rev = -1 except KeyError: pass try: if got_rev == -1: got_rev = build.getProperty("revision") if not self.comparator.isValidRevision(got_rev): got_rev = -1 except: pass # We ignore all builds that don't have last revisions. # TODO(nsylvain): If the build is over, maybe it was a problem # with the update source step. We need to find a way to tell the # user that his change might have broken the source update. if got_rev and got_rev != -1: details = self.getBuildDetails(request, builderName, build) devBuild = DevBuild(got_rev, build.getResults(), getInProgressResults(build), build.getNumber(), build.isFinished(), build.getText(), build.getETA(), details, build.getTimes()[0]) builds.append(devBuild) # Now break if we have enough builds. if self.comparator.getSortingKey() == "when": current_revision = self.getChangeForBuild( builder.getBuild(-1), revision) if self.comparator.isRevisionEarlier( devBuild, current_revision): break else: if int(got_rev) < int(revision): break build = build.getPreviousBuild() return builds
def getHeadBuild(self, builder): """ Get the most recent build for the given builder. """ build = builder.getBuild(-1) if build is None: build = builder.getBuild(-2) return build
def fn(session): builderNames = buildStatus.builder.builders master = context.master # : :type master: buildbot.master.BuildMaster if buildStatus.status in [constants.BuildStatus.INQUEUE]: buildStatus.active = False return elif buildStatus.status in [constants.BuildStatus.SCHEDULING]: buildStatus.active = False return elif buildStatus.status in [constants.BuildStatus.SCHEDULED]: logger.info("Cancel scheduled build: PR=%s, builders=%s" % (buildStatus.pr.prid, ','.join(builderNames))) buildStatus.active = False session.commit() builders = master.botmaster.builders found = False for bName in builderNames: builder = builders.get(bName, None) # : type builder: buildbot.process.builder.Builder if builder is None: continue assert isinstance(builder, Builder) builder_status = builder.builder_status assert isinstance(builder_status, BuilderStatus) pendings = yield mainThreadCall(builder_status.getPendingBuildRequestStatuses) if len(pendings) > 0: for pending in pendings: assert isinstance(pending, BuildRequestStatus) if pending.brid == buildStatus.brid: found = True try: @defer.inlineCallbacks def cancel(): buildrequest = yield pending._getBuildRequest() assert isinstance(buildrequest, buildbot.process.buildrequest.BuildRequest) yield buildrequest.cancelBuildRequest() logger.info("Build request for PR #%s (on %s) canceled" % (buildStatus.pr.prid, bName)) yield mainThreadCall(cancel) except: log.err('during canceling build') raise if not found: logger.info("Can't find pending build: PR=%s, builders=%s" % (buildStatus.pr.prid, ','.join(builderNames))) return elif buildStatus.status in [constants.BuildStatus.BUILDING]: builders = master.botmaster.builders logger.info("Stop processing build: PR=%s, builders=%s" % (buildStatus.pr.prid, ','.join(builderNames))) for bName in builderNames: builder = builders.get(bName, None) # : type builder: buildbot.process.builder.Builder if builder is None: continue assert isinstance(builder, Builder) build = builder.getBuild(buildStatus.build_number) if build: try: assert isinstance(build, buildbot.process.build.Build) logger.info("Cancel build #%s on %s" % (buildStatus.build_number, bName)) @defer.inlineCallbacks def cancel(): yield build.stopBuild("canceled by PR service") yield mainThreadCall(cancel) except: log.err() return elif buildStatus.status >= constants.BuildStatus.SUCCESS: pr = buildStatus.pr logger.info("Build was already finished with status=%s: PR=%s, builders=%s" % (BuildStatus.toString[buildStatus.status], pr.prid, ','.join(builderNames))) return assert False