Index: buildbot/prebuilt.py |
diff --git a/buildbot/prebuilt.py b/buildbot/prebuilt.py |
index cf93078d845d638e50f6ca8d3445991cc719d2cf..7c2652e63632003e08a50def726522d6d4e8c7eb 100755 |
--- a/buildbot/prebuilt.py |
+++ b/buildbot/prebuilt.py |
@@ -51,10 +51,10 @@ _HOST_PACKAGES_PATH = 'chroot/var/lib/portage/pkgs' |
_CATEGORIES_PATH = 'chroot/etc/portage/categories' |
_HOST_TARGET = 'amd64' |
_BOARD_PATH = 'chroot/build/%(board)s' |
-# board/board-target/version/packages/' |
-_REL_BOARD_PATH = 'board/%(board)s/%(version)s/packages' |
-# host/host-target/version/packages/' |
-_REL_HOST_PATH = 'host/%(target)s/%(version)s/packages' |
+# board/board-target/version/' |
+_REL_BOARD_PATH = 'board/%(board)s/%(version)s' |
+# host/host-target/version/' |
+_REL_HOST_PATH = 'host/%(target)s/%(version)s' |
# Private overlays to look at for builds to filter |
# relative to build path |
_PRIVATE_OVERLAY_DIR = 'src/private-overlays' |
@@ -515,6 +515,32 @@ class PrebuiltUploader(object): |
if not _RetryRun(cmd, shell=True, cwd=package_path): |
raise UploadFailed('Could not run %s' % cmd) |
+ def _UploadBoardTarball(self, board_path, url_suffix): |
+ """Upload a tarball of the board at the specified path to Google Storage. |
+ |
+ Args: |
+ board_path: The path to the board dir. |
+ url_suffix: The remote subdirectory where we should upload the packages. |
+ """ |
+ remote_location = '%s/%s' % (self._upload_location.rstrip('/'), url_suffix) |
+ assert remote_location.startswith('gs://') |
+ cwd, boardname = os.path.split(board_path.rstrip(os.path.sep)) |
+ tmpdir = tempfile.mkdtemp() |
+ try: |
+ tarfile = os.path.join(tmpdir, '%s.tbz2' % boardname) |
+ cmd = ['sudo', 'tar', '-I', 'pbzip2', '-cf', tarfile] |
+ excluded_paths = ('usr/lib/debug', 'usr/local/autotest', 'packages', |
+ 'tmp') |
+ for path in excluded_paths: |
+ cmd.append('--exclude=%s/%s/*' % (boardname, path)) |
+ cmd.append(boardname) |
+ cros_build_lib.RunCommand(cmd, cwd=cwd) |
+ remote_tarfile = '%s/%s.tbz2' % (remote_location.rstrip('/'), boardname) |
+ if _GsUpload((tarfile, remote_tarfile, self._acl)): |
+ sys.exit(1) |
+ finally: |
+ cros_build_lib.RunCommand(['sudo', 'rm', '-rf', tmpdir], cwd=cwd) |
+ |
def _SyncHostPrebuilts(self, build_path, version, key, git_sync, |
sync_binhost_conf): |
"""Synchronize host prebuilt files. |
@@ -540,7 +566,8 @@ class PrebuiltUploader(object): |
# Upload prebuilts. |
package_path = os.path.join(build_path, _HOST_PACKAGES_PATH) |
url_suffix = _REL_HOST_PATH % {'version': version, 'target': _HOST_TARGET} |
- self._UploadPrebuilt(package_path, url_suffix) |
+ packages_url_suffix = '%s/packages' % url_suffix.rstrip('/') |
+ self._UploadPrebuilt(package_path, packages_url_suffix) |
# Record URL where prebuilts were uploaded. |
url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'), |
@@ -554,7 +581,7 @@ class PrebuiltUploader(object): |
UpdateBinhostConfFile(binhost_conf, key, url_value) |
def _SyncBoardPrebuilts(self, board, build_path, version, key, git_sync, |
- sync_binhost_conf): |
+ sync_binhost_conf, upload_board_tarball): |
"""Synchronize board prebuilt files. |
Args: |
@@ -567,12 +594,26 @@ class PrebuiltUploader(object): |
prebuilt packages generated here. |
sync_binhost_conf: If set, update binhost config file in |
chromiumos-overlay for the current board. |
+ upload_board_tarball: Include a tarball of the board in our upload. |
""" |
- # Upload prebuilts. |
board_path = os.path.join(build_path, _BOARD_PATH % {'board': board}) |
package_path = os.path.join(board_path, 'packages') |
url_suffix = _REL_BOARD_PATH % {'board': board, 'version': version} |
- self._UploadPrebuilt(package_path, url_suffix) |
+ packages_url_suffix = '%s/packages' % url_suffix.rstrip('/') |
+ |
+ # Upload board tarballs in the background. |
+ if upload_board_tarball: |
+ tar_process = multiprocessing.Process(target=self._UploadBoardTarball, |
+ args=(board_path, url_suffix)) |
+ tar_process.start() |
+ |
+ # Upload prebuilts. |
+ self._UploadPrebuilt(package_path, packages_url_suffix) |
+ |
+ # Make sure we finished uploading the board tarballs. |
+ if upload_board_tarball: |
+ tar_process.join() |
+ assert tar_process.exitcode == 0 |
# Record URL where prebuilts were uploaded. |
url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'), |
@@ -627,6 +668,9 @@ def ParseOptions(): |
help='Update binhost.conf') |
parser.add_option('-P', '--private', dest='private', action='store_true', |
default=False, help='Mark gs:// uploads as private.') |
+ parser.add_option('', '--upload-board-tarball', dest='upload_board_tarball', |
+ action='store_true', default=False, |
+ help='Upload board tarball to Google Storage.') |
options, args = parser.parse_args() |
if not options.build_path: |
@@ -634,6 +678,11 @@ def ParseOptions(): |
if not options.upload: |
usage(parser, 'Error: you need to provide an upload location using -u') |
+ |
+ if options.upload_board_tarball and not options.upload.startswith('gs://'): |
+ usage(parser, 'Error: --upload-board-tarball only works with gs:// URLs.\n' |
+ '--upload must be a gs:// URL.') |
+ |
if options.private: |
if options.sync_host: |
usage(parser, 'Error: --private and --sync-host/-s cannot be specified ' |
@@ -684,7 +733,8 @@ def main(): |
if options.board: |
uploader._SyncBoardPrebuilts(options.board, options.build_path, version, |
options.key, options.git_sync, |
- options.sync_binhost_conf) |
+ options.sync_binhost_conf, |
+ options.upload_board_tarball) |
if __name__ == '__main__': |
main() |