1import fs from 'fs-extra'; 2import path from 'path'; 3 4import { ANDROID_DIR } from '../Constants'; 5import logger from '../Logger'; 6import { androidAppVersionAsync } from '../ProjectVersions'; 7import { spawnAsync } from '../Utils'; 8import { ClientBuilder, ClientBuildFlavor, Platform, S3Client } from './types'; 9 10export default class AndroidClientBuilder implements ClientBuilder { 11 platform: Platform = 'android'; 12 13 getAppPath(): string { 14 return path.join( 15 ANDROID_DIR, 16 'app', 17 'build', 18 'outputs', 19 'apk', 20 'versioned', 21 'release', 22 'app-versioned-release.apk' 23 ); 24 } 25 26 getClientUrl(appVersion: string): string { 27 return `https://d1ahtucjixef4r.cloudfront.net/Exponent-${appVersion}.apk`; 28 } 29 30 async getAppVersionAsync(): Promise<string> { 31 return androidAppVersionAsync(); 32 } 33 34 async buildAsync(flavor: ClientBuildFlavor = ClientBuildFlavor.VERSIONED) { 35 await spawnAsync('fastlane', ['android', 'build', 'build_type:Release', `flavor:${flavor}`], { 36 stdio: 'inherit', 37 }); 38 39 if (flavor === ClientBuildFlavor.VERSIONED) { 40 logger.info('Uploading Crashlytics symbols'); 41 await spawnAsync('fastlane', ['android', 'upload_crashlytics_symbols', `flavor:${flavor}`], { 42 stdio: 'inherit', 43 }); 44 } 45 } 46 47 async uploadBuildAsync(s3Client: S3Client, appVersion: string) { 48 const file = fs.createReadStream(this.getAppPath()); 49 50 await s3Client 51 .putObject({ 52 Bucket: 'exp-android-apks', 53 Key: `Exponent-${appVersion}.apk`, 54 Body: file, 55 ACL: 'public-read', 56 }) 57 .promise(); 58 } 59} 60