Chromium Code Reviews| Index: buildbot/buildbot_run.py |
| diff --git a/buildbot/buildbot_run.py b/buildbot/buildbot_run.py |
| index b20a424de53ee49fc087666a23729b76c8391a75..63827074295aaae3e5837c211c0ee9769f7cd5dd 100755 |
| --- a/buildbot/buildbot_run.py |
| +++ b/buildbot/buildbot_run.py |
| @@ -7,6 +7,7 @@ |
| """Argument-less script to select what to run on the buildbots.""" |
| +import filecmp |
| import os |
| import shutil |
| import subprocess |
| @@ -30,7 +31,8 @@ OUT_DIR = os.path.join(TRUNK_DIR, 'out') |
| def CallSubProcess(*args, **kwargs): |
| """Wrapper around subprocess.call which treats errors as build exceptions.""" |
| - retcode = subprocess.call(*args, **kwargs) |
| + with open(os.devnull) as devnull_fd: |
| + retcode = subprocess.call(stdin=devnull_fd, *args, **kwargs) |
| if retcode != 0: |
| print '@@@STEP_EXCEPTION@@@' |
| sys.exit(1) |
| @@ -49,10 +51,6 @@ def PrepareCmake(): |
| print '@@@BUILD_STEP Initialize CMake checkout@@@' |
| os.mkdir(CMAKE_DIR) |
| - CallSubProcess(['git', 'config', '--global', 'user.name', 'trybot']) |
| - CallSubProcess(['git', 'config', '--global', |
| - 'user.email', 'chrome-bot@google.com']) |
| - CallSubProcess(['git', 'config', '--global', 'color.ui', 'false']) |
| print '@@@BUILD_STEP Sync CMake@@@' |
| CallSubProcess( |
| @@ -82,27 +80,44 @@ def PrepareAndroidTree(): |
| print '@@@BUILD_STEP Clobber Android checkout@@@' |
| shutil.rmtree(ANDROID_DIR) |
| - # The release of Android we use is static, so there's no need to do anything |
| - # if the directory already exists. |
| - if os.path.isdir(ANDROID_DIR): |
| + # (Re)create the directory so that the following steps will succeed. |
| + if not os.path.isdir(ANDROID_DIR): |
| + os.mkdir(ANDROID_DIR) |
| + |
| + # We use a manifest from the gyp project listing pinned revisions of AOSP to |
| + # use, to ensure that we test against a stable target. This needs to be |
| + # updated to pick up new build system changes sometimes, so we must test if |
| + # it has changed. |
| + manifest_filename = 'aosp_manifest.xml' |
| + gyp_manifest = os.path.join(BUILDBOT_DIR, manifest_filename) |
| + android_manifest = os.path.join(ANDROID_DIR, '.repo', 'manifests', |
| + manifest_filename) |
| + manifest_is_current = (os.path.isfile(android_manifest) and |
| + filecmp.cmp(gyp_manifest, android_manifest)) |
| + if not manifest_is_current: |
| + # It's safe to repeat these steps, so just do them again to make sure we are |
| + # in a good state. |
| + print '@@@BUILD_STEP Initialize Android checkout@@@' |
| + CallSubProcess( |
| + ['repo', 'init', |
| + '-u', 'https://android.googlesource.com/platform/manifest', |
| + '-b', 'master', |
| + '-g', 'all,-notdefault,-device,-darwin,-mips,-x86'], |
| + cwd=ANDROID_DIR) |
| + shutil.copy(gyp_manifest, android_manifest) |
| + |
| + print '@@@BUILD_STEP Sync Android@@@' |
| + CallSubProcess(['repo', 'sync', '-j4', '-m', manifest_filename], |
| + cwd=ANDROID_DIR) |
| + |
| + # If we already built the system image successfully and didn't sync to a new |
| + # version of the source, skip running the build again as it's expensive even |
| + # when there's nothing to do. |
| + system_img = os.path.join(ANDROID_DIR, 'out', 'target', 'product', 'generic', |
| + 'system.img') |
| + if manifest_is_current and os.path.isfile(system_img): |
| return |
| - print '@@@BUILD_STEP Initialize Android checkout@@@' |
| - os.mkdir(ANDROID_DIR) |
| - CallSubProcess(['git', 'config', '--global', 'user.name', 'trybot']) |
| - CallSubProcess(['git', 'config', '--global', |
| - 'user.email', 'chrome-bot@google.com']) |
| - CallSubProcess(['git', 'config', '--global', 'color.ui', 'false']) |
| - CallSubProcess( |
| - ['repo', 'init', |
| - '-u', 'https://android.googlesource.com/platform/manifest', |
| - '-b', 'android-4.2.1_r1', |
| - '-g', 'all,-notdefault,-device,-darwin,-mips,-x86'], |
| - cwd=ANDROID_DIR) |
| - |
| - print '@@@BUILD_STEP Sync Android@@@' |
| - CallSubProcess(['repo', 'sync', '-j4'], cwd=ANDROID_DIR) |
| - |
| print '@@@BUILD_STEP Build Android@@@' |
| CallSubProcess( |
| ['/bin/bash', |
| @@ -113,14 +128,28 @@ def PrepareAndroidTree(): |
| def StartAndroidEmulator(): |
| """Start an android emulator from the built android tree.""" |
| print '@@@BUILD_STEP Start Android emulator@@@' |
| - android_host_bin = '$ANDROID_HOST_OUT/bin' |
| + |
| + CallSubProcess(['/bin/bash', '-c', |
|
bradn
2014/08/22 16:13:32
Rather than going thru /bin/bash you can add the a
|
| + '%s && adb kill-server ' % _ANDROID_SETUP], |
| + cwd=ANDROID_DIR) |
| + |
| + # If taskset is available, use it to force adbd to run only on one core, as, |
| + # sadly, it improves its reliability (see crbug.com/268450). |
| + adbd_wrapper = '' |
| + with open(os.devnull, 'w') as devnull_fd: |
| + if subprocess.call(['which', 'taskset'], stdout=devnull_fd) == 0: |
| + adbd_wrapper = 'taskset -c 0' |
| + CallSubProcess(['/bin/bash', '-c', |
|
bradn
2014/08/22 16:13:32
same
|
| + '%s && %s adb start-server ' % (_ANDROID_SETUP, adbd_wrapper)], |
| + cwd=ANDROID_DIR) |
| + |
| subprocess.Popen( |
| ['/bin/bash', '-c', |
|
bradn
2014/08/22 16:13:32
same
|
| - '%s && %s/emulator -no-window' % (_ANDROID_SETUP, android_host_bin)], |
| + '%s && emulator -no-window' % _ANDROID_SETUP], |
| cwd=ANDROID_DIR) |
| CallSubProcess( |
| ['/bin/bash', '-c', |
| - '%s && %s/adb wait-for-device' % (_ANDROID_SETUP, android_host_bin)], |
| + '%s && adb wait-for-device' % _ANDROID_SETUP], |
| cwd=ANDROID_DIR) |