Exemplo n.º 1
0
    def setUp(self):
        self.builder_status = FakeBuilderStatus()
        self.master = fakemaster.make_master(wantDb=True, testcase='Tests for getTopBuildUrl method')
        self.build_status = build.BuildStatus(self.builder_status, self.master, self.BUILD_NUMBER)

        def generate_build_url(buildername, build_number):
            return 'http://katana/projects/test-project/builders/{}/builds/{}'.format(buildername, build_number)

        self.master.status.getBuildersPath = mock.Mock(side_effect=generate_build_url)
Exemplo n.º 2
0
 def newBuild(self):
     bld = build.BuildStatus(self, self.master, 3)
     self.lastBuildStatus = bld
     return bld
Exemplo n.º 3
0
 def setUp(self):
     self.builder_status = FakeBuilderStatus()
     self.master = fakemaster.make_master()
     self.build_status = build.BuildStatus(self.builder_status, self.master,
                                           self.BUILD_NUMBER)
     self.build_status.properties = mock.Mock()
Exemplo n.º 4
0
def MockBuild(my_builder,
              buildsetup,
              mastername,
              slavename,
              basepath=None,
              build_properties=None,
              slavedir=None):
    """Given a builder object and configuration, mock a Buildbot setup around it.

  This sets up a mock BuildMaster, BuildSlave, Build, BuildStatus, and all other
  superstructure required for BuildSteps inside the provided builder to render
  properly. These BuildSteps are returned to the user in an array. It
  additionally returns the build object (in order to get its properties if
  desired).

  buildsetup is passed straight into the FakeSource's init method and
  contains sourcestamp information (revision, branch, etc).

  basepath is the directory of the build (what goes under build/slave/, for
  example 'Chromium_Linux_Builder'. It is nominally inferred from the builder
  name, but it can be overridden. This is useful when pointing the buildrunner
  at a different builder than what it's running under.

  build_properties will update and override build_properties after all
  builder-derived defaults have been set.
  """

    my_factory = my_builder['factory']
    steplist = ListSteps(my_factory)

    build = base.Build([FakeRequest(buildsetup)])
    safename = buildbot.util.safeTranslate(my_builder['name'])

    my_builder['builddir'] = safename
    my_builder.setdefault('slavebuilddir', safename)

    workdir_root = None
    if not slavedir:
        workdir_root = os.path.join(SCRIPT_DIR, '..', '..', 'slave',
                                    my_builder['slavebuilddir'])

    if not basepath: basepath = safename
    if not slavedir: slavedir = os.path.join(SCRIPT_DIR, '..', '..', 'slave')
    basedir = os.path.join(slavedir, basepath)
    build.basedir = basedir
    if not workdir_root:
        workdir_root = basedir

    builderstatus = builder.BuilderStatus('test')
    builderstatus.basedir = basedir
    buildnumber = build_properties.get('buildnumber', 1)
    builderstatus.nextBuildNumber = buildnumber + 1

    mybuilder = real_builder.Builder(my_builder, builderstatus)
    build.setBuilder(mybuilder)
    build_status = build_module.BuildStatus(builderstatus, buildnumber)

    build_status.setProperty('blamelist', [], 'Build')
    build_status.setProperty('mastername', mastername, 'Build')
    build_status.setProperty('slavename', slavename, 'Build')
    build_status.setProperty('gtest_filter', [], 'Build')
    build_status.setProperty('extra_args', [], 'Build')
    build_status.setProperty('build_id', buildnumber, 'Build')

    # if build_properties are passed in, overwrite the defaults above:
    buildprops = Properties()
    if build_properties:
        buildprops.update(build_properties, 'Botmaster')
    mybuilder.setBotmaster(FakeBotmaster(mastername, buildprops))

    buildslave = FakeSlave(safename, my_builder.get('slavebuilddir'),
                           slavename)
    build.build_status = build_status
    build.setupSlaveBuilder(buildslave)
    build.setupProperties()
    process_steps(steplist, build, buildslave, build_status, workdir_root)

    return steplist, build
Exemplo n.º 5
0
def main(args):
    if args.list_masters:
        masterpairs = get_masters()
        pp_masters(masterpairs)
        return 0

    if args.master_dir:
        config = read_config(args.master_dir, args.master_cfg)
    else:
        path = choose_master(args.mastername)
        if not path:
            return 2

        config = read_config(path, args.master_cfg)

    if not config:
        return 2

    mastername = config['BuildmasterConfig']['properties']['mastername']
    builders = dup_slaves(config['BuildmasterConfig']['builders'])

    if args.list_builders:
        pp_builders(builders, mastername)
        return 0

    my_builder = choose(builders, args.spec)

    if args.spec and 'hostname' in args.spec:
        slavename = args.spec['hostname']
    elif (args.spec and 'either'
          in args.spec) and (args.spec['either'] != my_builder['name']):
        slavename = args.spec['either']
    else:
        slavename = my_builder['slavename']

    if not my_builder:
        return 2

    my_factory = my_builder['factory']
    steplist = generate_steplist(my_factory)

    if args.list_steps:
        print
        print 'listing steps in %s/%s:' % (mastername, my_builder['name'])
        print
        for step in steplist:
            if hasattr(args,
                       'step_regex') and not args.step_regex.search(step.name):
                print '-', step.name, '[skipped]'
            elif hasattr(args,
                         'stepreject_regex') and (args.stepreject_regex.search(
                             step.name)):
                print '-', step.name, '[skipped]'
            else:
                print '*', step.name
        return 0

    if not args.annotate:
        print >> sys.stderr, 'using %s builder \'%s\'' % (mastername,
                                                          my_builder['name'])

    if args.build_properties:
        buildsetup = args.build_properties
    else:
        buildsetup = {}
        buildsetup['revision'] = '%d' % args.revision
        buildsetup['branch'] = 'src'

    build = base.Build([FakeRequest(buildsetup)])
    safename = buildbot.util.safeTranslate(my_builder['name'])
    if hasattr(args, 'builderpath'):
        basepath = args.builderpath
    else:
        basepath = safename
    basedir = os.path.join('..', '..', '..', 'slave', basepath)
    build.basedir = basedir
    builderstatus = builder.BuilderStatus('test')
    builderstatus.nextBuildNumber = 2
    builderstatus.basedir = basedir
    my_builder['builddir'] = safename
    my_builder['slavebuilddir'] = safename
    mybuilder = real_builder.Builder(my_builder, builderstatus)
    build.setBuilder(mybuilder)
    build_status = build_module.BuildStatus(builderstatus, 1)

    build_status.setProperty('blamelist', [], 'Build')
    build_status.setProperty('mastername', mastername, 'Build')
    build_status.setProperty('slavename', slavename, 'Build')
    build_status.setProperty('gtest_filter', [], 'Build')

    # if build_properties are set on the CLI, overwrite the defaults
    # set above when build.setupProperties is called
    buildprops = Properties()
    if args.build_properties:
        buildprops.update(args.build_properties, 'Botmaster')
    mybuilder.setBotmaster(FakeBotmaster(mastername, buildprops))

    mylogger = LogClass(args.log)

    buildslave = FakeSlave(safename, slavename)
    buildslave.addUpdateAction(mylogger.log_to_file)

    build.build_status = build_status

    build.setupSlaveBuilder(buildslave)

    build.setupProperties()

    if args.output_build_properties:
        print
        print 'build properties:'
        print propertiesToJSON(build.getProperties())

    if args.output_factory_properties:
        print
        print 'factory properties:'
        print propertiesToJSON(my_factory.properties)

    if args.output_build_properties or args.output_factory_properties:
        return 0

    process_steps(steplist, build, buildslave, build_status, basedir)

    commands = get_commands(steplist)

    run_status = ReturnStatus()

    start_time = time.clock()
    commands_executed = 0
    for command in commands:
        if hasattr(args, 'step_regex'):
            if not args.step_regex.search(command['name']):
                if not args.annotate:
                    print >> sys.stderr, 'skipping step: ' + command['name']
                continue

        if hasattr(args, 'stepreject_regex'):
            if args.stepreject_regex.search(command['name']):
                if not args.annotate:
                    print >> sys.stderr, 'skipping step: ' + command['name']
                    continue

        if not args.annotate:
            print >> sys.stderr, 'running step: %s' % command['name']
        else:
            print '@@@BUILD_STEP %s@@@' % command['name']

        print >> args.log, '(in %s): %s' % (command['workdir'],
                                            shell_quote(command['command']))

        mydir = os.getcwd()
        myenv = os.environ
        os.chdir(command['workdir'])

        # python docs says this might cause leaks on FreeBSD/OSX
        for envar in command['env']:
            os.environ[envar] = command['env'][envar]

        ret = chromium_utils.RunCommand(command['command'],
                                        filter_obj=mylogger,
                                        print_cmd=False)
        os.chdir(mydir)
        os.environ = myenv
        commands_executed += 1
        if ret != 0:
            return 2

    end_time = time.clock()
    if not args.annotate:
        print >> sys.stderr, '%d commands completed (%0.2fs).' % (
            commands_executed, end_time - start_time)
    else:
        if commands_executed < 1:
            print '0 commands executed.'
    return run_status.code