in utils/run_android_ci.py [0:0]
def main():
args = parser.parse_args()
region = args.region
run_id = args.run_id
run_attempt = args.run_attempt
project_arn = args.project_arn
device_pool_arn = args.device_pool_arn
device_pool = args.device_pool
print("Beginning Android Device Farm Setup\n")
# Create Boto3 client for Device Farm
try:
client = boto3.client('devicefarm', region_name=region)
except Exception:
print("Error - could not make Boto3 client. Credentials likely could not be sourced")
sys.exit(-1)
print("Boto3 client established")
# Upload the build apk file to Device Farm
upload_file_name = 'CI-' + run_id + '-' + run_attempt + '-' + device_pool + '.apk'
print('Upload file name: ' + upload_file_name)
# Setup upload to Device Farm project
create_upload_response = client.create_upload(
projectArn=project_arn,
name=upload_file_name,
type='ANDROID_APP'
)
device_farm_upload_arn = create_upload_response['upload']['arn']
device_farm_upload_url = create_upload_response['upload']['url']
# Upload project apk
with open(build_file_location, 'rb') as f:
data = f.read()
r = requests.put(device_farm_upload_url, data=data)
print('File upload status code: ' + str(r.status_code) + ' reason: ' + r.reason)
device_farm_upload_status = client.get_upload(arn=device_farm_upload_arn)
while device_farm_upload_status['upload']['status'] != 'SUCCEEDED':
if device_farm_upload_status['upload']['status'] == 'FAILED':
print('Upload failed to process')
sys.exit(-1)
time.sleep(1)
device_farm_upload_status = client.get_upload(arn=device_farm_upload_arn)
# Upload the instrumentation test package to Device Farm
upload_test_file_name = 'CI-' + run_id + '-' + run_attempt + '-' + device_pool + 'tests.apk'
create_upload_response = client.create_upload(
projectArn=project_arn,
name=upload_test_file_name,
type='INSTRUMENTATION_TEST_PACKAGE'
)
device_farm_instrumentation_upload_arn = create_upload_response['upload']['arn']
device_farm_instrumentation_upload_url = create_upload_response['upload']['url']
with open(test_file_location, 'rb') as f:
data_instrumentation = f.read()
r_instrumentation = requests.put(device_farm_instrumentation_upload_url, data=data_instrumentation)
print('File upload status code: ' + str(r_instrumentation.status_code) + ' reason: ' + r_instrumentation.reason)
device_farm_upload_status = client.get_upload(arn=device_farm_instrumentation_upload_arn)
while device_farm_upload_status['upload']['status'] != 'SUCCEEDED':
if device_farm_upload_status['upload']['status'] == 'FAILED':
print('Upload failed to process')
sys.exit(-1)
time.sleep(1)
device_farm_upload_status = client.get_upload(arn=device_farm_instrumentation_upload_arn)
print('scheduling run')
schedule_run_response = client.schedule_run(
projectArn=project_arn,
appArn=device_farm_upload_arn,
devicePoolArn=device_pool_arn,
name=upload_file_name,
test={
'type': 'INSTRUMENTATION',
'testPackageArn': device_farm_instrumentation_upload_arn
},
executionConfiguration={
'jobTimeoutMinutes': 20
}
)
device_farm_run_arn = schedule_run_response['run']['arn']
run_start_time = schedule_run_response['run']['started']
run_start_date_time = run_start_time.strftime("%m/%d/%Y, %H:%M:%S")
print('run scheduled at ' + run_start_date_time)
get_run_response = client.get_run(arn=device_farm_run_arn)
while get_run_response['run']['result'] == 'PENDING':
time.sleep(10)
get_run_response = client.get_run(arn=device_farm_run_arn)
run_end_time = datetime.datetime.now()
run_end_date_time = run_end_time.strftime("%m/%d/%Y, %H:%M:%S")
print('Run ended at ' + run_end_date_time + ' with result: ' + get_run_response['run']['result'])
is_success = True
if get_run_response['run']['result'] != 'PASSED':
print('run has failed with result ' + get_run_response['run']['result'])
is_success = False
# Clean up
print('Deleting ' + upload_file_name + ' Device Farm project')
client.delete_upload(
arn=device_farm_upload_arn
)
client.delete_upload(
arn=device_farm_instrumentation_upload_arn
)
if is_success == False:
print('Exiting with fail')
sys.exit(-1)
print('Exiting with success')