| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Common utilities for all buildbot scripts that specifically don't rely | 5 """Common utilities for all buildbot scripts that specifically don't rely |
| 6 on having a full chromium checkout. | 6 on having a full chromium checkout. |
| 7 """ | 7 """ |
| 8 | 8 |
| 9 import os | 9 import os |
| 10 import subprocess | 10 import subprocess |
| 11 import sys | 11 import sys |
| 12 | 12 |
| 13 from build_paths import SDK_SRC_DIR, NACL_DIR | 13 from build_paths import SDK_SRC_DIR, NACL_DIR |
| 14 | 14 |
| 15 sys.path.append(os.path.join(SDK_SRC_DIR, 'tools')) | 15 sys.path.append(os.path.join(SDK_SRC_DIR, 'tools')) |
| 16 import oshelpers | 16 import oshelpers |
| 17 import getos | 17 import getos |
| 18 | 18 |
| 19 |
| 20 verbose = True |
| 21 |
| 22 |
| 19 def IsSDKBuilder(): | 23 def IsSDKBuilder(): |
| 20 """Returns True if this script is running on an SDK builder. | 24 """Returns True if this script is running on an SDK builder. |
| 21 | 25 |
| 22 False means it is either running on a trybot, or a user's machine. | 26 False means it is either running on a trybot, or a user's machine. |
| 23 | 27 |
| 24 Trybot names: | 28 Trybot names: |
| 25 (win|mac|linux)_nacl_sdk | 29 (win|mac|linux)_nacl_sdk |
| 26 | 30 |
| 27 Build-only Trybot names: | 31 Build-only Trybot names: |
| 28 (win|mac|linux)_nacl_sdk_build | 32 (win|mac|linux)_nacl_sdk_build |
| (...skipping 12 matching lines...) Expand all Loading... |
| 41 See IsSDKBuilder above for trybot/buildbot names.""" | 45 See IsSDKBuilder above for trybot/buildbot names.""" |
| 42 return '_nacl_sdk' in os.getenv('BUILDBOT_BUILDERNAME', '') | 46 return '_nacl_sdk' in os.getenv('BUILDBOT_BUILDERNAME', '') |
| 43 | 47 |
| 44 | 48 |
| 45 def ErrorExit(msg): | 49 def ErrorExit(msg): |
| 46 """Write and error to stderr, then exit with 1 signaling failure.""" | 50 """Write and error to stderr, then exit with 1 signaling failure.""" |
| 47 sys.stderr.write(str(msg) + '\n') | 51 sys.stderr.write(str(msg) + '\n') |
| 48 sys.exit(1) | 52 sys.exit(1) |
| 49 | 53 |
| 50 | 54 |
| 55 def Trace(msg): |
| 56 if verbose: |
| 57 sys.stderr.write(str(msg) + '\n') |
| 58 |
| 59 |
| 51 def GetWindowsEnvironment(): | 60 def GetWindowsEnvironment(): |
| 52 sys.path.append(os.path.join(NACL_DIR, 'buildbot')) | 61 sys.path.append(os.path.join(NACL_DIR, 'buildbot')) |
| 53 import buildbot_standard | 62 import buildbot_standard |
| 54 | 63 |
| 55 # buildbot_standard.SetupWindowsEnvironment expects a "context" object. We'll | 64 # buildbot_standard.SetupWindowsEnvironment expects a "context" object. We'll |
| 56 # fake enough of that here to work. | 65 # fake enough of that here to work. |
| 57 class FakeContext(object): | 66 class FakeContext(object): |
| 58 def __init__(self): | 67 def __init__(self): |
| 59 self.env = os.environ | 68 self.env = os.environ |
| 60 | 69 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 86 # It looks like this: | 95 # It looks like this: |
| 87 # KEY1=VALUE1\r\n | 96 # KEY1=VALUE1\r\n |
| 88 # KEY2=VALUE2\r\n | 97 # KEY2=VALUE2\r\n |
| 89 # ... | 98 # ... |
| 90 return dict(line.split('=') for line in stdout.split('\r\n')[:-1]) | 99 return dict(line.split('=') for line in stdout.split('\r\n')[:-1]) |
| 91 | 100 |
| 92 | 101 |
| 93 def BuildStep(name): | 102 def BuildStep(name): |
| 94 """Annotate a buildbot build step.""" | 103 """Annotate a buildbot build step.""" |
| 95 sys.stdout.flush() | 104 sys.stdout.flush() |
| 96 print '\n@@@BUILD_STEP %s@@@' % name | 105 sys.stderr.write('\n@@@BUILD_STEP %s@@@\n' % name) |
| 97 sys.stdout.flush() | |
| 98 | 106 |
| 99 | 107 |
| 100 def Run(args, cwd=None, env=None, shell=False): | 108 def Run(args, cwd=None, env=None, shell=False): |
| 101 """Start a process with the provided arguments. | 109 """Start a process with the provided arguments. |
| 102 | 110 |
| 103 Starts a process in the provided directory given the provided arguments. If | 111 Starts a process in the provided directory given the provided arguments. If |
| 104 shell is not False, the process is launched via the shell to provide shell | 112 shell is not False, the process is launched via the shell to provide shell |
| 105 interpretation of the arguments. Shell behavior can differ between platforms | 113 interpretation of the arguments. Shell behavior can differ between platforms |
| 106 so this should be avoided when not using platform dependent shell scripts.""" | 114 so this should be avoided when not using platform dependent shell scripts.""" |
| 107 | 115 |
| 108 # We need to modify the environment to build host on Windows. | 116 # We need to modify the environment to build host on Windows. |
| 109 if not env and getos.GetPlatform() == 'win': | 117 if not env and getos.GetPlatform() == 'win': |
| 110 env = GetWindowsEnvironment() | 118 env = GetWindowsEnvironment() |
| 111 | 119 |
| 112 print 'Running: ' + ' '.join(args) | 120 Trace('Running: ' + ' '.join(args)) |
| 113 sys.stdout.flush() | 121 sys.stdout.flush() |
| 114 sys.stderr.flush() | 122 sys.stderr.flush() |
| 115 try: | 123 try: |
| 116 subprocess.check_call(args, cwd=cwd, env=env, shell=shell) | 124 subprocess.check_call(args, cwd=cwd, env=env, shell=shell) |
| 117 except subprocess.CalledProcessError as e: | 125 except subprocess.CalledProcessError as e: |
| 118 sys.stdout.flush() | 126 sys.stdout.flush() |
| 119 sys.stderr.flush() | 127 sys.stderr.flush() |
| 120 ErrorExit('buildbot_common: %s' % e) | 128 ErrorExit('buildbot_common: %s' % e) |
| 121 | 129 |
| 122 sys.stdout.flush() | 130 sys.stdout.flush() |
| 123 sys.stderr.flush() | 131 sys.stderr.flush() |
| 124 | 132 |
| 125 | 133 |
| 126 def CopyDir(src, dst, excludes=('.svn', '*/.svn')): | 134 def CopyDir(src, dst, excludes=('.svn', '*/.svn')): |
| 127 """Recursively copy a directory using.""" | 135 """Recursively copy a directory using.""" |
| 128 args = ['-r', src, dst] | 136 args = ['-r', src, dst] |
| 129 for exc in excludes: | 137 for exc in excludes: |
| 130 args.append('--exclude=' + exc) | 138 args.append('--exclude=' + exc) |
| 131 print 'cp -r %s %s' % (src, dst) | 139 Trace('cp -r %s %s' % (src, dst)) |
| 132 if os.path.abspath(src) == os.path.abspath(dst): | 140 if os.path.abspath(src) == os.path.abspath(dst): |
| 133 ErrorExit('ERROR: Copying directory onto itself: ' + src) | 141 ErrorExit('ERROR: Copying directory onto itself: ' + src) |
| 134 oshelpers.Copy(args) | 142 oshelpers.Copy(args) |
| 135 | 143 |
| 136 | 144 |
| 137 def CopyFile(src, dst): | 145 def CopyFile(src, dst): |
| 138 print 'cp %s %s' % (src, dst) | 146 Trace('cp %s %s' % (src, dst)) |
| 139 if os.path.abspath(src) == os.path.abspath(dst): | 147 if os.path.abspath(src) == os.path.abspath(dst): |
| 140 ErrorExit('ERROR: Copying file onto itself: ' + src) | 148 ErrorExit('ERROR: Copying file onto itself: ' + src) |
| 141 args = [src, dst] | 149 args = [src, dst] |
| 142 oshelpers.Copy(args) | 150 oshelpers.Copy(args) |
| 143 | 151 |
| 144 | 152 |
| 145 def RemoveDir(dst): | 153 def RemoveDir(dst): |
| 146 """Remove the provided path.""" | 154 """Remove the provided path.""" |
| 147 print 'rm -fr ' + dst | 155 Trace('rm -fr ' + dst) |
| 148 oshelpers.Remove(['-fr', dst]) | 156 oshelpers.Remove(['-fr', dst]) |
| 149 | 157 |
| 150 | 158 |
| 151 def MakeDir(dst): | 159 def MakeDir(dst): |
| 152 """Create the path including all parent directories as needed.""" | 160 """Create the path including all parent directories as needed.""" |
| 153 print 'mkdir -p ' + dst | 161 Trace('mkdir -p ' + dst) |
| 154 oshelpers.Mkdir(['-p', dst]) | 162 oshelpers.Mkdir(['-p', dst]) |
| 155 | 163 |
| 156 | 164 |
| 157 def Move(src, dst): | 165 def Move(src, dst): |
| 158 """Move the path src to dst.""" | 166 """Move the path src to dst.""" |
| 159 print 'mv -f %s %s' % (src, dst) | 167 Trace('mv -f %s %s' % (src, dst)) |
| 160 oshelpers.Move(['-f', src, dst]) | 168 oshelpers.Move(['-f', src, dst]) |
| 161 | 169 |
| 162 | 170 |
| 163 def RemoveFile(dst): | 171 def RemoveFile(dst): |
| 164 """Remove the provided file.""" | 172 """Remove the provided file.""" |
| 165 print 'rm ' + dst | 173 Trace('rm ' + dst) |
| 166 oshelpers.Remove(['-f', dst]) | 174 oshelpers.Remove(['-f', dst]) |
| 167 | 175 |
| 168 | 176 |
| 169 BOT_GSUTIL = '/b/build/scripts/slave/gsutil' | 177 BOT_GSUTIL = '/b/build/scripts/slave/gsutil' |
| 170 # On Windows, the current working directory may be on a different drive than | 178 # On Windows, the current working directory may be on a different drive than |
| 171 # gsutil. | 179 # gsutil. |
| 172 WIN_BOT_GSUTIL = 'E:' + BOT_GSUTIL | 180 WIN_BOT_GSUTIL = 'E:' + BOT_GSUTIL |
| 173 LOCAL_GSUTIL = 'gsutil' | 181 LOCAL_GSUTIL = 'gsutil' |
| 174 | 182 |
| 175 | 183 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 190 # Since GetGsutil() might just return 'gsutil' and expect it to be looked | 198 # Since GetGsutil() might just return 'gsutil' and expect it to be looked |
| 191 # up in the PATH, we must pass shell=True on windows. | 199 # up in the PATH, we must pass shell=True on windows. |
| 192 # Without shell=True the windows implementation of subprocess.call will not | 200 # Without shell=True the windows implementation of subprocess.call will not |
| 193 # search the PATH for the executable: http://bugs.python.org/issue8557 | 201 # search the PATH for the executable: http://bugs.python.org/issue8557 |
| 194 shell = getos.GetPlatform() == 'win' | 202 shell = getos.GetPlatform() == 'win' |
| 195 | 203 |
| 196 cmd = [GetGsutil(), 'cp', '-a', 'public-read', filename, full_dst] | 204 cmd = [GetGsutil(), 'cp', '-a', 'public-read', filename, full_dst] |
| 197 Run(cmd, shell=shell, cwd=cwd) | 205 Run(cmd, shell=shell, cwd=cwd) |
| 198 url = 'https://storage.googleapis.com/%s/%s' % (bucket_path, filename) | 206 url = 'https://storage.googleapis.com/%s/%s' % (bucket_path, filename) |
| 199 if step_link: | 207 if step_link: |
| 200 print '@@@STEP_LINK@download@%s@@@' % url | |
| 201 sys.stdout.flush() | 208 sys.stdout.flush() |
| 209 sys.stderr.write('@@@STEP_LINK@download@%s@@@\n' % url) |
| OLD | NEW |