Пример #1
0
    def test_good_codebases(self):
        sched = self.makeScheduler(codebases=['foo', CodebaseParameter('bar')])
        res = yield sched.force('user', builderNames=['a'], reason='because',
                                foo_branch='a', foo_revision='c', foo_repository='d', foo_project='p',
                                bar_branch='a2', bar_revision='c2', bar_repository='d2', bar_project='p2'
                                )

        bsid, brids = res
        expProperties = {
            u'owner': ('user', 'Force Build Form'),
            u'reason': ('because', 'Force Build Form'),
        }
        self.assertEqual(self.addBuildsetCalls, [
            ('addBuildsetForSourceStampsWithDefaults', dict(
                builderNames=['a'],
                waited_for=False,
                properties=expProperties,
                reason=u"A build was forced by 'user': because",
                sourcestamps=[
                    {'branch': 'a', 'project': 'p', 'repository': 'd',
                        'revision': 'c', 'codebase': 'foo'},
                    {'branch': 'a2', 'project': 'p2', 'repository': 'd2',
                        'revision': 'c2', 'codebase': 'bar'},
                ])),
        ])
Пример #2
0
    def test_codebase_with_patch(self):
        sched = self.makeScheduler(codebases=['foo', CodebaseParameter('bar', patch=PatchParameter())])
        res = yield sched.force('user', builderNames=['a'], reason='because',
                                foo_branch='a', foo_revision='c', foo_repository='d', foo_project='p',
                                bar_branch='a2', bar_revision='c2', bar_repository='d2', bar_project='p2', bar_patch_body="xxx"
                                )

        bsid, brids = res
        expProperties = {
            'owner': ('user', 'Force Build Form'),
            'reason': ('because', 'Force Build Form'),
        }

        self.assertEqual(self.addBuildsetCalls, [
            ('addBuildsetForSourceStampsWithDefaults', dict(
                builderNames=['a'],
                waited_for=False,
                properties=expProperties,
                reason="A build was forced by 'user': because",
                sourcestamps=[
                    {'branch': 'a2', 'project': 'p2', 'repository': 'd2',
                        'revision': 'c2', 'codebase': 'bar',
                        'patch_body': 'xxx', 'patch_author': '', 'patch_subdir': '.',
                        'patch_comment': '', 'patch_level': 1},
                    {'branch': 'a', 'project': 'p', 'repository': 'd',
                        'revision': 'c', 'codebase': 'foo'},
                ])),
        ])
Пример #3
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,
        ),
    ]
Пример #4
0
    def test_good_codebases(self):
        sched = self.makeScheduler(codebases=['foo', CodebaseParameter('bar')])
        res = yield sched.force('user', builderNames=['a'], reason='because',
                        foo_branch='a', foo_revision='c', foo_repository='d', foo_project='p',
                        bar_branch='a2', bar_revision='c2', bar_repository='d2', bar_project='p2',
                        property1_name='p1',property1_value='e',
                        property2_name='p2',property2_value='f',
                        property3_name='p3',property3_value='g',
                        property4_name='p4',property4_value='h'
                        )

        bsid,brids = res
        self.db.buildsets.assertBuildset\
            (bsid,
             dict(reason="A build was forced by 'user': because",
                  brids=brids,
                  external_idstring=None,
                  properties=[ ('owner', ('user', 'Force Build Form')),
                               ('p1', ('e', 'Force Build Form')),
                               ('p2', ('f', 'Force Build Form')),
                               ('p3', ('g', 'Force Build Form')),
                               ('p4', ('h', 'Force Build Form')),
                               ('reason', ('because', 'Force Build Form')),
                               ('scheduler', ('testsched', 'Scheduler')),
                               ],
                  sourcestampsetid=100),
             {'foo': dict(codebase='foo', sourcestampsetid=100,
                          branch='a', revision='c', repository='d', project='p', ),
              'bar': dict(codebase='bar', sourcestampsetid=100,
                          branch='a2', revision='c2', repository='d2', project='p2', ),
              })
Пример #5
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)
Пример #6
0
 def createCodebaseParamsForDeploy(self, codebases):
     codebases_params = []
     for name, codebase in codebases.items():
         codebases_params.append(
             CodebaseParameter(name,
                               project="",
                               repository=codebase['repository'],
                               branch=codebase.get('branch'),
                               revision=util.StringParameter(
                                   name='revision', hide=False, size=50)))
     return codebases_params
Пример #7
0
 def genMergeBaseParameters(self, **kwargs):
     repos = kwargs.pop('repos', self.repos)
     branches = kwargs.pop('branches', self.branches)
     parms = []
     for repo in repos:
         parms.append(
             CodebaseParameter(codebase=repo + '_merge',
                               label="Merge %s with test branch" % repo,
                               project=FixedParameter(name='project',
                                                      default='')))
     return parms
Пример #8
0
 def createCodebaseParams(self, codebases):
     codebases_params = []
     for name, codebase in codebases.items():
         codebases_params.append(
             CodebaseParameter(
                 name,
                 project="",
                 repository=codebase['repository'],
                 branch=codebase.get('branch'),
                 revision=None,
             ))
     return codebases_params
Пример #9
0
 def genBaseParameters(self, **kwargs):
     repos = kwargs.pop('repos', self.repos)
     branches = kwargs.pop('branches', self.branches)
     parms = []
     for repo in repos:
         parms.append(
             CodebaseParameter(
                 codebase=repo,
                 label=repo,
                 branch=ChoiceStringParameter(name='branch',
                                              choices=self.branches,
                                              default=self.branches[0]),
                 repository=FixedParameter(name='repository',
                                           default=self.genRepoURL(
                                               self.baseURL, self.owner,
                                               repo)),
                 project=FixedParameter(name='project', default='')))
     return parms
 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)
         ])
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
Пример #12
0
            return '--version'  # dummy action

        return pick_buildbot_action

    steps = []

    for slave in slaves:
        steps.append(
             ShellCommand(
                name="Act-%s" % slave,
                command = ["ssh", slave, Interpolate("~/run_buildslave.sh %(kw:action)s", action=get_action(slave))],
                doStepIf=skip_if_no_action(slave))
             )

    return {
            'factory': BuildFactory(steps),
            'name': "ManageSlaves",
            'slavenames': [ MAIN_SLAVE ],
    }

c['builders'].append(create_slave_management(BUILD_SLAVES))
c['schedulers'].append(
    ForceScheduler(name="Force-ManageSlaves", builderNames=['ManageSlaves'],
                   codebases=[CodebaseParameter(codebase='', hide=True)],
                   reason=StringParameter(name="reason", default="Manage Slaves", length=20, hide=True),
                   reasonString="%(reason)s",
                   properties=[
                        ChoiceStringParameter(label=slave, name='%s_action' % slave, choices=['None', 'Start', 'Restart', 'Stop'])
                        for slave in BUILD_SLAVES
                   ]),
Пример #13
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