| Index: catapult_base/catapult_base/update_reference_build
|
| diff --git a/catapult_base/catapult_base/update_reference_build b/catapult_base/catapult_base/update_reference_build
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..ccd7cbec9a3a8fd0bfd4bde639947924f28c8caf
|
| --- /dev/null
|
| +++ b/catapult_base/catapult_base/update_reference_build
|
| @@ -0,0 +1,182 @@
|
| +#!/usr/bin/env python
|
| +#
|
| +# Copyright 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.
|
| +
|
| +"""Updates the Chrome reference builds.
|
| +
|
| +Usage:
|
| + $ /path/to/update_reference_build.py
|
| + $ git commit -a
|
| + $ git cl upload
|
| +"""
|
| +
|
| +import collections
|
| +import logging
|
| +import os
|
| +import shutil
|
| +import subprocess
|
| +import sys
|
| +import urllib2
|
| +import zipfile
|
| +
|
| +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
| +
|
| +from catapult_base import cloud_storage
|
| +from dependency_manager import base_config
|
| +
|
| +
|
| +def BuildNotFoundError(error_string):
|
| + raise ValueError(error_string)
|
| +
|
| +
|
| +_CHROME_BINARIES_CONFIG = os.path.join(
|
| + os.path.dirname(os.path.abspath(__file__)), '..', '..', 'common',
|
| + 'py_utils', 'py_utils', 'chrome_binaries.json')
|
| +
|
| +CHROME_GS_BUCKET = 'chrome-unsigned'
|
| +
|
| +
|
| +# Remove a platform name from this list to disable updating it.
|
| +# Add one to enable updating it. (Must also update _PLATFORM_MAP.)
|
| +_PLATFORMS_TO_UPDATE = ['mac_x86_64', 'win_x86', 'win_AMD64', 'linux_x86_64',
|
| + 'android_k_armeabi-v7a', 'android_l_arm64-v8a',
|
| + 'android_l_armeabi-v7a']
|
| +
|
| +# Remove a channal name from this list to disable updating it.
|
| +# Add one to enable updating it.
|
| +_CHANNELS_TO_UPDATE = [#'canary', 'dev']#,
|
| + 'stable']
|
| +
|
| +
|
| +# Omaha is Chrome's autoupdate server. It reports the current versions used
|
| +# by each platform on each channel.
|
| +_OMAHA_PLATFORMS = { 'stable': ['mac', 'linux', 'win', 'android'],
|
| + 'dev': ['linux'], 'canary': ['mac', 'win']}
|
| +
|
| +
|
| +# All of the information we need to update each platform.
|
| +# omaha: name omaha uses for the plaftorms.
|
| +# zip_name: name of the zip file to be retrieved from cloud storage.
|
| +# gs_build: name of the Chrome build platform used in cloud storage.
|
| +# destination: Name of the folder to download the reference build to.
|
| +UpdateInfo = collections.namedtuple('UpdateInfo',
|
| + 'omaha, gs_folder, gs_build, zip_name')
|
| +_PLATFORM_MAP = { 'mac_x86_64': UpdateInfo(omaha='mac',
|
| + gs_folder='desktop-*',
|
| + gs_build='mac64',
|
| + zip_name='chrome-mac.zip'),
|
| + 'win_x86': UpdateInfo(omaha='win',
|
| + gs_folder='desktop-*',
|
| + gs_build='win-pgo',
|
| + zip_name='chrome-win-pgo.zip'),
|
| + 'win_AMD64': UpdateInfo(omaha='win',
|
| + gs_folder='desktop-*',
|
| + gs_build='win64-pgo',
|
| + zip_name='chrome-win64-pgo.zip'),
|
| + 'linux_x86_64': UpdateInfo(omaha='linux',
|
| + gs_folder='desktop-*',
|
| + gs_build='precise64',
|
| + zip_name='chrome-precise64.zip'),
|
| + 'android_k_armeabi-v7a': UpdateInfo(omaha='android',
|
| + gs_folder='android-*',
|
| + gs_build='arm',
|
| + zip_name='Chrome.apk'),
|
| + 'android_l_arm64-v8a': UpdateInfo(omaha='android',
|
| + gs_folder='android-*',
|
| + gs_build='arm_64',
|
| + zip_name='ChromeModern.apk'),
|
| + 'android_l_armeabi-v7a': UpdateInfo(omaha='android',
|
| + gs_folder='android-*',
|
| + gs_build='arm',
|
| + zip_name='Chrome.apk'),
|
| +}
|
| +
|
| +
|
| +def _ChannelVersionsMap(channel):
|
| + rows = _OmahaReportVersionInfo(channel)
|
| + omaha_versions_map = _OmahaVersionsMap(rows, channel)
|
| + channel_versions_map = {}
|
| + for platform in _PLATFORMS_TO_UPDATE:
|
| + print 'try updating platform %s' % platform
|
| + omaha_platform = _PLATFORM_MAP[platform].omaha
|
| + if omaha_platform in omaha_versions_map:
|
| + print 'updating platform %s' % platform
|
| + channel_versions_map[platform] = omaha_versions_map[omaha_platform]
|
| + return channel_versions_map
|
| +
|
| +
|
| +def _OmahaReportVersionInfo(channel):
|
| + url ='https://omahaproxy.appspot.com/all?channel=%s' % channel
|
| + lines = urllib2.urlopen(url).readlines()
|
| + return [l.split(',') for l in lines]
|
| +
|
| +
|
| +def _OmahaVersionsMap(rows, channel):
|
| + platforms = _OMAHA_PLATFORMS.get(channel, [])
|
| + if (len(rows) < 1 or
|
| + not rows[0][0:3] == ['os', 'channel', 'current_version']):
|
| + raise ValueError(
|
| + 'Omaha report is not in the expected form: %s.' % rows)
|
| + versions_map = {}
|
| + for row in rows[1:]:
|
| + if row[1] != channel:
|
| + raise ValueError(
|
| + 'Omaha report contains a line with the channel %s' % row[1])
|
| + if row[0] in platforms:
|
| + versions_map[row[0]] = row[2]
|
| + logging.warn('versions map: %s' % versions_map)
|
| + if not all(platform in versions_map for platform in platforms):
|
| + raise ValueError(
|
| + 'Omaha report did not contain all desired platforms for channel %s' % channel)
|
| + return versions_map
|
| +
|
| +
|
| +def _QueuePlatformUpdate(platform, version, config, channel):
|
| + """ platform: the name of the platform for the browser to
|
| + be downloaded & updated from cloud storage. """
|
| + platform_info = _PLATFORM_MAP[platform]
|
| + filename = platform_info.zip_name
|
| + # remote_path example: desktop-*/30.0.1595.0/precise32/chrome-precise32.zip
|
| + remote_path = '%s/%s/%s/%s' % (
|
| + platform_info.gs_folder, version, platform_info.gs_build, filename)
|
| + if not cloud_storage.Exists(CHROME_GS_BUCKET, remote_path):
|
| + raise BuildNotFoundError(
|
| + 'Failed to find %s build for version %s at path %s.' % (platform, version, remote_path))
|
| + reference_builds_folder = os.path.join(
|
| + os.path.dirname(os.path.abspath(__file__)), 'chrome_telemetry_build',
|
| + 'reference_builds', channel)
|
| + if not os.path.exists(reference_builds_folder):
|
| + os.makedirs(reference_builds_folder)
|
| + local_dest_path = os.path.join(reference_builds_folder, filename)
|
| + cloud_storage.Get(CHROME_GS_BUCKET, remote_path, local_dest_path)
|
| + config.AddCloudStorageDependencyUpdateJob(
|
| + 'chrome_%s' % channel, platform, local_dest_path, version=version,
|
| + execute_job=False)
|
| +
|
| +
|
| +def UpdateBuilds():
|
| + config = base_config.BaseConfig(_CHROME_BINARIES_CONFIG, writable=True)
|
| + for channel in _CHANNELS_TO_UPDATE:
|
| + channel_versions_map = _ChannelVersionsMap(channel)
|
| + for platform in channel_versions_map:
|
| + current_version = config.GetVersion('chrome_%s' % channel, platform)
|
| + channel_version = channel_versions_map.get(platform)
|
| + logging.warn('current: %s, channel: %s' % (current_version, channel_version))
|
| + if current_version and current_version == channel_version:
|
| + continue
|
| + _QueuePlatformUpdate(platform, channel_version, config, channel)
|
| + # TODO: move execute update jobs here, and add committing/uploading the cl.
|
| + config.ExecuteUpdateJobs(force=True)
|
| +
|
| +
|
| +def main():
|
| + logging.getLogger().setLevel(logging.DEBUG)
|
| + #TODO(aiolos): alert sheriffs via email when an error is seen.
|
| + #This should be added when alerts are added when updating the build.
|
| + UpdateBuilds()
|
| + # TODO(aiolos): Add --commit flag. crbug.com/547229
|
| +
|
| +if __name__ == '__main__':
|
| + main()
|
|
|