diff --git a/packages/eas-cli/src/build/runBuildAndSubmit.ts b/packages/eas-cli/src/build/runBuildAndSubmit.ts index fc3d3cf8db..6b1e4d3f94 100644 --- a/packages/eas-cli/src/build/runBuildAndSubmit.ts +++ b/packages/eas-cli/src/build/runBuildAndSubmit.ts @@ -11,6 +11,7 @@ import { import { LoggerLevel } from '@expo/logger'; import assert from 'assert'; import chalk from 'chalk'; +import { pathExists } from 'fs-extra'; import nullthrows from 'nullthrows'; import { prepareAndroidBuildAsync } from './android/build'; @@ -62,7 +63,7 @@ import { validateBuildProfileVersionSettingsAsync, } from '../project/remoteVersionSource'; import { confirmAsync } from '../prompts'; -import { runAsync } from '../run/run'; +import { getEasBuildRunCachedAppPath, runAsync } from '../run/run'; import { isRunnableOnSimulatorOrEmulator } from '../run/utils'; import { createSubmissionContextAsync } from '../submit/context'; import { @@ -545,11 +546,21 @@ function exitWithNonZeroCodeIfSomeBuildsFailed(maybeBuilds: (BuildFragment | nul } } -async function downloadAndRunAsync(build: BuildFragment): Promise { +export async function downloadAndRunAsync(build: BuildFragment): Promise { assert(build.artifacts?.applicationArchiveUrl); + const cachedAppPath = getEasBuildRunCachedAppPath(build.project.id, build.id, build.platform); + + if (await pathExists(cachedAppPath)) { + Log.newLine(); + Log.log(`Using cached app...`); + await runAsync(cachedAppPath, build.platform); + return; + } + const buildPath = await downloadAndMaybeExtractAppAsync( build.artifacts.applicationArchiveUrl, - build.platform + build.platform, + cachedAppPath ); await runAsync(buildPath, build.platform); } diff --git a/packages/eas-cli/src/commands/build/dev.ts b/packages/eas-cli/src/commands/build/dev.ts index b6a968b740..e848818e93 100644 --- a/packages/eas-cli/src/commands/build/dev.ts +++ b/packages/eas-cli/src/commands/build/dev.ts @@ -8,7 +8,7 @@ import { ensureProjectConfiguredAsync, } from '../../build/configure'; import { evaluateConfigWithEnvVarsAsync } from '../../build/evaluateConfigWithEnvVarsAsync'; -import { runBuildAndSubmitAsync } from '../../build/runBuildAndSubmit'; +import { downloadAndRunAsync, runBuildAndSubmitAsync } from '../../build/runBuildAndSubmit'; import { ensureRepoIsCleanAsync } from '../../build/utils/repository'; import EasCommand from '../../commandUtils/EasCommand'; import { BuildStatus, DistributionType } from '../../graphql/generated'; @@ -18,8 +18,6 @@ import Log from '../../log'; import { RequestedPlatform } from '../../platform'; import { resolveWorkflowAsync } from '../../project/workflow'; import { confirmAsync, promptAsync } from '../../prompts'; -import { runAsync } from '../../run/run'; -import { downloadAndMaybeExtractAppAsync } from '../../utils/download'; import { createFingerprintAsync } from '../../utils/fingerprintCli'; import { ProfileData, getProfilesAsync } from '../../utils/profiles'; import { Client } from '../../vcs/vcs'; @@ -129,11 +127,7 @@ export default class BuildDev extends EasCommand { ); if (build.artifacts?.applicationArchiveUrl) { - const buildPath = await downloadAndMaybeExtractAppAsync( - build.artifacts.applicationArchiveUrl, - build.platform - ); - await runAsync(buildPath, build.platform); + await downloadAndRunAsync(build); return; } else { Log.warn('Artifacts for this build expired. New build will be started.'); diff --git a/packages/eas-cli/src/commands/build/run.ts b/packages/eas-cli/src/commands/build/run.ts index 7fa4493815..8050cf67d6 100644 --- a/packages/eas-cli/src/commands/build/run.ts +++ b/packages/eas-cli/src/commands/build/run.ts @@ -1,7 +1,6 @@ import { Errors, Flags } from '@oclif/core'; import assert from 'assert'; import { pathExists } from 'fs-extra'; -import path from 'path'; import { getLatestBuildAsync, listAndSelectBuildOnAppAsync } from '../../build/queries'; import EasCommand from '../../commandUtils/EasCommand'; @@ -17,13 +16,12 @@ import Log from '../../log'; import { appPlatformDisplayNames } from '../../platform'; import { getDisplayNameForProjectIdAsync } from '../../project/projectUtils'; import { promptAsync } from '../../prompts'; -import { RunArchiveFlags, runAsync } from '../../run/run'; +import { RunArchiveFlags, getEasBuildRunCachedAppPath, runAsync } from '../../run/run'; import { isRunnableOnSimulatorOrEmulator } from '../../run/utils'; import { downloadAndMaybeExtractAppAsync, extractAppFromLocalArchiveAsync, } from '../../utils/download'; -import { getEasBuildRunCacheDirectoryPath } from '../../utils/paths'; interface RawRunFlags { latest?: boolean; @@ -245,17 +243,6 @@ async function maybeGetBuildAsync( } } -function getEasBuildRunCachedAppPath( - projectId: string, - buildId: string, - platform: AppPlatform -): string { - return path.join( - getEasBuildRunCacheDirectoryPath(), - `${projectId}_${buildId}.${platform === AppPlatform.Ios ? 'app' : 'apk'}` - ); -} - async function getPathToSimulatorBuildAppAsync( graphqlClient: ExpoGraphqlClient, projectId: string, diff --git a/packages/eas-cli/src/run/run.ts b/packages/eas-cli/src/run/run.ts index 938df9548c..cbb9276df5 100644 --- a/packages/eas-cli/src/run/run.ts +++ b/packages/eas-cli/src/run/run.ts @@ -1,6 +1,9 @@ +import path from 'path'; + import { runAppOnAndroidEmulatorAsync } from './android/run'; import { runAppOnIosSimulatorAsync } from './ios/run'; import { AppPlatform } from '../graphql/generated'; +import { getEasBuildRunCacheDirectoryPath } from '../utils/paths'; export interface RunArchiveFlags { latest?: boolean; @@ -19,3 +22,14 @@ export async function runAsync( await runAppOnAndroidEmulatorAsync(simulatorBuildPath); } } + +export function getEasBuildRunCachedAppPath( + projectId: string, + buildId: string, + platform: AppPlatform +): string { + return path.join( + getEasBuildRunCacheDirectoryPath(), + `${projectId}_${buildId}.${platform === AppPlatform.Ios ? 'app' : 'apk'}` + ); +}