Exemple #1
0
    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 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)
Exemple #5
0
    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
Exemple #6
0
    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
Exemple #7
0
 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 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