Index: master/skia_master_scripts/factory.py |
diff --git a/master/skia_master_scripts/factory.py b/master/skia_master_scripts/factory.py |
deleted file mode 100644 |
index 07c7556c55b33774c3d268ad650f5275c5638399..0000000000000000000000000000000000000000 |
--- a/master/skia_master_scripts/factory.py |
+++ /dev/null |
@@ -1,797 +0,0 @@ |
-# Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
- |
-"""Utility class to build the Skia master BuildFactory's. |
- |
-Based on gclient_factory.py and adds Skia-specific steps.""" |
- |
- |
-from buildbot.process.properties import WithProperties |
-from buildbot.status import builder |
-from config_private import SKIA_GIT_URL |
-from master.factory import gclient_factory |
-from master.factory.build_factory import BuildFactory |
-from skia_master_scripts import commands as skia_commands |
- |
-import builder_name_schema |
-import config |
-import config_private |
-import ntpath |
-import os |
-import posixpath |
-import skia_vars |
-import utils |
- |
- |
-# TODO(epoger): My intent is to make the build steps identical on all platforms |
-# and thus remove the need for the whole target_platform parameter. |
-# For now, these must match the target_platform values used in |
-# third_party/chromium_buildbot/scripts/master/factory/gclient_factory.py , |
-# because we pass these values into GClientFactory.__init__() . |
-TARGET_PLATFORM_LINUX = 'linux' |
-TARGET_PLATFORM_MAC = 'mac' |
-TARGET_PLATFORM_WIN32 = 'win32' |
- |
-CONFIG_DEBUG = 'Debug' |
-CONFIG_RELEASE = 'Release' |
-CONFIGURATIONS = [CONFIG_DEBUG, CONFIG_RELEASE] |
- |
- |
-_RUNGYP_STEP_DESCRIPTION = 'RunGYP' |
-_COMPILE_STEP_PREFIX = 'Build' |
-_COMPILE_RETRY_PREFIX = 'Retry_' + _COMPILE_STEP_PREFIX |
-_COMPILE_NO_WERR_PREFIX = 'Retry_NoWarningsAsErrors_' + _COMPILE_STEP_PREFIX |
- |
- |
-class SkiaFactory(BuildFactory): |
- """Encapsulates data and methods common to the Skia master.cfg files.""" |
- |
- def __init__(self, other_repos=None, do_upload_render_results=False, |
- do_upload_bench_results=False, do_patch_step=False, |
- build_subdir='skia', target_platform=None, |
- configuration=CONFIG_DEBUG, default_timeout=8*60*60, |
- deps_target_os=None, environment_variables=None, |
- perf_output_basedir=None, builder_name=None, flavor=None, |
- make_flags=None, test_args=None, gm_args=None, bench_args=None, |
- bench_pictures_cfg='default', compile_warnings_as_errors=False, |
- gyp_defines=None, build_targets=None): |
- """Instantiates a SkiaFactory as appropriate for this target_platform. |
- do_upload_render_results: whether we should upload render results |
- do_upload_bench_results: whether we should upload bench results |
- do_patch_step: whether the build should include a step which applies a |
- patch. This is only applicable for trybots. |
- build_subdir: subdirectory to check out and then build within |
- other_repos: list of other repositories to also check out (or None). Each |
- repo is specified as a tuple: (name, url), where "name" is the target |
- directory and "url" is the source code url. |
- target_platform: a string such as TARGET_PLATFORM_LINUX |
- configuration: 'Debug' or 'Release' |
- default_timeout: default timeout for each command, in seconds |
- deps_target_os: string; the target_os to be specified in the gclient config. |
- environment_variables: dictionary of environment variables that should |
- be passed to all commands |
- perf_output_basedir: path to directory under which to store performance |
- data, or None if we don't want to store performance data |
- builder_name: name of the builder associated with this factory |
- flavor: which "flavor" of slave-side scripts this factory should use |
- make_flags: list of extra flags to pass to the compile step |
- test_args: list of extra flags to pass to the 'tests' executable |
- gm_args: list of extra flags to pass to the 'gm' executable |
- bench_args: list of extra flags to pass to the 'bench' executable |
- bench_pictures_cfg: config name to use for bench_pictures |
- compile_warnings_as_errors: boolean; whether to build with "-Werror" or |
- some equivalent. |
- gyp_defines: optional dict; GYP_DEFINES to be used in the build. |
- build_targets: optional list; the targets to build. Default is set depending |
- on which Build() function is called. |
- """ |
- properties = {} |
- |
- self.skipsteps = utils.GetListFromEnvVar( |
- config_private.SKIPSTEPS_ENVIRONMENT_VARIABLE) |
- self.dontskipsteps = utils.GetListFromEnvVar( |
- config_private.DONTSKIPSTEPS_ENVIRONMENT_VARIABLE) |
- |
- if not make_flags: |
- make_flags = [] |
- self._make_flags = make_flags |
- # Platform-specific stuff. |
- if target_platform == TARGET_PLATFORM_WIN32: |
- self.TargetPath = ntpath |
- else: |
- self.TargetPath = posixpath |
- |
- # Create gclient solutions corresponding to the main build_subdir |
- # and other directories we also wish to check out. |
- self._gclient_solutions = [gclient_factory.GClientSolution( |
- svn_url=SKIA_GIT_URL, name=build_subdir |
- ).GetSpec()] |
- |
- if not other_repos: |
- other_repos = [] |
- repos_to_checkout = set(other_repos) |
- |
- for other_repo in repos_to_checkout: |
- self._gclient_solutions.append(gclient_factory.GClientSolution( |
- svn_url=other_repo[1], name=other_repo[0]).GetSpec()) |
- |
- self._deps_target_os = deps_target_os |
- |
- # Set _default_clobber based on config.Master |
- self._default_clobber = getattr(config.Master, 'default_clobber', False) |
- |
- self._do_upload_render_results = do_upload_render_results |
- self._do_upload_bench_results = (do_upload_bench_results and |
- perf_output_basedir != None) |
- self._do_patch_step = do_patch_step |
- |
- if not environment_variables: |
- self._env_vars = {} |
- else: |
- self._env_vars = dict(environment_variables) |
- |
- self._gyp_defines = dict(gyp_defines or {}) |
- self._gyp_defines['skia_warnings_as_errors'] = \ |
- '%d' % int(compile_warnings_as_errors) |
- |
- self._build_targets = list(build_targets or []) |
- |
- # Get an implementation of SkiaCommands as appropriate for |
- # this target_platform. |
- self._workdir = self.TargetPath.join('build', build_subdir) |
- self._skia_cmd_obj = skia_commands.SkiaCommands( |
- target_platform=target_platform, factory=self, |
- configuration=configuration, workdir=self._workdir, |
- target_arch=None, default_timeout=default_timeout, |
- environment_variables=self._env_vars) |
- |
- self._perf_output_basedir = perf_output_basedir |
- |
- self._configuration = configuration |
- if self._configuration not in CONFIGURATIONS: |
- raise ValueError('Invalid configuration %s. Must be one of: %s' % ( |
- self._configuration, CONFIGURATIONS)) |
- |
- self._skia_svn_username_file = '.skia_svn_username' |
- self._skia_svn_password_file = '.skia_svn_password' |
- self._builder_name = builder_name |
- self._flavor = flavor |
- |
- def _DetermineRevision(build): |
- """ Get the 'revision' property at build time. WithProperties returns the |
- empty string if 'revision' is not defined, which causes failures when we |
- try to pass the revision over a command line, so we use the string "None" |
- to indicate that the revision is not defined. |
- |
- build: instance of Build for the current build. |
- """ |
- props = build.getProperties().asDict() |
- if props.has_key('revision'): |
- if props['revision'][0]: |
- return props['revision'][0] |
- return 'None' |
- |
- if not test_args: |
- test_args = [] |
- if not gm_args: |
- gm_args = [] |
- if not bench_args: |
- bench_args = [] |
- |
- self._common_args = [ |
- # See http://skbug.com/2663 before deleting the next line. |
- '--autogen_svn_baseurl', 'bogusValueToFixSkBug2663', |
- '--configuration', configuration, |
- '--deps_target_os', self._deps_target_os or 'None', |
- '--builder_name', builder_name, |
- '--build_number', WithProperties('%(buildnumber)s'), |
- '--target_platform', target_platform, |
- '--revision', WithProperties('%(rev)s', rev=_DetermineRevision), |
- '--got_revision', WithProperties('%(got_revision:-None)s'), |
- '--perf_output_basedir', perf_output_basedir or 'None', |
- '--make_flags', '"%s"' % ' '.join(self._make_flags), |
- '--test_args', '"%s' % ' '.join(test_args), |
- '--gm_args', '"%s"' % ' '.join(gm_args), |
- '--bench_args', '"%s"' % ' '.join(bench_args), |
- '--is_try', str(self._do_patch_step), |
- '--bench_pictures_cfg', bench_pictures_cfg, |
- '--issue_number', WithProperties('%(issue:-None)s'), |
- ] |
- BuildFactory.__init__(self, build_factory_properties=properties) |
- |
- def Validate(self): |
- """ Validate the Factory against the known good configuration. """ |
- test_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, |
- 'tools', 'tests', 'factory_configuration') |
- |
- # Write the actual configuration. |
- actual_dir = os.path.join(test_dir, 'actual') |
- if not os.path.exists(actual_dir): |
- os.makedirs(actual_dir) |
- self_as_string = utils.ToString(self.__dict__) |
- with open(os.path.join(actual_dir, self._builder_name), 'w') as f: |
- f.write(self_as_string) |
- |
- # Read the expected configuration. |
- expected_dir = os.path.join(test_dir, 'expected') |
- try: |
- expectation = open(os.path.join(expected_dir, self._builder_name)).read() |
- except IOError: |
- msg = 'No expected factory configuration for %s in %s.' % ( |
- self._builder_name, expected_dir) |
- if config_private.die_on_validation_failure: |
- raise Exception(msg) |
- else: |
- print 'Warning: %s' % msg |
- return |
- |
- # Compare actual to expected. |
- if self_as_string != expectation: |
- if config_private.die_on_validation_failure: |
- raise ValueError('Factory configuration for %s does not match ' |
- 'expectation in %s! Here\'s the diff:\n%s\n' % |
- (self._builder_name, expected_dir, |
- utils.StringDiff(expectation, self_as_string))) |
- else: |
- # We don't print the full diff in this case because: |
- # a. It's generally too long to be easily read in a terminal |
- # b. All of the printing can noticeably slow down the master startup |
- # c. The master prints so much output that it would be easy to miss the |
- # diff if we did print it. |
- print 'Warning: Factory configuration for %s does not match ' \ |
- 'expectation!' % self._builder_name |
- |
- # TODO(borenet): Can kwargs be used to simplify this function declaration? |
- def AddSlaveScript(self, script, description, args=None, timeout=None, |
- halt_on_failure=False, |
- is_upload_render_step=False, is_upload_bench_step=False, |
- is_rebaseline_step=False, get_props_from_stdout=None, |
- workdir=None, do_step_if=None, always_run=False, |
- flunk_on_failure=True, exception_on_failure=False): |
- """ Add a BuildStep consisting of a python script. |
- |
- script: which slave-side python script to run. |
- description: string briefly describing the BuildStep; if this description |
- is in the self.skipsteps list, this BuildStep will be skipped--unless |
- it's in the self.dontskipsteps list, in which case we run it! |
- args: optional list of strings; arguments to pass to the script. |
- timeout: optional integer; maximum time for the BuildStep to complete. |
- halt_on_failure: boolean indicating whether to continue the build if this |
- step fails. |
- is_upload_render_step: boolean; if true, only run if |
- self._do_upload_render_results is True |
- is_upload_bench_step: boolean; if true, only run if |
- self._do_upload_bench_results is True |
- is_rebaseline_step: boolean indicating whether this step is required for |
- rebaseline-only builds. |
- get_props_from_stdout: optional dictionary. Keys are strings indicating |
- build properties to set based on the output of this step. Values are |
- strings containing regular expressions for parsing the property from |
- the output of the step. |
- workdir: optional string indicating the working directory in which to run |
- the script. If this is provided, then the script must be given relative |
- to this directory. |
- do_step_if: optional, function which determines whether or not to run the |
- step. The function is not evaluated until runtime. |
- always_run: boolean indicating whether this step should run even if a |
- previous step which had halt_on_failure has failed. |
- flunk_on_failure: boolean indicating whether the whole build fails if this |
- step fails. |
- exception_on_failure: boolean indicating whether to raise an exception if |
- this step fails. This causes the step to go purple instead of red, and |
- causes the build to stop. Should be used if the build step's failure is |
- typically transient or results from an infrastructure failure rather |
- than a code change. |
- """ |
- if description not in self.dontskipsteps: |
- if description in self.skipsteps: |
- return |
- if is_upload_render_step and not self._do_upload_render_results: |
- return |
- if is_upload_bench_step and not self._do_upload_bench_results: |
- return |
- |
- arguments = list(self._common_args) |
- if args: |
- arguments += args |
- self._skia_cmd_obj.AddSlaveScript( |
- script=script, |
- args=arguments, |
- description=description, |
- timeout=timeout, |
- halt_on_failure=halt_on_failure, |
- is_upload_step=is_upload_render_step or is_upload_bench_step, |
- is_rebaseline_step=is_rebaseline_step, |
- get_props_from_stdout=get_props_from_stdout, |
- workdir=workdir, |
- do_step_if=do_step_if, |
- always_run=always_run, |
- flunk_on_failure=flunk_on_failure, |
- exception_on_failure=exception_on_failure) |
- |
- def AddFlavoredSlaveScript(self, script, args=None, **kwargs): |
- """ Add a flavor-specific BuildStep. |
- |
- Finds a script to run by concatenating the flavor of this BuildFactory with |
- the provided script name. |
- """ |
- flavor_args = ['--flavor', self._flavor or 'default'] |
- self.AddSlaveScript(script, args=list(args or []) + flavor_args, **kwargs) |
- |
- def RunGYP(self, description=_RUNGYP_STEP_DESCRIPTION, do_step_if=None): |
- """ Run GYP to generate build files. |
- |
- description: string; description of this BuildStep. |
- do_step_if: optional, function which determines whether or not to run this |
- step. |
- """ |
- self.AddFlavoredSlaveScript(script='run_gyp.py', description=description, |
- halt_on_failure=True, do_step_if=do_step_if, |
- args=['--gyp_defines', |
- ' '.join('%s=%s' % (k, v) for k, v in |
- self._gyp_defines.items())]) |
- |
- def Make(self, target, description, is_rebaseline_step=False, do_step_if=None, |
- always_run=False, flunk_on_failure=True, halt_on_failure=True): |
- """ Build a single target. |
- |
- target: string; the target to build. |
- description: string; description of this BuildStep. |
- is_rebaseline_step: optional boolean; whether or not this step is required |
- for rebaseline-only builds. |
- do_step_if: optional, function which determines whether or not to run this |
- step. |
- always_run: boolean indicating whether this step should run even if a |
- previous step which had halt_on_failure has failed. |
- flunk_on_failure: boolean indicating whether the whole build fails if this |
- step fails. |
- halt_on_failure: boolean indicating whether to continue the build if this |
- step fails. |
- """ |
- args = ['--target', target, |
- '--gyp_defines', |
- ' '.join('%s=%s' % (k, v) for k, v in self._gyp_defines.items())] |
- self.AddFlavoredSlaveScript(script='compile.py', args=args, |
- description=description, |
- halt_on_failure=halt_on_failure, |
- is_rebaseline_step=is_rebaseline_step, |
- do_step_if=do_step_if, |
- always_run=always_run, |
- flunk_on_failure=flunk_on_failure) |
- |
- def Compile(self, clobber=None, retry_with_clobber_on_failure=True, |
- retry_without_werr_on_failure=False): |
- """ Compile step. Build everything. |
- |
- clobber: optional boolean; whether to 'clean' before building. |
- retry_with_clobber_on_failure: optional boolean; if the build fails, clean |
- and try again, with the same configuration as before. |
- retry_without_werr_on_failure: optional boolean; if the build fails, clean |
- and try again *without* warnings-as-errors. |
- """ |
- if clobber is None: |
- clobber = self._default_clobber |
- |
- |
- if clobber: |
- self.AddFlavoredSlaveScript(script='clean.py', description='Clean', |
- halt_on_failure=True) |
- |
- # Only retry with clobber if we've requested it AND we aren't clobbering on |
- # the first build. |
- maybe_retry_with_clobber = retry_with_clobber_on_failure and not clobber |
- |
- def ShouldRetryWithClobber(step): |
- """ Determine whether the retry step should run. """ |
- if not maybe_retry_with_clobber: |
- return False |
- gyp_or_compile_failed = False |
- retry_failed = False |
- for build_step in step.build.getStatus().getSteps(): |
- if (build_step.isFinished() and |
- build_step.getResults()[0] == builder.FAILURE): |
- if build_step.getName().startswith(_COMPILE_STEP_PREFIX): |
- gyp_or_compile_failed = True |
- elif build_step.getName() == _RUNGYP_STEP_DESCRIPTION: |
- gyp_or_compile_failed = True |
- elif build_step.getName().startswith(_COMPILE_RETRY_PREFIX): |
- retry_failed = True |
- return gyp_or_compile_failed and not retry_failed |
- |
- def ShouldRetryWithoutWarnings(step): |
- """ Determine whether the retry-without-warnings-as-errors step should |
- run. """ |
- if not retry_without_werr_on_failure: |
- return False |
- gyp_or_compile_failed = False |
- retry_failed = False |
- no_warning_retry_failed = False |
- for build_step in step.build.getStatus().getSteps(): |
- if (build_step.isFinished() and |
- build_step.getResults()[0] == builder.FAILURE): |
- if build_step.getName().startswith(_COMPILE_STEP_PREFIX): |
- gyp_or_compile_failed = True |
- elif build_step.getName().startswith(_COMPILE_RETRY_PREFIX): |
- retry_failed = True |
- elif build_step.getName().startswith( |
- _COMPILE_NO_WERR_PREFIX): |
- no_warning_retry_failed = True |
- # If we've already failed a previous retry without warnings, just give up. |
- if no_warning_retry_failed: |
- return False |
- # If we're retrying with clobber, only retry without warnings if a clobber |
- # retry has failed. |
- if maybe_retry_with_clobber: |
- return retry_failed |
- # Only run the retry if the initial compile has failed. |
- return gyp_or_compile_failed |
- |
- for build_target in self._build_targets: |
- self.Make(target=build_target, |
- description=_COMPILE_STEP_PREFIX + \ |
- utils.UnderscoresToCapWords(build_target), |
- flunk_on_failure=not maybe_retry_with_clobber, |
- halt_on_failure=(not maybe_retry_with_clobber and |
- not retry_without_werr_on_failure)) |
- |
- # Try again with a clean build. |
- self.AddFlavoredSlaveScript(script='clean.py', description='Clean', |
- do_step_if=ShouldRetryWithClobber) |
- for build_target in self._build_targets: |
- self.Make(target=build_target, |
- description=_COMPILE_RETRY_PREFIX + \ |
- utils.UnderscoresToCapWords(build_target), |
- flunk_on_failure=True, |
- halt_on_failure=not retry_without_werr_on_failure, |
- do_step_if=ShouldRetryWithClobber) |
- |
- # Try again without warnings-as-errors. |
- self._gyp_defines['skia_warnings_as_errors'] = '0' |
- self.AddFlavoredSlaveScript(script='clean.py', description='Clean', |
- always_run=True, |
- do_step_if=ShouldRetryWithoutWarnings) |
- for build_target in self._build_targets: |
- self.Make(target=build_target, |
- description=_COMPILE_NO_WERR_PREFIX + \ |
- utils.UnderscoresToCapWords(build_target), |
- flunk_on_failure=True, |
- halt_on_failure=True, |
- do_step_if=ShouldRetryWithoutWarnings) |
- |
- def Install(self): |
- """ Install the compiled executables. """ |
- self.AddFlavoredSlaveScript(script='install.py', description='Install', |
- halt_on_failure=True, exception_on_failure=True) |
- |
- def DownloadSKPs(self): |
- """ Download the SKPs. """ |
- self.AddSlaveScript(script='download_skps.py', description='DownloadSKPs', |
- halt_on_failure=True, exception_on_failure=True) |
- |
- def DownloadSKImageFiles(self): |
- """ Download image files for running skimage. """ |
- self.AddSlaveScript(script='download_skimage_files.py', |
- description='DownloadSKImageFiles', |
- halt_on_failure=True, exception_on_failure=True) |
- |
- def RunDecodingTests(self): |
- """ Run tests of image decoders. """ |
- self.AddFlavoredSlaveScript(script='run_decoding_tests.py', |
- description='RunDecodingTests') |
- |
- def RunDM(self): |
- """Run DM.""" |
- self.AddFlavoredSlaveScript('run_dm.py', description='RunDM') |
- |
- def RunGM(self): |
- """ Run the "GM" tool, saving the images to disk. """ |
- self.AddFlavoredSlaveScript(script='run_gm.py', description='GenerateGMs', |
- is_rebaseline_step=True) |
- |
- def PreRender(self): |
- """ Step to run before the render steps. """ |
- self.AddFlavoredSlaveScript(script='prerender.py', description='PreRender', |
- exception_on_failure=True) |
- |
- def RenderSKPs(self): |
- """ Generate images from .skp's. """ |
- self.AddFlavoredSlaveScript(script='render_skps.py', |
- description='RenderSKPs') |
- |
- def RenderPdfs(self): |
- """ Run the "render_pdfs" tool to generate pdfs from .skp's. """ |
- self.AddFlavoredSlaveScript(script='render_pdfs.py', |
- description='RenderPdfs') |
- |
- def PostRender(self): |
- """ Step to run after the render steps. """ |
- self.AddFlavoredSlaveScript(script='postrender.py', |
- description='PostRender', |
- exception_on_failure=True) |
- |
- def PreBench(self): |
- """ Step to run before the benchmarking steps. """ |
- self.AddFlavoredSlaveScript(script='prebench.py', |
- description='PreBench', |
- exception_on_failure=True) |
- |
- def PostBench(self): |
- """ Step to run after the benchmarking steps. """ |
- self.AddFlavoredSlaveScript(script='postbench.py', |
- description='PostBench', |
- exception_on_failure=True) |
- |
- def CompareGMs(self): |
- """Compare the actually-generated GM images to the checked-in baselines.""" |
- self.AddSlaveScript(script='compare_gms.py', |
- description='CompareGMs', |
- get_props_from_stdout={ |
- 'latest_gm_failures_url': |
- '%s([^\n]*)\n' % skia_vars.GetGlobalVariable( |
- 'latest_gm_failures_preamble')}, |
- is_rebaseline_step=True) |
- |
- def CompareRenderedSKPs(self): |
- """Compare the actual image results of SKP rendering to expectations.""" |
- self.AddSlaveScript(script='compare_rendered_skps.py', |
- description='CompareRenderedSKPs', |
- is_rebaseline_step=True) |
- |
- def RunNanobench(self): |
- """ Run "nanobench" """ |
- self.AddFlavoredSlaveScript(script='run_nanobench.py', |
- description='RunNanobench') |
- |
- def UpdateScripts(self): |
- """ Update the buildbot scripts on the build slave. |
- |
- Only runs in production. See http://skbug.com/2432 |
- """ |
- description = 'UpdateScripts' |
- if ((config_private.Master.get_active_master().is_production_host) or |
- (description in self.dontskipsteps)): |
- self.AddSlaveScript( |
- script=self.TargetPath.join('..', '..', '..', '..', |
- '..', 'slave', |
- 'skia_slave_scripts', |
- 'update_scripts.py'), |
- description=description, |
- halt_on_failure=True, |
- get_props_from_stdout={'buildbot_revision': |
- 'Skiabot scripts updated to (\w+)'}, |
- workdir='build', |
- exception_on_failure=True) |
- |
- def Update(self): |
- """ Update the Skia code on the build slave. """ |
- args = ['--gclient_solutions', '"%s"' % self._gclient_solutions] |
- self.AddSlaveScript( |
- script=self.TargetPath.join('..', '..', '..', '..', '..', 'slave', |
- 'skia_slave_scripts', 'update.py'), |
- description='Update', |
- args=args, |
- timeout=None, |
- halt_on_failure=True, |
- is_rebaseline_step=True, |
- get_props_from_stdout={'got_revision':'Skia updated to (\w+)'}, |
- workdir='build', |
- exception_on_failure=True) |
- |
- def ApplyPatch(self, alternate_workdir=None, alternate_script=None): |
- """ Apply a patch to the Skia code on the build slave. """ |
- def _GetPatch(build): |
- """Find information about the patch (if any) to apply. |
- |
- Returns: |
- An encoded string containing a tuple of the form (level, url) which |
- indicates where to go to download the patch. |
- """ |
- if build.getSourceStamp().patch and \ |
- 'patch_file_url' in build.getProperties(): |
- # The presence of a patch attached to the Source Stamp and the |
- # 'patch_file_url' build property indicate that the patch came from the |
- # skia_try repo, and was probably submitted using the submit_try script |
- # or "gcl/git-cl try". |
- patch = (build.getSourceStamp().patch[0], |
- build.getProperty('patch_file_url')) |
- return str(patch).encode() |
- elif 'issue' in build.getProperties() and \ |
- 'patchset' in build.getProperties(): |
- # The presence of the 'issue' and 'patchset' build properties indicates |
- # that the patch came from Rietveld. |
- # Don't assume that the 'issue' and 'patchset' build properties are |
- # always integer type, even though they should contain integers. |
- patch = '%s/download/issue%s_%s.diff' % ( |
- config_private.CODE_REVIEW_SITE.rstrip('/'), |
- build.getProperty('issue'), |
- build.getProperty('patchset')) |
- # If the patch came from Rietveld, assume it came from a git repo and |
- # therefore it has a patch level of 1. If this isn't the case, the |
- # slave-side script should detect it and use level 0 instead. |
- return str((1, patch)).encode() |
- else: |
- patch = 'None' |
- return patch |
- |
- if not bool(alternate_workdir) == bool(alternate_script): |
- raise ValueError('alternate_workdir and alternate_script must be provided' |
- ' together.') |
- args = ['--patch', WithProperties('%(patch)s', patch=_GetPatch)] |
- if alternate_script: |
- self.AddSlaveScript(script=alternate_script, |
- description='ApplyPatch', |
- args=args, |
- halt_on_failure=True, |
- workdir=alternate_workdir, |
- exception_on_failure=True) |
- else: |
- self.AddSlaveScript(script='apply_patch.py', |
- description='ApplyPatch', |
- args=args, |
- halt_on_failure=True, |
- exception_on_failure=True) |
- |
- def UpdateSteps(self): |
- """ Update the Skia sources. """ |
- self.UpdateScripts() |
- self.Update() |
- if self._do_patch_step: |
- self.ApplyPatch() |
- |
- def UploadBenchResults(self): |
- """ Upload bench results (performance data). """ |
- self.AddSlaveScript(script='upload_bench_results.py', |
- description='UploadBenchResults', |
- exception_on_failure=True, |
- is_upload_bench_step=True) |
- |
- def UploadBenchResultsToAppEngine(self): |
- """ Upload bench results (performance data) to AppEngine. """ |
- self.AddSlaveScript(script='upload_bench_results_appengine.py', |
- description='UploadBenchResultsToAppengine', |
- exception_on_failure=True) |
- |
- def UploadWebpagePictureBenchResults(self): |
- """ Upload webpage picture bench results (performance data). """ |
- self.AddSlaveScript(script='upload_webpage_picture_bench_results.py', |
- description='UploadWebpagePictureBenchResults', |
- exception_on_failure=True) |
- |
- |
- def UploadGMResults(self): |
- """ Upload the images generated by GM """ |
- self.AddSlaveScript(script='upload_gm_results.py', |
- description='UploadGMResults', timeout=5400, |
- is_upload_render_step=True, is_rebaseline_step=True, |
- exception_on_failure=True) |
- |
- def UploadRenderedSKPs(self): |
- """Upload the actual image results of SKP rendering.""" |
- self.AddSlaveScript(script='upload_rendered_skps.py', |
- description='UploadRenderedSKPs', |
- is_upload_render_step=True, is_rebaseline_step=True) |
- |
- def UploadSKImageResults(self): |
- self.AddSlaveScript(script='upload_skimage_results.py', |
- description='UploadSKImageResults', |
- is_upload_render_step=True, |
- exception_on_failure=True) |
- |
- def CommonSteps(self, clobber=None): |
- """ Steps which are run at the beginning of all builds. """ |
- self.UpdateSteps() |
- self.DownloadSKPs() |
- self.Compile(clobber) |
- self.Install() |
- |
- def NonPerfSteps(self): |
- """ Add correctness testing BuildSteps. """ |
- self.DownloadSKImageFiles() |
- self.PreRender() |
- self.RunDM() |
- self.RunGM() |
- self.RenderSKPs() |
- self.RenderPdfs() |
- self.RunDecodingTests() |
- self.PostRender() |
- self.UploadGMResults() |
- self.UploadRenderedSKPs() |
- self.UploadSKImageResults() |
- self.CompareGMs() |
- self.CompareRenderedSKPs() |
- |
- def PerfSteps(self): |
- """ Add performance testing BuildSteps. """ |
- self.PreBench() |
- self.RunNanobench() |
- self.PostBench() |
- self.UploadBenchResults() |
- |
- def Build(self, role=None, clobber=None): |
- """Build and return the complete BuildFactory. |
- |
- role: string; the intended role of this builder. The role affects which |
- steps are run. Known values are given in the utils module. |
- clobber: boolean indicating whether we should clean before building |
- """ |
- # Special case: for the ZeroGPUCache bot, we only run GM. |
- if 'ZeroGPUCache' in self._builder_name: |
- self._build_targets = ['gm'] |
- self.UpdateSteps() |
- self.Compile(clobber) |
- self.Install() |
- self.PreRender() |
- self.RunGM() |
- self.PostRender() |
- elif ('TSAN' in self._builder_name and |
- role == builder_name_schema.BUILDER_ROLE_TEST): |
- self._build_targets = ['dm'] |
- self.UpdateSteps() |
- self.Compile(clobber) |
- self.Install() |
- self.RunDM() |
- elif ('Valgrind' in self._builder_name and |
- role == builder_name_schema.BUILDER_ROLE_TEST): |
- if not self._build_targets: |
- self._build_targets = ['most'] |
- self.CommonSteps(clobber) |
- # TODO(borenet):When https://code.google.com//p/skia/issues/detail?id=1711 |
- # is fixed, run self.NonPerfSteps() instead of the below steps. |
- self.DownloadSKImageFiles() |
- self.PreRender() |
- self.RunDM() |
- self.RunGM() |
- self.RenderSKPs() |
- self.RenderPdfs() |
- self.RunDecodingTests() |
- self.PostRender() |
- # (end steps which need to be replaced once #1711 is fixed) |
- self.PreBench() |
- self.RunNanobench() |
- self.PostBench() |
- elif not role: |
- # If no role is provided, just run everything. |
- if not self._build_targets: |
- self._build_targets = ['most'] |
- self.CommonSteps(clobber) |
- self.NonPerfSteps() |
- self.PerfSteps() |
- elif role == builder_name_schema.BUILDER_ROLE_BUILD: |
- # Compile-only builder. |
- self.UpdateSteps() |
- if not self._build_targets: |
- self._build_targets = [] |
- if (('Win' in self._builder_name) or |
- ('Ubuntu' in self._builder_name and 'x86-' in self._builder_name) or |
- 'Mac10.6' in self._builder_name or 'Mac10.7' in self._builder_name): |
- # Don't compile the debugger on Windows, Mac 10.6, Mac 10.7, or |
- # 32-bit Linux since the Qt SDK doesn't include libraries for those |
- # platforms. |
- self._build_targets.append('most') |
- else: |
- self._build_targets.append('everything') |
- self.Compile(clobber=clobber, |
- retry_without_werr_on_failure=True) |
- else: |
- if not self._build_targets: |
- self._build_targets = ['most'] |
- self.CommonSteps(clobber) |
- if role == builder_name_schema.BUILDER_ROLE_TEST: |
- # Test-running builder. |
- self.NonPerfSteps() |
- if self._configuration == CONFIG_DEBUG: |
- # Debug-mode testers run all steps, but release-mode testers don't. |
- self.PerfSteps() |
- elif role == builder_name_schema.BUILDER_ROLE_PERF: |
- # Perf-only builder. |
- if not self._perf_output_basedir: |
- raise ValueError( |
- 'BuildPerfOnly requires perf_output_basedir to be defined.') |
- if self._configuration != CONFIG_RELEASE: |
- raise ValueError('BuildPerfOnly should run in %s configuration.' % |
- CONFIG_RELEASE) |
- self.PerfSteps() |
- self.Validate() |
- return self |