| #!/usr/bin/env vpython3 | |
| # Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | |
| # | |
| # Use of this source code is governed by a BSD-style license | |
| # that can be found in the LICENSE file in the root of the source | |
| # tree. An additional intellectual property rights grant can be found | |
| # in the file PATENTS. All contributing project authors may | |
| # be found in the AUTHORS file in the root of the source tree. | |
| """Script for building and testing WebRTC AAR.""" | |
| import argparse | |
| import logging | |
| import os | |
| import re | |
| import shutil | |
| import subprocess | |
| import sys | |
| import tempfile | |
| SCRIPT_DIR = os.path.dirname(os.path.realpath(sys.argv[0])) | |
| CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir)) | |
| sys.path.append(os.path.join(CHECKOUT_ROOT, 'tools_webrtc')) | |
| from android.build_aar import BuildAar | |
| ARCHS = ['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'] | |
| ARTIFACT_ID = 'google-webrtc' | |
| COMMIT_POSITION_REGEX = r'^Cr-Commit-Position: refs/heads/master@{#(\d+)}$' | |
| GRADLEW_BIN = os.path.join(CHECKOUT_ROOT, | |
| 'examples/androidtests/third_party/gradle/gradlew') | |
| ADB_BIN = os.path.join(CHECKOUT_ROOT, | |
| 'third_party/android_sdk/public/platform-tools/adb') | |
| AAR_PROJECT_DIR = os.path.join(CHECKOUT_ROOT, 'examples/aarproject') | |
| def _parse_args(): | |
| parser = argparse.ArgumentParser(description='Releases WebRTC on Bintray.') | |
| parser.add_argument('--use-remoteexec', | |
| action='store_true', | |
| default=False, | |
| help='Use RBE.') | |
| parser.add_argument('--skip-tests', | |
| action='store_true', | |
| default=False, | |
| help='Skips running the tests.') | |
| parser.add_argument( | |
| '--build-dir', | |
| default=None, | |
| help='Temporary directory to store the build files. If not specified, ' | |
| 'a new directory will be created.') | |
| parser.add_argument('--verbose', | |
| action='store_true', | |
| default=False, | |
| help='Debug logging.') | |
| return parser.parse_args() | |
| def _get_commit_hash(): | |
| commit_hash = subprocess.check_output( | |
| ['git', 'rev-parse', 'HEAD'], | |
| cwd=CHECKOUT_ROOT).decode('UTF-8').strip() | |
| return commit_hash | |
| def _get_commit_pos(): | |
| commit_message = subprocess.check_output( | |
| ['git', 'rev-list', '--format=%B', '--max-count=1', 'HEAD'], | |
| cwd=CHECKOUT_ROOT).decode('UTF-8') | |
| commit_pos_match = re.search(COMMIT_POSITION_REGEX, commit_message, | |
| re.MULTILINE) | |
| if not commit_pos_match: | |
| raise Exception('Commit position not found in the commit message: %s' % | |
| commit_message) | |
| return commit_pos_match.group(1) | |
| def _test_aar(build_dir): | |
| """Runs AppRTCMobile tests using AAR. Returns true if the tests pass.""" | |
| logging.info('Testing library.') | |
| # Uninstall any existing version of AppRTCMobile. | |
| logging.info('Uninstalling previous AppRTCMobile versions. It is okay for ' | |
| 'these commands to fail if AppRTCMobile is not installed.') | |
| subprocess.call([ADB_BIN, 'uninstall', 'org.appspot.apprtc']) | |
| subprocess.call([ADB_BIN, 'uninstall', 'org.appspot.apprtc.test']) | |
| # Run tests. | |
| try: | |
| # First clean the project. | |
| subprocess.check_call([GRADLEW_BIN, 'clean'], cwd=AAR_PROJECT_DIR) | |
| # Then run the tests. | |
| subprocess.check_call([ | |
| GRADLEW_BIN, 'connectedDebugAndroidTest', | |
| '-PaarDir=' + os.path.abspath(build_dir) | |
| ], | |
| cwd=AAR_PROJECT_DIR) | |
| except subprocess.CalledProcessError: | |
| logging.exception('Test failure.') | |
| return False # Clean or tests failed | |
| return True # Tests pass | |
| def build_and_test_aar(use_remoteexec, skip_tests, build_dir): | |
| version = '1.0.' + _get_commit_pos() | |
| commit = _get_commit_hash() | |
| logging.info('Building and Testing AAR version %s with hash %s', version, | |
| commit) | |
| # If build directory is not specified, create a temporary directory. | |
| use_tmp_dir = not build_dir | |
| if use_tmp_dir: | |
| build_dir = tempfile.mkdtemp() | |
| try: | |
| base_name = ARTIFACT_ID + '-' + version | |
| aar_file = os.path.join(build_dir, base_name + '.aar') | |
| logging.info('Building at %s', build_dir) | |
| BuildAar(ARCHS, | |
| aar_file, | |
| use_remoteexec=use_remoteexec, | |
| ext_build_dir=os.path.join(build_dir, 'aar-build')) | |
| tests_pass = skip_tests or _test_aar(build_dir) | |
| if not tests_pass: | |
| raise Exception('Test failure.') | |
| logging.info('Test success.') | |
| finally: | |
| if use_tmp_dir: | |
| shutil.rmtree(build_dir, True) | |
| def main(): | |
| args = _parse_args() | |
| logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO) | |
| build_and_test_aar(args.use_remoteexec, args.skip_tests, args.build_dir) | |
| if __name__ == '__main__': | |
| sys.exit(main()) |