def test_compare_username(self):
     self.assertNotEqual(
         ForceScheduler(name="testched", builderNames=[]),
         ForceScheduler(name="testched", builderNames=[],
                        username=FixedParameter("username", "The Fisher King <*****@*****.**>")))
 def test_compare_properties(self):
     self.assertNotEqual(
         ForceScheduler(name="testched", builderNames=[],
                        properties=[]),
         ForceScheduler(name="testched", builderNames=[],
                        properties=[FixedParameter("prop", "thanks for the fish!")]))
示例#3
0
def loadBuilderConfig(c, is_test_mode_enabled=False):
    # FIXME: These file handles are leaked.
    if is_test_mode_enabled:
        passwords = {}
    else:
        passwords = json.load(open('passwords.json'))
    results_server_api_key = passwords.get('results-server-api-key')
    if results_server_api_key:
        os.environ['RESULTS_SERVER_API_KEY'] = results_server_api_key

    config = json.load(open('config.json'))
    if USE_BUILDBOT_VERSION2:
        c['workers'] = [
            Worker(worker['name'],
                   passwords.get(worker['name'], 'password'),
                   max_builds=1) for worker in config['workers']
        ]
    else:
        c['slaves'] = [
            BuildSlave(worker['name'],
                       passwords.get(worker['name'], 'password'),
                       max_builds=1) for worker in config['workers']
        ]

    c['schedulers'] = []
    for scheduler in config['schedulers']:
        if "change_filter" in scheduler:
            scheduler["change_filter"] = globals()[scheduler["change_filter"]]
        schedulerClassName = scheduler.pop('type')
        schedulerClass = globals()[schedulerClassName]
        c['schedulers'].append(schedulerClass(**scheduler))

    # Setup force schedulers
    builderNames = [str(builder['name']) for builder in config['builders']]
    reason = StringParameter(name='reason', default='', size=40)
    properties = [BooleanParameter(name='is_clean', label='Force Clean build')]
    if USE_BUILDBOT_VERSION2:
        forceScheduler = ForceScheduler(name='force',
                                        builderNames=builderNames,
                                        reason=reason,
                                        properties=properties)
    else:
        forceScheduler = ForceScheduler(
            name='force',
            builderNames=builderNames,
            reason=reason,

            # Validate SVN revision: number or empty string
            revision=StringParameter(name="revision",
                                     default="",
                                     regex=re.compile(r'^(\d*)$')),

            # Disable default enabled input fields: branch, repository, project, additional properties
            branch=FixedParameter(name="branch"),
            repository=FixedParameter(name="repository"),
            project=FixedParameter(name="project"),
            properties=properties)
    c['schedulers'].append(forceScheduler)

    c['builders'] = []
    for builder in config['builders']:
        for workerName in builder['workernames']:
            for worker in config['workers']:
                if worker['name'] != workerName or worker['platform'] == '*':
                    continue

                if worker['platform'] != builder['platform']:
                    raise Exception(
                        'Builder {} is for platform {} but has worker {} for platform {}!'
                        .format(builder['name'], builder['platform'],
                                worker['name'], worker['platform']))
                break

        if not USE_BUILDBOT_VERSION2:
            builder['slavenames'] = builder.pop('workernames')
        platform = builder['platform']

        factoryName = builder.pop('factory')
        factory = globals()[factoryName]
        factorykwargs = {}
        for key in "platform", "configuration", "architectures", "triggers", "additionalArguments", "device_model":
            value = builder.pop(key, None)
            if value:
                factorykwargs[key] = value

        builder["factory"] = factory(**factorykwargs)

        builder_name = builder['name']
        if len(builder_name) > BUILDER_NAME_LENGTH_LIMIT:
            raise Exception(
                'Builder name "{}" is longer than maximum allowed by Buildbot ({} characters).'
                .format(builder_name, BUILDER_NAME_LENGTH_LIMIT))
        if not buildbot_identifiers_re.match(builder_name):
            raise Exception(
                'Builder name "{}" is not a valid buildbot identifier.'.format(
                    builder_name))
        for step in builder["factory"].steps:
            if USE_BUILDBOT_VERSION2:
                step_name = step.buildStep().name
            else:
                step_name = step[0].name
            if len(step_name) > STEP_NAME_LENGTH_LIMIT:
                raise Exception(
                    'step name "{}" is longer than maximum allowed by Buildbot ({} characters).'
                    .format(step_name, STEP_NAME_LENGTH_LIMIT))
            if not buildbot_identifiers_re.match(step_name):
                raise Exception(
                    'step name "{}" is not a valid buildbot identifier.'.
                    format(step_name))

        if platform.startswith('mac'):
            category = 'AppleMac'
        elif platform.startswith('ios'):
            category = 'iOS'
        elif platform == 'win':
            category = 'AppleWin'
        elif platform.startswith('gtk'):
            category = 'GTK'
        elif platform.startswith('wpe'):
            category = 'WPE'
        elif platform == 'wincairo':
            category = 'WinCairo'
        elif platform.startswith('playstation'):
            category = 'PlayStation'
        else:
            category = 'misc'

        if (category in ('AppleMac', 'AppleWin',
                         'iOS')) and factoryName != 'BuildFactory':
            builder['nextBuild'] = pickLatestBuild

        if USE_BUILDBOT_VERSION2:
            builder['tags'] = getTagsForBuilder(builder)
        else:
            builder['category'] = category
        c['builders'].append(builder)
 def test_compare_reason(self):
     self.assertNotEqual(
         ForceScheduler(name="testched", builderNames=[],
                        reason=FixedParameter("reason", "no fish for you!")),
         ForceScheduler(name="testched", builderNames=[],
                        reason=FixedParameter("reason", "thanks for the fish!")))
示例#5
0
def loadBuilderConfig(c):
    # FIXME: These file handles are leaked.
    passwords = json.load(open('passwords.json'))
    config = json.load(open('config.json'))

    c['slaves'] = [BuildSlave(slave['name'], passwords[slave['name']], max_builds=1) for slave in config['slaves']]

    c['schedulers'] = []
    for scheduler in config['schedulers']:
        if "change_filter" in scheduler:
            scheduler["change_filter"] = globals()[scheduler["change_filter"]]
        kls = globals()[scheduler.pop('type')]
        # Python 2.6 can't handle unicode keys as keyword arguments:
        # http://bugs.python.org/issue2646.  Modern versions of json return
        # unicode strings from json.load, so we map all keys to str objects.
        scheduler = dict(map(lambda key_value_pair: (str(key_value_pair[0]), key_value_pair[1]), scheduler.items()))

        c['schedulers'].append(kls(**scheduler))

    forceScheduler = ForceScheduler(
        name="force",
        builderNames=[str(builder['name']) for builder in config['builders']],
        reason=StringParameter(name="reason", default="", size=40),

        # Validate SVN revision: number or empty string
        revision=StringParameter(name="revision", default="", regex=re.compile(r'^(\d*)$')),

        # Disable default enabled input fields: branch, repository, project, additional properties
        branch=FixedParameter(name="branch"),
        repository=FixedParameter(name="repository"),
        project=FixedParameter(name="project"),
        properties=[BooleanParameter(name="is_clean", label="Force Clean build")]
    )
    c['schedulers'].append(forceScheduler)

    c['builders'] = []
    for builder in config['builders']:
        for slaveName in builder['slavenames']:
            for slave in config['slaves']:
                if slave['name'] != slaveName or slave['platform'] == '*':
                    continue

                if slave['platform'] != builder['platform']:
                    raise Exception, "Builder %r is for platform %r but has slave %r for platform %r!" % (builder['name'], builder['platform'], slave['name'], slave['platform'])

                break

        platform = builder['platform']

        builderType = builder.pop('type')
        factory = globals()["%sFactory" % builderType]
        factorykwargs = {}
        for key in "platform", "configuration", "architectures", "triggers", "additionalArguments", "SVNMirror":
            value = builder.pop(key, None)
            if value:
                factorykwargs[key] = value

        builder["factory"] = factory(**factorykwargs)

        if platform.startswith('mac'):
            builder["category"] = 'AppleMac'
        elif platform.startswith('ios'):
            builder['category'] = 'iOS'
        elif platform == 'win':
            builder["category"] = 'AppleWin'
        elif platform.startswith('gtk'):
            builder["category"] = 'GTK'
        elif platform.startswith('wpe'):
            builder["category"] = 'WPE'
        else:
            builder["category"] = 'misc'

        if (builder['category'] in ('AppleMac', 'AppleWin', 'iOS')) and builderType != 'Build':
            builder['nextBuild'] = pickLatestBuild

        c['builders'].append(builder)
 def test_compare_branch(self):
     self.assertNotEqual(
         ForceScheduler(name="testched", builderNames=[]),
         ForceScheduler(name="testched",
                        builderNames=[],
                        branch=FixedParameter("branch", "fishing/pole")))
示例#7
0
    def addSimpleProject(self, name, category, repourl, builderconfigs):
        """Private.
        Add a project which builds when the source changes or when Force is clicked.

        """

        # FACTORIES
        # FIXME: get list of steps from buildshim here
        # factory = BuildFactory()
        # check out the source
        # This fails with git-1.8 and up unless you specify the branch, so do this down lower where we now the branch
        # factory.addStep(Git(repourl=repourl, mode='full', method='copy'))
        # for step in ["patch", "install_deps", "configure", "compile", "check", "package", "upload", "uninstall_deps"]:
        #    factory.addStep(ShellCommand(command=["../../srclink/" + name + "/buildshim", step], description=step))

        # BUILDERS AND SCHEDULERS
        # For each builder in config file, see what OS they want to
        # run on, and assign them to suitable slaves.
        # Also create a force scheduler that knows about all the builders.
        branchnames = []
        buildernames = []
        for builderconfig in builderconfigs:
            bparams = ''
            if "params" in builderconfig:
                bparams = builderconfig["params"].encode('ascii', 'ignore')
            bsuffix = ''
            if "suffix" in builderconfig:
                bsuffix = builderconfig["suffix"].encode('ascii', 'ignore')
            sbranch = builderconfig["branch"].encode('ascii', 'ignore')
            if sbranch not in branchnames:
                branchnames.append(sbranch)
            sosses = builderconfig["os"].encode('ascii', 'ignore').split('>')
            sosses.reverse()

            # The first OS in the list triggers when there's a source change
            sos = sosses.pop()
            buildername = name + '-' + sos + '-' + sbranch + bsuffix

            factory = self.addSimpleBuilder(name, buildername, category,
                                            repourl, builderconfig, sos,
                                            sbranch, bparams)
            self['schedulers'].append(
                SingleBranchScheduler(
                    name=buildername,
                    change_filter=filter.ChangeFilter(branch=sbranch,
                                                      repository=repourl),
                    # Set this just high enough so you don't swamp the slaves,
                    # or to None if you don't want changes batched
                    treeStableTimer=1 * 60,
                    builderNames=[buildername]))
            buildernames.append(buildername)

            # The rest of the OSes in the list, if any, are triggered when the
            # previous OS in the list finishes
            while len(sosses) > 0:
                prev_factory = factory
                sos = sosses.pop()
                buildername = name + '-' + sos + '-' + sbranch + bsuffix
                factory = self.addSimpleBuilder(name, buildername, category,
                                                repourl, builderconfig, sos,
                                                sbranch, bparams)
                self['schedulers'].append(
                    triggerable.Triggerable(name=buildername,
                                            builderNames=[buildername]))
                prev_factory.addStep(
                    trigger.Trigger(schedulerNames=[buildername],
                                    waitForFinish=False))

        self['schedulers'].append(
            ForceScheduler(
                name=name + "-force",
                builderNames=buildernames,
                branch=FixedParameter(name="branch", default=""),
                revision=FixedParameter(name="revision", default=""),
                repository=FixedParameter(name="repository", default=""),
                project=FixedParameter(name="project", default=""),
                properties=[],
            ))

        # CHANGESOURCES
        # It's a git git git git git world
        already = False
        for cs in self['change_source']:
            if cs.repourl == repourl:
                log.msg(
                    "There's already a changesource for %s.  Hope it has the branch you wanted."
                    % cs.repourl)
                already = True
        if not already:
            self['change_source'].append(
                # Fuzz the interval to avoid slamming the git server and hitting the MaxStartups or MaxSessions limits
                # If you hit them, twistd.log will have lots of "ssh_exchange_identification: Connection closed by remote host" errors
                # See http://trac.buildbot.net/ticket/2480
                GitPoller(repourl,
                          branches=branchnames,
                          workdir='gitpoller-workdir-' + name,
                          pollinterval=60 + random.uniform(-10, 10)))
示例#8
0
from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.schedulers.forcesched import ForceScheduler, FixedParameter, ChoiceStringParameter

from metabbotcfg import builders
from metabbotcfg.common import GIT_URL

schedulers = []

schedulers.append(
    SingleBranchScheduler(name="all",
                          branch='master',
                          treeStableTimer=2,
                          builderNames=[b['name'] for b in builders.builders]))

#schedulers.append(SingleBranchScheduler(
#   name="release",
#   branch='buildbot-0.8.9',
#   treeStableTimer=10,
#   builderNames=[b['name'] for b in builders.builders if b['name'] not in ('docs',)]))

schedulers.append(
    ForceScheduler(name="force",
                   repository=FixedParameter(name="repository",
                                             default=GIT_URL),
                   branch=ChoiceStringParameter(name="branch",
                                                default="master",
                                                choices=["master", "eight"]),
                   project=FixedParameter(name="project", default=""),
                   properties=[],
                   builderNames=[b['name'] for b in builders.builders]))
示例#9
0
 def test_compare_project(self):
     self.assertNotEqual(
             ForceScheduler(name="testched", builderNames=[],
                 project=FixedParameter("project","fisher")),
             ForceScheduler(name="testched", builderNames=[],
                 project=FixedParameter("project","trawler")))
示例#10
0
 def test_compare_repository(self):
     self.assertNotEqual(
             ForceScheduler(name="testched", builderNames=[],
                 repository=FixedParameter("repository","git://pond.org/fisher.git")),
             ForceScheduler(name="testched", builderNames=[],
                 repository=FixedParameter("repository","svn://ocean.com/trawler/")))
示例#11
0
 def test_compare_revision(self):
     self.assertNotEqual(
             ForceScheduler(name="testched", builderNames=[],
                 revision=FixedParameter("revision","fish-v1")),
             ForceScheduler(name="testched", builderNames=[],
                 revision=FixedParameter("revision","fish-v2")))