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)
def newBuild(self): bld = build.BuildStatus(self, self.master, 3) self.lastBuildStatus = bld return bld
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()
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
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