OLD | NEW |
| (Empty) |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 """Set of utilities to add commands to a buildbot factory. | |
6 | |
7 This is based on commands.py and adds skia-specific commands. | |
8 | |
9 TODO(borenet): Do we need this file at all? Can't we just do everything | |
10 in factory.py? (See https://codereview.chromium.org/248053003/ ) | |
11 """ | |
12 | |
13 | |
14 from buildbot.process.properties import WithProperties | |
15 from master.factory import commands | |
16 import skia_build_step | |
17 | |
18 | |
19 class SkiaCommands(commands.FactoryCommands): | |
20 | |
21 def __init__(self, factory, configuration, workdir, target_arch, | |
22 default_timeout, target_platform, environment_variables): | |
23 """Instantiates subclass of FactoryCommands appropriate for Skia. | |
24 | |
25 factory: a BaseFactory | |
26 configuration: 'Debug' or 'Release' | |
27 workdir: string indicating path within slave directory | |
28 target_arch: string such as 'x64' | |
29 default_timeout: default timeout for each command, in seconds | |
30 target_platform: a string such as skia_factory.TARGET_PLATFORM_LINUX, | |
31 to be passed into FactoryCommands.__init__() | |
32 environment_variables: dictionary of environment variables that should | |
33 be passed to all commands | |
34 """ | |
35 commands.FactoryCommands.__init__( | |
36 self, factory=factory, target=configuration, | |
37 build_dir='', target_platform=target_platform) | |
38 # Store some parameters that the subclass may want to use later. | |
39 self.default_timeout = default_timeout | |
40 self.environment_variables = environment_variables | |
41 self.factory = factory | |
42 self.target_arch = target_arch | |
43 self.workdir = workdir | |
44 # TODO(epoger): It would be better for this path to be specified by | |
45 # an environment variable or some such, so that it is not dependent on the | |
46 # path from CWD to slave/skia_slave_scripts... but for now, this will do. | |
47 self._local_slave_script_dir = self.PathJoin( | |
48 '..', '..', '..', '..', '..', '..', 'slave', 'skia_slave_scripts') | |
49 | |
50 # TODO(borenet): Can kwargs be used to simplify this function declaration? | |
51 def AddSlaveScript(self, script, args, description, timeout=None, | |
52 halt_on_failure=False, is_upload_step=False, | |
53 is_rebaseline_step=False, get_props_from_stdout=None, | |
54 workdir=None, do_step_if=None, | |
55 always_run=False, flunk_on_failure=True, | |
56 exception_on_failure=False): | |
57 """Run a slave-side Python script as its own build step.""" | |
58 if workdir: | |
59 path_to_script = script | |
60 use_workdir = workdir | |
61 else: | |
62 path_to_script = self.PathJoin(self._local_slave_script_dir, script) | |
63 use_workdir = self.workdir | |
64 self.AddRunCommand(command=['python', path_to_script] + args, | |
65 description=description, timeout=timeout, | |
66 halt_on_failure=halt_on_failure, | |
67 is_upload_step=is_upload_step, | |
68 is_rebaseline_step=is_rebaseline_step, | |
69 get_props_from_stdout=get_props_from_stdout, | |
70 workdir=use_workdir, | |
71 do_step_if=do_step_if, | |
72 always_run=always_run, | |
73 flunk_on_failure=flunk_on_failure, | |
74 exception_on_failure=exception_on_failure) | |
75 | |
76 # TODO(borenet): Can kwargs be used to simplify this function declaration? | |
77 def AddRunCommand(self, command, description='Run', timeout=None, | |
78 halt_on_failure=False, is_upload_step=False, | |
79 is_rebaseline_step=False, get_props_from_stdout=None, | |
80 workdir=None, do_step_if=None, always_run=False, | |
81 flunk_on_failure=True, exception_on_failure=False): | |
82 """Runs an arbitrary command, perhaps a binary we built.""" | |
83 if description not in self.factory.dontskipsteps: | |
84 if description in self.factory.skipsteps: | |
85 return | |
86 | |
87 # If a developer has marked the step as dontskip, make sure it will run. | |
88 if description in self.factory.dontskipsteps: | |
89 do_step_if = True | |
90 | |
91 if not timeout: | |
92 timeout = self.default_timeout | |
93 self.factory.addStep(skia_build_step.SkiaBuildStep, | |
94 is_upload_step=is_upload_step, | |
95 is_rebaseline_step=is_rebaseline_step, | |
96 get_props_from_stdout=get_props_from_stdout, | |
97 description=description, timeout=timeout, | |
98 command=command, workdir=workdir or self.workdir, | |
99 env=self.environment_variables, | |
100 haltOnFailure=halt_on_failure, | |
101 doStepIf=do_step_if or skia_build_step.ShouldDoStep, | |
102 alwaysRun=always_run, | |
103 flunkOnFailure=flunk_on_failure, | |
104 exception_on_failure=exception_on_failure, | |
105 hideStepIf=lambda s: s.isSkipped()) | |
106 | |
107 # TODO(borenet): Can kwargs be used to simplify this function declaration? | |
108 def AddRunCommandList(self, command_list, description='Run', timeout=None, | |
109 halt_on_failure=False, is_upload_step=False, | |
110 is_rebaseline_step=False): | |
111 """Runs a list of arbitrary commands.""" | |
112 # TODO(epoger): Change this so that build-step output shows each command | |
113 # in the list separately--that will be a lot easier to follow. | |
114 # | |
115 # TODO(epoger): For now, this wraps the total command with WithProperties() | |
116 # because *some* callers need it, and we can't use the string.join() command | |
117 # to concatenate strings that have already been wrapped with | |
118 # WithProperties(). Once I figure out how to make the build-step output | |
119 # show each command separately, maybe I can remove this wrapper. | |
120 self.AddRunCommand(command=WithProperties(' && '.join(command_list)), | |
121 description=description, timeout=timeout, | |
122 halt_on_failure=halt_on_failure, | |
123 is_upload_step=is_upload_step, | |
124 is_rebaseline_step=is_rebaseline_step) | |
OLD | NEW |