Ejemplo n.º 1
0
def loadBuilderConfig(c, is_test_mode_enabled=False, master_prefix_path='./'):
    config = json.load(open(os.path.join(master_prefix_path, 'config.json')))
    if is_test_mode_enabled:
        passwords = {}
    else:
        passwords = json.load(open(os.path.join(master_prefix_path, 'passwords.json')))

    checkWorkersAndBuildersForConsistency(config, config['workers'], config['builders'])
    checkValidSchedulers(config, config['schedulers'])

    c['workers'] = [Worker(worker['name'], passwords.get(worker['name'], 'password'), max_builds=worker.get('max_builds', 1)) for worker in config['workers']]
    if is_test_mode_enabled:
        c['workers'].append(Worker('local-worker', 'password', max_builds=1))

    c['builders'] = []
    for builder in config['builders']:
        builder['tags'] = getTagsForBuilder(builder)
        factory = globals()[builder['factory']]
        builder['description'] = builder.pop('shortname')
        if 'icon' in builder:
            del builder['icon']
        factorykwargs = {}
        for key in ['platform', 'configuration', 'architectures', 'triggers', 'remotes', 'additionalArguments', 'runTests', 'triggered_by']:
            value = builder.pop(key, None)
            if value:
                factorykwargs[key] = value

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

        if is_test_mode_enabled:
            builder['workernames'].append('local-worker')

        c['builders'].append(builder)

    c['prioritizeBuilders'] = prioritizeBuilders
    c['schedulers'] = []
    for scheduler in config['schedulers']:
        schedulerClassName = scheduler.pop('type')
        schedulerClass = globals()[schedulerClassName]
        if (schedulerClassName == 'Try_Userpass'):
            # FIXME: Read the credentials from local file on disk.
            scheduler['userpass'] = [(os.getenv('BUILDBOT_TRY_USERNAME', 'sampleuser'), os.getenv('BUILDBOT_TRY_PASSWORD', 'samplepass'))]
        c['schedulers'].append(schedulerClass(**scheduler))

    if is_test_mode_enabled:
        forceScheduler = ForceScheduler(
            name="force_build",
            buttonName="Force Build",
            builderNames=[str(builder['name']) for builder in config['builders']],
            # Disable default enabled input fields: branch, repository, project, additional properties
            codebases=[CodebaseParameter("",
                       revision=FixedParameter(name="revision", default=""),
                       repository=FixedParameter(name="repository", default=""),
                       project=FixedParameter(name="project", default=""),
                       branch=FixedParameter(name="branch", default=""))],
            # Add custom properties needed
            properties=[StringParameter(name="patch_id", label="Patch attachment id number (not bug number)", required=True, maxsize=7),
                        StringParameter(name="ews_revision", label="WebKit git sha1 hash to checkout before trying patch (optional)", required=False, maxsize=40)],
        )
        c['schedulers'].append(forceScheduler)
Ejemplo n.º 2
0
    def test_bad_codebases(self):
        # cant specify both codebases and branch/revision/project/repository:
        self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:",
             lambda: ForceScheduler(name='foo', builderNames=['bar'],
                                    codebases=['foo'], branch=StringParameter('name')))
        self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:",
             lambda: ForceScheduler(name='foo', builderNames=['bar'],
                                    codebases=['foo'], revision=StringParameter('name')))
        self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:",
             lambda: ForceScheduler(name='foo', builderNames=['bar'],
                                    codebases=['foo'], project=StringParameter('name')))
        self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:",
             lambda: ForceScheduler(name='foo', builderNames=['bar'],
                                    codebases=['foo'], repository=StringParameter('name')))

        # codebases must be a list of either string or BaseParameter types
        self.assertRaisesConfigError("ForceScheduler: 'codebases' must be a list of strings or CodebaseParameter objects:",
             lambda: ForceScheduler(name='foo', builderNames=['bar'],
                                    codebases=[123],))
        self.assertRaisesConfigError("ForceScheduler: 'codebases' must be a list of strings or CodebaseParameter objects:",
             lambda: ForceScheduler(name='foo', builderNames=['bar'],
                                    codebases=[IntParameter('foo')],))

        # codebases cannot be empty
        self.assertRaisesConfigError("ForceScheduler: 'codebases' cannot be empty; use CodebaseParameter(codebase='', hide=True) if needed:",
                                     lambda: ForceScheduler(name='foo',
                                                            builderNames=['bar'],
                                                            codebases=[]))
Ejemplo n.º 3
0
    def test_bad_codebases(self):
        # cant specify both codebases and branch/revision/project/repository:
        self.assertRaises(ValidationError,
                          ForceScheduler,
                          name='foo',
                          builderNames=['bar'],
                          codebases=['foo'],
                          branch=StringParameter('name'))
        self.assertRaises(ValidationError,
                          ForceScheduler,
                          name='foo',
                          builderNames=['bar'],
                          codebases=['foo'],
                          revision=StringParameter('name'))
        self.assertRaises(ValidationError,
                          ForceScheduler,
                          name='foo',
                          builderNames=['bar'],
                          codebases=['foo'],
                          project=StringParameter('name'))
        self.assertRaises(ValidationError,
                          ForceScheduler,
                          name='foo',
                          builderNames=['bar'],
                          codebases=['foo'],
                          repository=StringParameter('name'))

        # codebases must be a list of either string or BaseParameter types
        self.assertRaises(
            ValidationError,
            ForceScheduler,
            name='foo',
            builderNames=['bar'],
            codebases=[123],
        )
        self.assertRaises(
            ValidationError,
            ForceScheduler,
            name='foo',
            builderNames=['bar'],
            codebases=[IntParameter('foo')],
        )

        # codebases cannot be empty
        self.assertRaises(ValidationError,
                          ForceScheduler,
                          name='foo',
                          builderNames=['bar'],
                          codebases=[])
Ejemplo n.º 4
0
def get_schedulers():
    from buildbot.schedulers.basic import SingleBranchScheduler
    from buildbot.schedulers.basic import AnyBranchScheduler
    from buildbot.schedulers.forcesched import ForceScheduler
    from buildbot.schedulers.forcesched import StringParameter
    from buildbot.schedulers.forcesched import FixedParameter
    from buildbot.plugins import util
    import builders

    return [
        SingleBranchScheduler(
            name='master',
            reason='main repository source code modification',
            builderNames=['coverity'],
            treeStableTimer=20,
            change_filter=util.ChangeFilter(branch='master')),
        AnyBranchScheduler(name='default',
                           reason='main repository source code modification',
                           builderNames=builders.get_builder_names(),
                           treeStableTimer=20),
        ForceScheduler(
            name='force',
            reason=StringParameter(name="reason",
                                   default="manual build",
                                   size=100),
            builderNames=builders.get_builder_names(),
            codebases=[
                util.CodebaseParameter(
                    "",
                    label="Codebase",
                    branch=StringParameter(name="branch",
                                           default="master",
                                           size=100),
                    revision=StringParameter(name="revision",
                                             default="",
                                             size=100),
                    repository=StringParameter(
                        name="repository",
                        default="https://github.com/SFML/SFML.git",
                        regex=r"^https://github.com/[\w-]*/[\w-]*\.git$",
                        size=100),
                    project=StringParameter(name="project",
                                            default="SFML",
                                            size=100),
                )
            ],
            properties=[util.FixedParameter(name="trigger", default="force")])
    ]
Ejemplo n.º 5
0
 def test_NestedParameter_nullname(self):
     # same as above except "p1" and "any" are skipped
     fields = [
         NestedParameter(name="inner", fields=[
             StringParameter(name='str'),
             AnyPropertyParameter(name='')
         ]),
         IntParameter(name="foo"),
         NestedParameter(name='bar', fields=[
             NestedParameter(
                 name='', fields=[AnyPropertyParameter(name='a')]),
             NestedParameter(
                 name='', fields=[AnyPropertyParameter(name='b')])
         ])
     ]
     self.do_ParameterTest(req=dict(foo='123',
                                    inner_str="bar",
                                    inner_name="hello",
                                    inner_value="world",
                                    reason="because",
                                    bar_a_name="a",
                                    bar_a_value="7",
                                    bar_b_name="b",
                                    bar_b_value="8"),
                           expect=dict(foo=123,
                                       inner=dict(str="bar", hello="world"),
                                       bar={'a': '7', 'b': '8'}),
                           expectKind=dict,
                           klass=NestedParameter, fields=fields, name='')
Ejemplo n.º 6
0
def getSchedulers():
    return [
        AnyBranchScheduler(
            name="flocker",
            treeStableTimer=5,
            builderNames=BUILDERS,
            # Only build certain branches because problems arise when we build
            # many branches such as queues and request limits.
            change_filter=ChangeFilter(branch_fn=build_automatically),
            codebases={
                "flocker": {
                    "repository": GITHUB + b"/flocker"
                },
            },
        ),
        ForceScheduler(
            name="force-flocker",
            codebases=[
                CodebaseParameter(
                    "flocker",
                    branch=StringParameter("branch", default="master",
                                           size=80),
                    repository=FixedParameter("repository",
                                              default=GITHUB + b"/flocker"),
                ),
            ],
            properties=[
                report_expected_failures_parameter,
            ],
            builderNames=BUILDERS,
        ),
    ]
Ejemplo n.º 7
0
def get_schedulers() :
    from buildbot.schedulers.basic import AnyBranchScheduler
    from buildbot.schedulers.forcesched import ForceScheduler
    from buildbot.schedulers.forcesched import StringParameter
    from buildbot.schedulers.forcesched import FixedParameter
    from buildbot.plugins import util
    import builders

    return [
        AnyBranchScheduler(
            name = 'default',
            reason = 'main repository source code modification',
            builderNames = builders.get_builder_names(),
            treeStableTimer = 20,
            change_filter = util.ChangeFilter(
                repository_fn = lambda repository : bool('github.com/SFML/SFML' in repository)
            ),
            properties = {
                'trigger' : 'internal'
            }
        ),
        AnyBranchScheduler(
            name = 'foreign',
            builderNames = builders.get_builder_names(),
            change_filter = util.ChangeFilter(
                repository_fn = lambda repository : bool('github.com/SFML/SFML' not in repository)
            ),
            properties = {
                'trigger' : 'external'
            }
        ),
        ForceScheduler(
            name = 'force',
            reason = StringParameter(name = "reason", default = "manual build", size = 100),
            builderNames = builders.get_builder_names(),
            branch = StringParameter(name = "branch", default = "master", size = 100),
            revision = StringParameter(name = "revision", default = "", size = 100),
            repository = StringParameter(name = "repository", default = "https://github.com/SFML/SFML.git", regex = r"^https://github.com/[\w-]*/[\w-]*\.git$", size = 100),
            project = StringParameter(name = "project", default = "SFML", size = 100),
            properties = [
                util.FixedParameter(name = "trigger", default = "force")
            ]
        )
    ]
Ejemplo n.º 8
0
 def test_NestedNestedParameter(self):
     fields = [
         NestedParameter(name="inner", fields=[
             StringParameter(name='str'),
             AnyPropertyParameter(name='any')
         ]),
         IntParameter(name="foo")
     ]
     self.do_ParameterTest(req=dict(p1_foo='123',
                                    p1_inner_str="bar",
                                    p1_inner_any_name="hello",
                                    p1_inner_any_value="world",
                                    reason="because"),
                           expect=dict(foo=123, inner=dict(str="bar", hello="world")),
                           klass=NestedParameter, fields=fields)
 def makeForceScheduler():
     return ForceScheduler(
         name="force",
         builderNames=["runtests", "runtests2", "runtests1"],
         codebases=[
             CodebaseParameter('',
                               branch=StringParameter(name="branch",
                                                      label="Branch",
                                                      default='master'),
                               repository=FixedParameter(
                                   name="repository", default='repo'))
         ],
         properties=[
             BooleanParameter(name="force_rebuild",
                              label="Force Rebuild",
                              default=True),
             BooleanParameter(name="force_chain_rebuild",
                              label="Force Chain Rebuild",
                              default=False)
         ])
Ejemplo n.º 10
0
 def __init__(self, **kw):
     pizzaInput = StringParameter(label="type the name of your pizza",
                                  name=self.PIZZA,
                                  required=True)
     ingredientsInput = ChoiceStringParameter(
         name=self.INGREDIENTS,
         label="ingredients necessary to make the pizza",
         multiple=True,
         strict=False,
         default="",
         choices=[])
     self.params = {
         self.PIZZA: pizzaInput,
         self.INGREDIENTS: ingredientsInput
     }
     self.allIngredients = set(
         sum([ingr for ingr in Api.pizzaIngredients.values()], []))
     fields = self.params.values()
     super(NestedExample, self).__init__(self.type,
                                         label='',
                                         fields=fields,
                                         **kw)
def getSchedulers():
    schedulers = [
        ForceScheduler(
            name="force-flocker-acceptance",
            codebases=[
                CodebaseParameter(
                    "flocker",
                    branch=StringParameter("branch", default="master",
                                           size=80),
                    repository=FixedParameter("repository",
                                              default=GITHUB + b"/flocker"),
                ),
            ],
            properties=[
                report_expected_failures_parameter,
            ],
            builderNames=BUILDERS,
        ),
    ]
    for distribution in OMNIBUS_DISTRIBUTIONS:
        builders = [
            configuration.builder_name
            for configuration in ACCEPTANCE_CONFIGURATIONS
            if configuration.distribution == distribution
        ]
        schedulers.append(
            Triggerable(
                name='trigger/built-packages/%s' % (distribution, ),
                builderNames=builders,
                codebases={
                    "flocker": {
                        "repository": GITHUB + b"/flocker"
                    },
                },
            ))
    return schedulers
Ejemplo n.º 12
0
from codebases import Codebases
from builders import BuilderNames

Schedulers = []
Schedulers.append(
    ForceScheduler(name='force',
                   builderNames=BuilderNames,
                   codebases=Codebases.genBaseParameters() +
                   Codebases.genMergeBaseParameters(),
                   properties=[
                       ChoiceStringParameter(name='build_type',
                                             label='build type',
                                             choices=['debug', 'release'],
                                             default='release'),
                       StringParameter(name='cmake_definitions',
                                       label='cmake definitions',
                                       default=''),
                       StringParameter(name='disable_tests',
                                       label='disable accuracy tests',
                                       default='rgbd, shape'),
                       StringParameter(name='disable_perf_tests',
                                       label='disable performance tests',
                                       default='stereo, tracking'),
                       StringParameter(name='filter_tests',
                                       label='filter accuracy tests',
                                       default=''),
                       StringParameter(name='filter_perf_tests',
                                       label='filter performance tests',
                                       default='')
                   ]))
Ejemplo n.º 13
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))

    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 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)
Ejemplo n.º 14
0
def loadBuilderConfig(c, test_mode_is_enabled=False):
    # FIXME: These file handles are leaked.
    if test_mode_is_enabled:
        passwords = make_passwords_json.create_mock_slave_passwords_dict()
    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'))
    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"]]
        schedulerType = 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(schedulerType(**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", "device_model":
            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'
        elif platform == 'wincairo':
            builder["category"] = 'WinCairo'
        elif platform.startswith('playstation'):
            builder["category"] = 'PlayStation'
        else:
            builder["category"] = 'misc'

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

        c['builders'].append(builder)
Ejemplo n.º 15
0
    def define_travis_builder(self, name, repository, tags=None, **kwargs):
        name = str(name)
        repository = str(repository)
        job_name = "%s-job" % name
        try_name = "%s-try" % name
        deploy_name = "%s-deploy" % name
        spawner_name = name
        if tags is None:
            tags = []

        def formatTag(tag):
            if isinstance(tag, string_types):
                return str(tag)
            return str(tag['text'])

        def uniq(tags):
            """tags needs to be unique list, so we need to filter them into a set"""
            return list(set(tags))

        tags = [formatTag(tag) for tag in tags]
        if 'username' not in kwargs and 'password' not in kwargs:
            p = urlparse(repository)
            k = (p.scheme, p.netloc)
            if k in self.passwords:
                kwargs['username'], kwargs['password'] = self.passwords[k]

        codebases = {spawner_name: {'repository': repository}}
        for subrepo in kwargs.get('subrepos', []):
            codebases[subrepo['project']] = {
                'repository': subrepo['repository']
            }

        vcsManager = addRepository(
            name, dict(name=name, repository=repository, **kwargs))
        vcsManager.vardir = self.vardir

        # Define the builder for the main job
        f = factory.BuildFactory()
        vcsManager.addSourceSteps(f)
        f.addStep(TravisSetupSteps())

        self.config['builders'].append(
            BuilderConfig(name=job_name,
                          workernames=self.get_runner_workers(),
                          properties=self.properties,
                          collapseRequests=False,
                          env=self.defaultEnv,
                          tags=uniq(["job", name] + tags),
                          factory=f))

        self.config['schedulers'].append(
            Triggerable(
                name=job_name,
                builderNames=[job_name],
                codebases=codebases,
            ))

        # Define the builder for a spawner
        f = factory.BuildFactory()
        vcsManager.addSourceSteps(f)
        f.addStep(TravisTrigger(scheduler=job_name, ))
        properties = dict(TRAVIS_PULL_REQUEST=False)
        properties.update(self.properties)
        self.config['builders'].append(
            BuilderConfig(name=spawner_name,
                          workernames=self.get_spawner_workers(),
                          properties=properties,
                          tags=uniq(["trunk", name] + tags),
                          factory=f))

        # no need for deployment builder if no stage is configured
        if kwargs.get('stages', []):
            # Define the builder for the deployment of the project
            f = factory.BuildFactory()
            vcsManager.addSourceSteps(f)
            f.addStep(TravisSetupSteps())

            # To manage deployment properly (with change traceability),
            # we need the version and the target deployment environment or "stage"
            version = StringParameter(name='version',
                                      label='GIT tag',
                                      hide=False,
                                      required=False,
                                      size=20)
            stage = StringParameter(name='stage',
                                    label='Stage',
                                    hide=False,
                                    required=False,
                                    size=20)

            dep_properties = [version, stage]

            self.config['builders'].append(
                BuilderConfig(name=deploy_name,
                              workernames=self.get_runner_workers(),
                              env=self.defaultEnv,
                              tags=uniq(["deploy", name] + tags),
                              factory=f))
        else:
            dep_properties = []
        if vcsManager.supportsTry:
            properties = dict(TRAVIS_PULL_REQUEST=True)
            properties.update(self.properties)
            # Define the builder for try job
            f = factory.BuildFactory()
            vcsManager.addSourceSteps(f)
            f.addStep(TravisTrigger(scheduler=job_name, ))

            self.config['builders'].append(
                BuilderConfig(name=try_name,
                              workernames=self.get_spawner_workers(),
                              properties=properties,
                              tags=uniq(["try", name] + tags),
                              factory=f))

        vcsManager.setupSchedulers(self.config['schedulers'], spawner_name,
                                   try_name, deploy_name,
                                   self.importantManager, codebases,
                                   dep_properties)
        vcsManager.setupReporters(self.config['services'], spawner_name,
                                  try_name, codebases)
        res = vcsManager.setupChangeSource(self.config['services'])
        if res is not None:
            self.change_hook_dialects.update(res)
Ejemplo n.º 16
0
from buildbot.changes.filter import ChangeFilter

from config.builders import builder_names, polled_builder_names

all_builder_names = builder_names + polled_builder_names

schedulers = []

manual_builder = ChangeFilter(project=builder_names, branch='master')
schedulers.append(
    SingleBranchScheduler(name="all",
                          treeStableTimer=15,
                          change_filter=manual_builder,
                          builderNames=builder_names))

polled_builder = ChangeFilter(project=polled_builder_names, branch='master')
schedulers.append(
    SingleBranchScheduler(name="mongodb",
                          treeStableTimer=15,
                          change_filter=polled_builder,
                          builderNames=polled_builder_names))

schedulers.append(
    ForceScheduler(name="force",
                   repository=FixedParameter(name="repository"),
                   branch=StringParameter(name="branch", default="master"),
                   project=FixedParameter(name="project", default=""),
                   properties=[],
                   builderNames=all_builder_names))
Ejemplo n.º 17
0
def loadBuilderConfig(c, is_test_mode_enabled=False, master_prefix_path='./'):
    # FIXME: These file handles are leaked.
    config = json.load(open(os.path.join(master_prefix_path, 'config.json')))
    if is_test_mode_enabled:
        passwords = {}
    else:
        passwords = json.load(
            open(os.path.join(master_prefix_path, '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

    checkWorkersAndBuildersForConsistency(config, config['workers'],
                                          config['builders'])
    checkValidSchedulers(config, config['schedulers'])

    c['workers'] = [
        Worker(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')]
    forceScheduler = ForceScheduler(name='force',
                                    builderNames=builderNames,
                                    reason=reason,
                                    properties=properties)
    c['schedulers'].append(forceScheduler)

    c['builders'] = []
    for builder in config['builders']:
        builder['tags'] = getTagsForBuilder(builder)
        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']
        for step in builder["factory"].steps:
            step_name = step.buildStep().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.ident_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

        c['builders'].append(builder)
Ejemplo n.º 18
0
    def getGlobalSchedulers(self, platforms):
        ret = list()
        change_filter = ChangeFilter(repository=self.baseurl,
                                     branch=self.branch)

        # Fetch scheduler (triggered by event source)
        ret.append(
            SingleBranchScheduler(name="fetch-{0}".format(self.name),
                                  change_filter=change_filter,
                                  treeStableTimer=5,
                                  builderNames=["fetch-{0}".format(self.name)
                                                ]))

        # Nightly scheduler (started by time)
        # It's triggered after regular builds to take note of the last fetched source
        # Note that build is not started by trigger
        if self.nightly is not None:
            ret.append(
                NightlyTriggerable(
                    name="nightly-{0}".format(self.name),
                    branch=self.branch,
                    builderNames=["nightly-{0}".format(self.name)],
                    hour=self.nightly[0],
                    minute=self.nightly[1],
                    onlyIfChanged=True))

        # All compiling builders
        comp_builders = [
            "{0}-{1}".format(self.name, p.name) for p in platforms
            if p.canBuild(self)
        ]

        # Global build scheduler (triggered by fetch build)
        ret.append(Triggerable(name=self.name, builderNames=comp_builders))

        # Force schedulers
        if self.enable_force:
            ret.append(
                ForceScheduler(
                    name="force-scheduler-{0}-fetch".format(self.name),
                    reason=StringParameter(name="reason",
                                           label="Reason:",
                                           required=True,
                                           size=80),
                    builderNames=["fetch-{0}".format(self.name)],
                    codebases=[CodebaseParameter(codebase='', hide=True)],
                    properties=[
                        BooleanParameter(name="clean",
                                         label="Clean",
                                         default=False),
                        BooleanParameter(name="package",
                                         label="Package",
                                         default=False),
                    ]))
            ret.append(
                ForceScheduler(
                    name="force-scheduler-{0}-build".format(self.name),
                    reason=StringParameter(name="reason",
                                           label="Reason:",
                                           required=True,
                                           size=80),
                    builderNames=comp_builders,
                    codebases=[CodebaseParameter(codebase='', hide=True)],
                    properties=[
                        BooleanParameter(name="clean",
                                         label="Clean",
                                         default=False),
                        BooleanParameter(name="package",
                                         label="Package",
                                         default=False),
                    ]))

        return ret