Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import datetime | 6 import datetime |
| 7 import multiprocessing | 7 import multiprocessing |
| 8 import optparse | 8 import optparse |
| 9 import os | 9 import os |
| 10 import re | 10 import re |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 """ | 44 """ |
| 45 | 45 |
| 46 # as per http://crosbug.com/5855 always filter the below packages | 46 # as per http://crosbug.com/5855 always filter the below packages |
| 47 _FILTER_PACKAGES = set() | 47 _FILTER_PACKAGES = set() |
| 48 _RETRIES = 3 | 48 _RETRIES = 3 |
| 49 _GSUTIL_BIN = '/b/build/third_party/gsutil/gsutil' | 49 _GSUTIL_BIN = '/b/build/third_party/gsutil/gsutil' |
| 50 _HOST_PACKAGES_PATH = 'chroot/var/lib/portage/pkgs' | 50 _HOST_PACKAGES_PATH = 'chroot/var/lib/portage/pkgs' |
| 51 _CATEGORIES_PATH = 'chroot/etc/portage/categories' | 51 _CATEGORIES_PATH = 'chroot/etc/portage/categories' |
| 52 _HOST_TARGET = 'amd64' | 52 _HOST_TARGET = 'amd64' |
| 53 _BOARD_PATH = 'chroot/build/%(board)s' | 53 _BOARD_PATH = 'chroot/build/%(board)s' |
| 54 # board/board-target/version/packages/' | 54 # board/board-target/version/' |
| 55 _REL_BOARD_PATH = 'board/%(board)s/%(version)s/packages' | 55 _REL_BOARD_PATH = 'board/%(board)s/%(version)s' |
| 56 # host/host-target/version/packages/' | 56 # host/host-target/version/' |
| 57 _REL_HOST_PATH = 'host/%(target)s/%(version)s/packages' | 57 _REL_HOST_PATH = 'host/%(target)s/%(version)s' |
| 58 # Private overlays to look at for builds to filter | 58 # Private overlays to look at for builds to filter |
| 59 # relative to build path | 59 # relative to build path |
| 60 _PRIVATE_OVERLAY_DIR = 'src/private-overlays' | 60 _PRIVATE_OVERLAY_DIR = 'src/private-overlays' |
| 61 _GOOGLESTORAGE_ACL_FILE = 'googlestorage_acl.xml' | 61 _GOOGLESTORAGE_ACL_FILE = 'googlestorage_acl.xml' |
| 62 _BINHOST_BASE_URL = 'http://commondatastorage.googleapis.com/chromeos-prebuilt' | 62 _BINHOST_BASE_URL = 'http://commondatastorage.googleapis.com/chromeos-prebuilt' |
| 63 _PREBUILT_BASE_DIR = 'src/third_party/chromiumos-overlay/chromeos/config/' | 63 _PREBUILT_BASE_DIR = 'src/third_party/chromiumos-overlay/chromeos/config/' |
| 64 # Created in the event of new host targets becoming available | 64 # Created in the event of new host targets becoming available |
| 65 _PREBUILT_MAKE_CONF = {'amd64': os.path.join(_PREBUILT_BASE_DIR, | 65 _PREBUILT_MAKE_CONF = {'amd64': os.path.join(_PREBUILT_BASE_DIR, |
| 66 'make.conf.amd64-host')} | 66 'make.conf.amd64-host')} |
| 67 _BINHOST_CONF_DIR = 'src/third_party/chromiumos-overlay/chromeos/binhost' | 67 _BINHOST_CONF_DIR = 'src/third_party/chromiumos-overlay/chromeos/binhost' |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 508 'remote_location': remote_location.rstrip('/'), | 508 'remote_location': remote_location.rstrip('/'), |
| 509 'ssh_server': ssh_server } | 509 'ssh_server': ssh_server } |
| 510 cmds = ['ssh %(ssh_server)s mkdir -p %(remote_path)s' % d, | 510 cmds = ['ssh %(ssh_server)s mkdir -p %(remote_path)s' % d, |
| 511 'rsync -av --chmod=a+r %(pkg_index)s %(remote_packages)s' % d] | 511 'rsync -av --chmod=a+r %(pkg_index)s %(remote_packages)s' % d] |
| 512 if pkgs: | 512 if pkgs: |
| 513 cmds.append('rsync -Rav %(pkgs)s %(remote_location)s/' % d) | 513 cmds.append('rsync -Rav %(pkgs)s %(remote_location)s/' % d) |
| 514 for cmd in cmds: | 514 for cmd in cmds: |
| 515 if not _RetryRun(cmd, shell=True, cwd=package_path): | 515 if not _RetryRun(cmd, shell=True, cwd=package_path): |
| 516 raise UploadFailed('Could not run %s' % cmd) | 516 raise UploadFailed('Could not run %s' % cmd) |
| 517 | 517 |
| 518 def _UploadBoardTarball(self, board_path, url_suffix): | |
| 519 """Upload a tarball of the board at the specified path to Google Storage. | |
| 520 | |
|
scottz
2011/04/15 17:40:46
Args:
davidjames
2011/04/15 19:18:08
Done.
| |
| 521 board_path: The path to the board dir. | |
| 522 url_suffix: The remote subdirectory where we should upload the packages. | |
| 523 """ | |
| 524 remote_location = '%s/%s' % (self._upload_location.rstrip('/'), url_suffix) | |
| 525 assert remote_location.startswith('gs://') | |
| 526 cwd, boardname = os.path.split(board_path.rstrip(os.path.sep)) | |
| 527 tarfile = '/tmp/%s.tbz2' % boardname | |
|
scottz
2011/04/15 17:40:46
You should use tempfile here.
I prefer not to ass
davidjames
2011/04/15 19:18:08
Done.
Now that we switched to tempfile, it will h
| |
| 528 cmd = ['sudo', 'tar', '-I', 'pbzip2', '-cf', tarfile] | |
| 529 for path in ('usr/lib/debug', 'usr/local/autotest', 'packages', 'tmp'): | |
|
scottz
2011/04/15 17:40:46
Assigning these to a variable excluded_paths would
davidjames
2011/04/15 19:18:08
Done.
| |
| 530 cmd.append('--exclude=%s/%s/*' % (boardname, path)) | |
| 531 cmd.append(boardname) | |
| 532 cros_build_lib.RunCommand(cmd, cwd=cwd) | |
|
scottz
2011/04/15 17:40:46
this should be in your try, if tar fails we are le
davidjames
2011/04/15 19:18:08
Done.
| |
| 533 remote_tarfile = '%s/%s.tbz2' % (remote_location.rstrip('/'), boardname) | |
| 534 try: | |
| 535 if _GsUpload((tarfile, remote_tarfile, self._acl)): | |
| 536 sys.exit(1) | |
| 537 finally: | |
| 538 cros_build_lib.RunCommand(['sudo', 'rm', '-f', tarfile], cwd=cwd) | |
| 539 | |
| 518 def _SyncHostPrebuilts(self, build_path, version, key, git_sync, | 540 def _SyncHostPrebuilts(self, build_path, version, key, git_sync, |
| 519 sync_binhost_conf): | 541 sync_binhost_conf): |
| 520 """Synchronize host prebuilt files. | 542 """Synchronize host prebuilt files. |
| 521 | 543 |
| 522 This function will sync both the standard host packages, plus the host | 544 This function will sync both the standard host packages, plus the host |
| 523 packages associated with all targets that have been "setup" with the | 545 packages associated with all targets that have been "setup" with the |
| 524 current host's chroot. For instance, if this host has been used to build | 546 current host's chroot. For instance, if this host has been used to build |
| 525 x86-generic, it will sync the host packages associated with | 547 x86-generic, it will sync the host packages associated with |
| 526 'i686-pc-linux-gnu'. If this host has also been used to build arm-generic, | 548 'i686-pc-linux-gnu'. If this host has also been used to build arm-generic, |
| 527 it will also sync the host packages associated with | 549 it will also sync the host packages associated with |
| 528 'armv7a-cros-linux-gnueabi'. | 550 'armv7a-cros-linux-gnueabi'. |
| 529 | 551 |
| 530 Args: | 552 Args: |
| 531 build_path: The path to the directory containing the chroot. | 553 build_path: The path to the directory containing the chroot. |
| 532 version: A unique string, intended to be included in the upload path, | 554 version: A unique string, intended to be included in the upload path, |
| 533 which identifies the version number of the uploaded prebuilts. | 555 which identifies the version number of the uploaded prebuilts. |
| 534 key: The variable key to update in the git file. | 556 key: The variable key to update in the git file. |
| 535 git_sync: If set, update make.conf of target to reference the latest | 557 git_sync: If set, update make.conf of target to reference the latest |
| 536 prebuilt packages generated here. | 558 prebuilt packages generated here. |
| 537 sync_binhost_conf: If set, update binhost config file in | 559 sync_binhost_conf: If set, update binhost config file in |
| 538 chromiumos-overlay for the host. | 560 chromiumos-overlay for the host. |
| 539 """ | 561 """ |
| 540 # Upload prebuilts. | 562 # Upload prebuilts. |
| 541 package_path = os.path.join(build_path, _HOST_PACKAGES_PATH) | 563 package_path = os.path.join(build_path, _HOST_PACKAGES_PATH) |
| 542 url_suffix = _REL_HOST_PATH % {'version': version, 'target': _HOST_TARGET} | 564 url_suffix = _REL_HOST_PATH % {'version': version, 'target': _HOST_TARGET} |
| 543 self._UploadPrebuilt(package_path, url_suffix) | 565 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/') |
| 566 self._UploadPrebuilt(package_path, packages_url_suffix) | |
| 544 | 567 |
| 545 # Record URL where prebuilts were uploaded. | 568 # Record URL where prebuilts were uploaded. |
| 546 url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'), | 569 url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'), |
| 547 url_suffix.rstrip('/')) | 570 url_suffix.rstrip('/')) |
| 548 if git_sync: | 571 if git_sync: |
| 549 git_file = os.path.join(build_path, _PREBUILT_MAKE_CONF[_HOST_TARGET]) | 572 git_file = os.path.join(build_path, _PREBUILT_MAKE_CONF[_HOST_TARGET]) |
| 550 RevGitFile(git_file, url_value, key=key) | 573 RevGitFile(git_file, url_value, key=key) |
| 551 if sync_binhost_conf: | 574 if sync_binhost_conf: |
| 552 binhost_conf = os.path.join(build_path, _BINHOST_CONF_DIR, 'host', | 575 binhost_conf = os.path.join(build_path, _BINHOST_CONF_DIR, 'host', |
| 553 '%s-%s.conf' % (_HOST_TARGET, key)) | 576 '%s-%s.conf' % (_HOST_TARGET, key)) |
| 554 UpdateBinhostConfFile(binhost_conf, key, url_value) | 577 UpdateBinhostConfFile(binhost_conf, key, url_value) |
| 555 | 578 |
| 556 def _SyncBoardPrebuilts(self, board, build_path, version, key, git_sync, | 579 def _SyncBoardPrebuilts(self, board, build_path, version, key, git_sync, |
| 557 sync_binhost_conf): | 580 sync_binhost_conf, upload_board_tarball): |
| 558 """Synchronize board prebuilt files. | 581 """Synchronize board prebuilt files. |
| 559 | 582 |
| 560 Args: | 583 Args: |
| 561 board: The board to upload to Google Storage. | 584 board: The board to upload to Google Storage. |
| 562 build_path: The path to the directory containing the chroot. | 585 build_path: The path to the directory containing the chroot. |
| 563 version: A unique string, intended to be included in the upload path, | 586 version: A unique string, intended to be included in the upload path, |
| 564 which identifies the version number of the uploaded prebuilts. | 587 which identifies the version number of the uploaded prebuilts. |
| 565 key: The variable key to update in the git file. | 588 key: The variable key to update in the git file. |
| 566 git_sync: If set, update make.conf of target to reference the latest | 589 git_sync: If set, update make.conf of target to reference the latest |
| 567 prebuilt packages generated here. | 590 prebuilt packages generated here. |
| 568 sync_binhost_conf: If set, update binhost config file in | 591 sync_binhost_conf: If set, update binhost config file in |
| 569 chromiumos-overlay for the current board. | 592 chromiumos-overlay for the current board. |
| 593 upload_board_tarball: Include a tarball of the board in our upload. | |
| 570 """ | 594 """ |
| 571 # Upload prebuilts. | 595 # Upload prebuilts. |
| 572 board_path = os.path.join(build_path, _BOARD_PATH % {'board': board}) | 596 board_path = os.path.join(build_path, _BOARD_PATH % {'board': board}) |
| 573 package_path = os.path.join(board_path, 'packages') | 597 package_path = os.path.join(board_path, 'packages') |
| 574 url_suffix = _REL_BOARD_PATH % {'board': board, 'version': version} | 598 url_suffix = _REL_BOARD_PATH % {'board': board, 'version': version} |
| 575 self._UploadPrebuilt(package_path, url_suffix) | 599 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/') |
| 600 | |
| 601 if upload_board_tarball: | |
|
scottz
2011/04/15 17:40:46
Please add a comment about you uploading board tar
davidjames
2011/04/15 19:18:08
Done.
| |
| 602 p = multiprocessing.Process(target=self._UploadBoardTarball, | |
|
scottz
2011/04/15 17:40:46
Please consider using something other than p. tar_
davidjames
2011/04/15 19:18:08
Done.
| |
| 603 args=(board_path, url_suffix)) | |
| 604 p.start() | |
| 605 | |
| 606 self._UploadPrebuilt(package_path, packages_url_suffix) | |
| 607 | |
| 608 if upload_board_tarball: | |
| 609 p.join() | |
| 610 assert p.exitcode == 0 | |
| 576 | 611 |
| 577 # Record URL where prebuilts were uploaded. | 612 # Record URL where prebuilts were uploaded. |
| 578 url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'), | 613 url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'), |
| 579 url_suffix.rstrip('/')) | 614 url_suffix.rstrip('/')) |
| 580 if git_sync: | 615 if git_sync: |
| 581 git_file = DeterminePrebuiltConfFile(build_path, board) | 616 git_file = DeterminePrebuiltConfFile(build_path, board) |
| 582 RevGitFile(git_file, url_value, key=key) | 617 RevGitFile(git_file, url_value, key=key) |
| 583 if sync_binhost_conf: | 618 if sync_binhost_conf: |
| 584 binhost_conf = os.path.join(build_path, _BINHOST_CONF_DIR, 'target', | 619 binhost_conf = os.path.join(build_path, _BINHOST_CONF_DIR, 'target', |
| 585 '%s-%s.conf' % (board, key)) | 620 '%s-%s.conf' % (board, key)) |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 620 default=False, | 655 default=False, |
| 621 help='Turn on filtering of private ebuild packages') | 656 help='Turn on filtering of private ebuild packages') |
| 622 parser.add_option('-k', '--key', dest='key', | 657 parser.add_option('-k', '--key', dest='key', |
| 623 default='PORTAGE_BINHOST', | 658 default='PORTAGE_BINHOST', |
| 624 help='Key to update in make.conf / binhost.conf') | 659 help='Key to update in make.conf / binhost.conf') |
| 625 parser.add_option('', '--sync-binhost-conf', dest='sync_binhost_conf', | 660 parser.add_option('', '--sync-binhost-conf', dest='sync_binhost_conf', |
| 626 default=False, action='store_true', | 661 default=False, action='store_true', |
| 627 help='Update binhost.conf') | 662 help='Update binhost.conf') |
| 628 parser.add_option('-P', '--private', dest='private', action='store_true', | 663 parser.add_option('-P', '--private', dest='private', action='store_true', |
| 629 default=False, help='Mark gs:// uploads as private.') | 664 default=False, help='Mark gs:// uploads as private.') |
| 665 parser.add_option('', '--upload-board-tarball', dest='upload_board_tarball', | |
| 666 action='store_true', default=False, | |
| 667 help='Upload board tarball to Google Storage.') | |
| 630 | 668 |
| 631 options, args = parser.parse_args() | 669 options, args = parser.parse_args() |
| 632 if not options.build_path: | 670 if not options.build_path: |
| 633 usage(parser, 'Error: you need provide a chroot path') | 671 usage(parser, 'Error: you need provide a chroot path') |
| 634 if not options.upload: | 672 if not options.upload: |
| 635 usage(parser, 'Error: you need to provide an upload location using -u') | 673 usage(parser, 'Error: you need to provide an upload location using -u') |
| 636 | 674 |
| 675 | |
| 676 if options.upload_board_tarball and not options.upload.startswith('gs://'): | |
| 677 usage(parser, 'Error: --upload-board-tarball only works with gs:// URLs.\n' | |
| 678 '--upload must be a gs:// URL.') | |
| 679 | |
| 637 if options.private: | 680 if options.private: |
| 638 if options.sync_host: | 681 if options.sync_host: |
| 639 usage(parser, 'Error: --private and --sync-host/-s cannot be specified ' | 682 usage(parser, 'Error: --private and --sync-host/-s cannot be specified ' |
| 640 'together, we do not support private host prebuilts') | 683 'together, we do not support private host prebuilts') |
| 641 | 684 |
| 642 if not options.upload.startswith('gs://'): | 685 if not options.upload.startswith('gs://'): |
| 643 usage(parser, 'Error: --private is only valid for gs:// URLs.\n' | 686 usage(parser, 'Error: --private is only valid for gs:// URLs.\n' |
| 644 '--upload must be a gs:// URL.') | 687 '--upload must be a gs:// URL.') |
| 645 | 688 |
| 646 if options.binhost_base_url != _BINHOST_BASE_URL: | 689 if options.binhost_base_url != _BINHOST_BASE_URL: |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 677 uploader = PrebuiltUploader(options.upload, acl, binhost_base_url, | 720 uploader = PrebuiltUploader(options.upload, acl, binhost_base_url, |
| 678 pkg_indexes) | 721 pkg_indexes) |
| 679 | 722 |
| 680 if options.sync_host: | 723 if options.sync_host: |
| 681 uploader._SyncHostPrebuilts(options.build_path, version, options.key, | 724 uploader._SyncHostPrebuilts(options.build_path, version, options.key, |
| 682 options.git_sync, options.sync_binhost_conf) | 725 options.git_sync, options.sync_binhost_conf) |
| 683 | 726 |
| 684 if options.board: | 727 if options.board: |
| 685 uploader._SyncBoardPrebuilts(options.board, options.build_path, version, | 728 uploader._SyncBoardPrebuilts(options.board, options.build_path, version, |
| 686 options.key, options.git_sync, | 729 options.key, options.git_sync, |
| 687 options.sync_binhost_conf) | 730 options.sync_binhost_conf, |
| 731 options.upload_board_tarball) | |
| 688 | 732 |
| 689 if __name__ == '__main__': | 733 if __name__ == '__main__': |
| 690 main() | 734 main() |
| OLD | NEW |