@expo/build-tools 1.0.244 → 1.0.246
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builders/android.js +6 -0
- package/dist/builders/android.js.map +1 -1
- package/dist/builders/ios.js +6 -0
- package/dist/builders/ios.js.map +1 -1
- package/dist/common/projectSources.js +15 -12
- package/dist/common/projectSources.js.map +1 -1
- package/dist/steps/functions/restoreBuildCache.d.ts +4 -0
- package/dist/steps/functions/restoreBuildCache.js +35 -4
- package/dist/steps/functions/restoreBuildCache.js.map +1 -1
- package/dist/steps/functions/restoreCache.d.ts +10 -0
- package/dist/steps/functions/restoreCache.js +45 -0
- package/dist/steps/functions/restoreCache.js.map +1 -1
- package/dist/steps/functions/saveBuildCache.js +0 -6
- package/dist/steps/functions/saveBuildCache.js.map +1 -1
- package/dist/steps/functions/saveCache.d.ts +11 -0
- package/dist/steps/functions/saveCache.js +66 -11
- package/dist/steps/functions/saveCache.js.map +1 -1
- package/dist/utils/cacheKey.d.ts +1 -4
- package/dist/utils/cacheKey.js +15 -9
- package/dist/utils/cacheKey.js.map +1 -1
- package/package.json +6 -5
package/dist/builders/android.js
CHANGED
|
@@ -164,5 +164,11 @@ async function buildAsync(ctx) {
|
|
|
164
164
|
secrets: ctx.job.secrets,
|
|
165
165
|
});
|
|
166
166
|
});
|
|
167
|
+
await ctx.runBuildPhase(eas_build_job_1.BuildPhase.CACHE_STATS, async () => {
|
|
168
|
+
await (0, restoreBuildCache_1.cacheStatsAsync)({
|
|
169
|
+
logger: ctx.logger,
|
|
170
|
+
env: ctx.env,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
167
173
|
}
|
|
168
174
|
//# sourceMappingURL=android.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android.js","sourceRoot":"","sources":["../../src/builders/android.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { Android, BuildMode, BuildPhase, Workflow } from '@expo/eas-build-job';\nimport nullthrows from 'nullthrows';\n\nimport { Artifacts, BuildContext, SkipNativeBuildError } from '../context';\nimport {\n configureExpoUpdatesIfInstalledAsync,\n resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync,\n} from '../utils/expoUpdates';\nimport {\n runGradleCommand,\n ensureLFLineEndingsInGradlewScript,\n resolveGradleCommand,\n} from '../android/gradle';\nimport { uploadApplicationArchive } from '../utils/artifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { restoreCredentials } from '../android/credentials';\nimport { configureBuildGradle } from '../android/gradleConfig';\nimport { setupAsync } from '../common/setup';\nimport { prebuildAsync } from '../common/prebuild';\nimport { prepareExecutableAsync } from '../utils/prepareBuildExecutable';\nimport { eagerBundleAsync, shouldUseEagerBundle } from '../common/eagerBundle';\nimport { restoreCcacheAsync } from '../steps/functions/restoreBuildCache';\nimport { saveCcacheAsync } from '../steps/functions/saveBuildCache';\n\nimport { runBuilderWithHooksAsync } from './common';\nimport { runCustomBuildAsync } from './custom';\n\nexport default async function androidBuilder(ctx: BuildContext<Android.Job>): Promise<Artifacts> {\n if (ctx.job.mode === BuildMode.BUILD) {\n await prepareExecutableAsync(ctx);\n return await runBuilderWithHooksAsync(ctx, buildAsync);\n } else if (ctx.job.mode === BuildMode.RESIGN) {\n throw new Error('Not implemented');\n } else if (ctx.job.mode === BuildMode.CUSTOM || ctx.job.mode === BuildMode.REPACK) {\n return await runCustomBuildAsync(ctx);\n } else {\n throw new Error('Not implemented');\n }\n}\n\nasync function buildAsync(ctx: BuildContext<Android.Job>): Promise<void> {\n await setupAsync(ctx);\n const evictUsedBefore = new Date();\n const workingDirectory = ctx.getReactNativeProjectDirectory();\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n\n if (hasNativeCode) {\n await ctx.runBuildPhase(BuildPhase.FIX_GRADLEW, async () => {\n await ensureLFLineEndingsInGradlewScript(ctx);\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.PREBUILD, async () => {\n if (hasNativeCode) {\n ctx.markBuildPhaseSkipped();\n ctx.logger.info(\n 'Skipped running \"expo prebuild\" because the \"android\" directory already exists. Learn more about the build process: https://docs.expo.dev/build-reference/android-builds/'\n );\n return;\n }\n await prebuildAsync(ctx, {\n logger: ctx.logger,\n workingDir: ctx.getReactNativeProjectDirectory(),\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support restoring cache');\n return;\n }\n await ctx.cacheManager?.restoreCache(ctx);\n await restoreCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n const resolvedExpoUpdatesRuntimeVersion = await ctx.runBuildPhase(\n BuildPhase.CALCULATE_EXPO_UPDATES_RUNTIME_VERSION,\n async () => {\n return await resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync({\n cwd: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n appConfig: ctx.appConfig,\n platform: ctx.job.platform,\n workflow: ctx.job.type,\n env: ctx.env,\n });\n }\n );\n\n if (\n nullthrows(ctx.job.secrets, 'Secrets must be defined for non-custom builds').buildCredentials\n ) {\n await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n await restoreCredentials(ctx);\n await configureBuildGradle(ctx);\n });\n }\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx, {\n resolvedRuntimeVersion: resolvedExpoUpdatesRuntimeVersion?.runtimeVersion ?? null,\n resolvedFingerprintSources: resolvedExpoUpdatesRuntimeVersion?.fingerprintSources ?? null,\n });\n });\n\n if (ctx.skipNativeBuild) {\n throw new SkipNativeBuildError('Skipping Gradle build');\n }\n\n if (!ctx.env.EAS_BUILD_DISABLE_BUNDLE_JAVASCRIPT_STEP && shouldUseEagerBundle(ctx.metadata)) {\n await ctx.runBuildPhase(BuildPhase.EAGER_BUNDLE, async () => {\n await eagerBundleAsync({\n platform: ctx.job.platform,\n workingDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n env: {\n ...ctx.env,\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE:\n resolvedExpoUpdatesRuntimeVersion?.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n }\n : null),\n },\n packageManager: ctx.packageManager,\n });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.RUN_GRADLEW, async () => {\n const gradleCommand = resolveGradleCommand(ctx.job);\n await runGradleCommand(ctx, {\n logger: ctx.logger,\n gradleCommand,\n androidDir: path.join(ctx.getReactNativeProjectDirectory(), 'android'),\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n extraEnv: {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE: resolvedExpoUpdatesRuntimeVersion.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n },\n }\n : null),\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.UPLOAD_APPLICATION_ARCHIVE, async () => {\n await uploadApplicationArchive(ctx, {\n patternOrPath: ctx.job.applicationArchivePath ?? 'android/app/build/outputs/**/*.{apk,aab}',\n rootDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support saving cache.');\n return;\n }\n await ctx.cacheManager?.saveCache(ctx);\n await saveCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n evictUsedBefore,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"android.js","sourceRoot":"","sources":["../../src/builders/android.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { Android, BuildMode, BuildPhase, Workflow } from '@expo/eas-build-job';\nimport nullthrows from 'nullthrows';\n\nimport { Artifacts, BuildContext, SkipNativeBuildError } from '../context';\nimport {\n configureExpoUpdatesIfInstalledAsync,\n resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync,\n} from '../utils/expoUpdates';\nimport {\n runGradleCommand,\n ensureLFLineEndingsInGradlewScript,\n resolveGradleCommand,\n} from '../android/gradle';\nimport { uploadApplicationArchive } from '../utils/artifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { restoreCredentials } from '../android/credentials';\nimport { configureBuildGradle } from '../android/gradleConfig';\nimport { setupAsync } from '../common/setup';\nimport { prebuildAsync } from '../common/prebuild';\nimport { prepareExecutableAsync } from '../utils/prepareBuildExecutable';\nimport { eagerBundleAsync, shouldUseEagerBundle } from '../common/eagerBundle';\nimport { cacheStatsAsync, restoreCcacheAsync } from '../steps/functions/restoreBuildCache';\nimport { saveCcacheAsync } from '../steps/functions/saveBuildCache';\n\nimport { runBuilderWithHooksAsync } from './common';\nimport { runCustomBuildAsync } from './custom';\n\nexport default async function androidBuilder(ctx: BuildContext<Android.Job>): Promise<Artifacts> {\n if (ctx.job.mode === BuildMode.BUILD) {\n await prepareExecutableAsync(ctx);\n return await runBuilderWithHooksAsync(ctx, buildAsync);\n } else if (ctx.job.mode === BuildMode.RESIGN) {\n throw new Error('Not implemented');\n } else if (ctx.job.mode === BuildMode.CUSTOM || ctx.job.mode === BuildMode.REPACK) {\n return await runCustomBuildAsync(ctx);\n } else {\n throw new Error('Not implemented');\n }\n}\n\nasync function buildAsync(ctx: BuildContext<Android.Job>): Promise<void> {\n await setupAsync(ctx);\n const evictUsedBefore = new Date();\n const workingDirectory = ctx.getReactNativeProjectDirectory();\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n\n if (hasNativeCode) {\n await ctx.runBuildPhase(BuildPhase.FIX_GRADLEW, async () => {\n await ensureLFLineEndingsInGradlewScript(ctx);\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.PREBUILD, async () => {\n if (hasNativeCode) {\n ctx.markBuildPhaseSkipped();\n ctx.logger.info(\n 'Skipped running \"expo prebuild\" because the \"android\" directory already exists. Learn more about the build process: https://docs.expo.dev/build-reference/android-builds/'\n );\n return;\n }\n await prebuildAsync(ctx, {\n logger: ctx.logger,\n workingDir: ctx.getReactNativeProjectDirectory(),\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support restoring cache');\n return;\n }\n await ctx.cacheManager?.restoreCache(ctx);\n await restoreCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n const resolvedExpoUpdatesRuntimeVersion = await ctx.runBuildPhase(\n BuildPhase.CALCULATE_EXPO_UPDATES_RUNTIME_VERSION,\n async () => {\n return await resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync({\n cwd: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n appConfig: ctx.appConfig,\n platform: ctx.job.platform,\n workflow: ctx.job.type,\n env: ctx.env,\n });\n }\n );\n\n if (\n nullthrows(ctx.job.secrets, 'Secrets must be defined for non-custom builds').buildCredentials\n ) {\n await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n await restoreCredentials(ctx);\n await configureBuildGradle(ctx);\n });\n }\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx, {\n resolvedRuntimeVersion: resolvedExpoUpdatesRuntimeVersion?.runtimeVersion ?? null,\n resolvedFingerprintSources: resolvedExpoUpdatesRuntimeVersion?.fingerprintSources ?? null,\n });\n });\n\n if (ctx.skipNativeBuild) {\n throw new SkipNativeBuildError('Skipping Gradle build');\n }\n\n if (!ctx.env.EAS_BUILD_DISABLE_BUNDLE_JAVASCRIPT_STEP && shouldUseEagerBundle(ctx.metadata)) {\n await ctx.runBuildPhase(BuildPhase.EAGER_BUNDLE, async () => {\n await eagerBundleAsync({\n platform: ctx.job.platform,\n workingDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n env: {\n ...ctx.env,\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE:\n resolvedExpoUpdatesRuntimeVersion?.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n }\n : null),\n },\n packageManager: ctx.packageManager,\n });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.RUN_GRADLEW, async () => {\n const gradleCommand = resolveGradleCommand(ctx.job);\n await runGradleCommand(ctx, {\n logger: ctx.logger,\n gradleCommand,\n androidDir: path.join(ctx.getReactNativeProjectDirectory(), 'android'),\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n extraEnv: {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE: resolvedExpoUpdatesRuntimeVersion.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n },\n }\n : null),\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.UPLOAD_APPLICATION_ARCHIVE, async () => {\n await uploadApplicationArchive(ctx, {\n patternOrPath: ctx.job.applicationArchivePath ?? 'android/app/build/outputs/**/*.{apk,aab}',\n rootDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support saving cache.');\n return;\n }\n await ctx.cacheManager?.saveCache(ctx);\n await saveCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n evictUsedBefore,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.CACHE_STATS, async () => {\n await cacheStatsAsync({\n logger: ctx.logger,\n env: ctx.env,\n });\n });\n}\n"]}
|
package/dist/builders/ios.js
CHANGED
|
@@ -184,6 +184,12 @@ async function buildAsync(ctx) {
|
|
|
184
184
|
secrets: ctx.job.secrets,
|
|
185
185
|
});
|
|
186
186
|
});
|
|
187
|
+
await ctx.runBuildPhase(eas_build_job_1.BuildPhase.CACHE_STATS, async () => {
|
|
188
|
+
await (0, restoreBuildCache_1.cacheStatsAsync)({
|
|
189
|
+
logger: ctx.logger,
|
|
190
|
+
env: ctx.env,
|
|
191
|
+
});
|
|
192
|
+
});
|
|
187
193
|
}
|
|
188
194
|
async function readEntitlementsAsync(ctx, { scheme, buildConfiguration }) {
|
|
189
195
|
try {
|
package/dist/builders/ios.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/builders/ios.ts"],"names":[],"mappings":"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","sourcesContent":["import plist from '@expo/plist';\nimport { IOSConfig } from '@expo/config-plugins';\nimport { ManagedArtifactType, BuildMode, BuildPhase, Ios, Workflow } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\nimport nullthrows from 'nullthrows';\n\nimport { Artifacts, BuildContext } from '../context';\nimport {\n resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync,\n configureExpoUpdatesIfInstalledAsync,\n} from '../utils/expoUpdates';\nimport { uploadApplicationArchive } from '../utils/artifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { configureXcodeProject } from '../ios/configure';\nimport CredentialsManager from '../ios/credentials/manager';\nimport { runFastlaneGym, runFastlaneResign } from '../ios/fastlane';\nimport { installPods } from '../ios/pod';\nimport { downloadApplicationArchiveAsync } from '../ios/resign';\nimport { resolveArtifactPath, resolveBuildConfiguration, resolveScheme } from '../ios/resolve';\nimport { setupAsync } from '../common/setup';\nimport { prebuildAsync } from '../common/prebuild';\nimport { prepareExecutableAsync } from '../utils/prepareBuildExecutable';\nimport { getParentAndDescendantProcessPidsAsync } from '../utils/processes';\nimport { eagerBundleAsync, shouldUseEagerBundle } from '../common/eagerBundle';\nimport { saveCcacheAsync } from '../steps/functions/saveBuildCache';\nimport { restoreCcacheAsync } from '../steps/functions/restoreBuildCache';\n\nimport { runBuilderWithHooksAsync } from './common';\nimport { runCustomBuildAsync } from './custom';\n\nconst INSTALL_PODS_WARN_TIMEOUT_MS = 15 * 60 * 1000; // 15 minutes\nconst INSTALL_PODS_KILL_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nclass InstallPodsTimeoutError extends Error {}\n\nexport default async function iosBuilder(ctx: BuildContext<Ios.Job>): Promise<Artifacts> {\n if (ctx.job.mode === BuildMode.BUILD) {\n await prepareExecutableAsync(ctx);\n return await runBuilderWithHooksAsync(ctx, buildAsync);\n } else if (ctx.job.mode === BuildMode.RESIGN) {\n return await resignAsync(ctx);\n } else if (ctx.job.mode === BuildMode.CUSTOM || ctx.job.mode === BuildMode.REPACK) {\n return await runCustomBuildAsync(ctx);\n } else {\n throw new Error('Not implemented');\n }\n}\n\nasync function buildAsync(ctx: BuildContext<Ios.Job>): Promise<void> {\n await setupAsync(ctx);\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n const evictUsedBefore = new Date();\n const credentialsManager = new CredentialsManager(ctx);\n const workingDirectory = ctx.getReactNativeProjectDirectory();\n try {\n const credentials = await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n return await credentialsManager.prepare();\n });\n\n await ctx.runBuildPhase(BuildPhase.PREBUILD, async () => {\n if (hasNativeCode) {\n ctx.markBuildPhaseSkipped();\n ctx.logger.info(\n 'Skipped running \"expo prebuild\" because the \"ios\" directory already exists. Learn more about the build process: https://docs.expo.dev/build-reference/ios-builds/'\n );\n return;\n }\n const extraEnvs: Record<string, string> = credentials?.teamId\n ? { APPLE_TEAM_ID: credentials.teamId }\n : {};\n await prebuildAsync(ctx, {\n logger: ctx.logger,\n workingDir: ctx.getReactNativeProjectDirectory(),\n options: { extraEnvs },\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support restoring cache');\n return;\n }\n await ctx.cacheManager?.restoreCache(ctx);\n await restoreCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_PODS, async () => {\n await runInstallPodsAsync(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n const resolvedExpoUpdatesRuntimeVersion = await ctx.runBuildPhase(\n BuildPhase.CALCULATE_EXPO_UPDATES_RUNTIME_VERSION,\n async () => {\n return await resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync({\n cwd: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n appConfig: ctx.appConfig,\n platform: ctx.job.platform,\n workflow: ctx.job.type,\n env: ctx.env,\n });\n }\n );\n\n const buildConfiguration = resolveBuildConfiguration(ctx);\n if (credentials) {\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_XCODE_PROJECT, async () => {\n await configureXcodeProject(ctx, { credentials, buildConfiguration });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx, {\n resolvedRuntimeVersion: resolvedExpoUpdatesRuntimeVersion?.runtimeVersion ?? null,\n resolvedFingerprintSources: resolvedExpoUpdatesRuntimeVersion?.fingerprintSources ?? null,\n });\n });\n\n if (!ctx.env.EAS_BUILD_DISABLE_BUNDLE_JAVASCRIPT_STEP && shouldUseEagerBundle(ctx.metadata)) {\n await ctx.runBuildPhase(BuildPhase.EAGER_BUNDLE, async () => {\n await eagerBundleAsync({\n platform: ctx.job.platform,\n workingDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n env: {\n ...ctx.env,\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE:\n resolvedExpoUpdatesRuntimeVersion?.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n }\n : null),\n },\n packageManager: ctx.packageManager,\n });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.RUN_FASTLANE, async () => {\n const scheme = resolveScheme(ctx);\n const entitlements = await readEntitlementsAsync(ctx, { scheme, buildConfiguration });\n await runFastlaneGym(ctx, {\n credentials,\n scheme,\n buildConfiguration,\n entitlements,\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n extraEnv: {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE:\n resolvedExpoUpdatesRuntimeVersion?.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n },\n }\n : null),\n });\n });\n } finally {\n await ctx.runBuildPhase(BuildPhase.CLEAN_UP_CREDENTIALS, async () => {\n await credentialsManager.cleanUp();\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.UPLOAD_APPLICATION_ARCHIVE, async () => {\n await uploadApplicationArchive(ctx, {\n patternOrPath: resolveArtifactPath(ctx),\n rootDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support saving cache.');\n return;\n }\n await ctx.cacheManager?.saveCache(ctx);\n await saveCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n evictUsedBefore,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n}\n\nasync function readEntitlementsAsync(\n ctx: BuildContext<Ios.Job>,\n { scheme, buildConfiguration }: { scheme: string; buildConfiguration: string }\n): Promise<object | null> {\n try {\n const applicationTargetName =\n await IOSConfig.BuildScheme.getApplicationTargetNameForSchemeAsync(\n ctx.getReactNativeProjectDirectory(),\n scheme\n );\n const entitlementsPath = IOSConfig.Entitlements.getEntitlementsPath(\n ctx.getReactNativeProjectDirectory(),\n {\n buildConfiguration,\n targetName: applicationTargetName,\n }\n );\n if (!entitlementsPath) {\n return null;\n }\n const entitlementsRaw = await fs.readFile(entitlementsPath, 'utf8');\n return plist.parse(entitlementsRaw);\n } catch (err) {\n ctx.logger.warn({ err }, 'Failed to read entitlements');\n ctx.markBuildPhaseHasWarnings();\n return null;\n }\n}\n\nasync function resignAsync(ctx: BuildContext<Ios.Job>): Promise<Artifacts> {\n const applicationArchivePath = await ctx.runBuildPhase(\n BuildPhase.DOWNLOAD_APPLICATION_ARCHIVE,\n async () => {\n return await downloadApplicationArchiveAsync(ctx);\n }\n );\n\n const credentialsManager = new CredentialsManager(ctx);\n try {\n const credentials = await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n return await credentialsManager.prepare();\n });\n\n await ctx.runBuildPhase(BuildPhase.RUN_FASTLANE, async () => {\n await runFastlaneResign(ctx, {\n credentials: nullthrows(credentials),\n ipaPath: applicationArchivePath,\n });\n });\n } finally {\n await ctx.runBuildPhase(BuildPhase.CLEAN_UP_CREDENTIALS, async () => {\n await credentialsManager.cleanUp();\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.UPLOAD_APPLICATION_ARCHIVE, async () => {\n ctx.logger.info(`Application archive: ${applicationArchivePath}`);\n await ctx.uploadArtifact({\n artifact: {\n type: ManagedArtifactType.APPLICATION_ARCHIVE,\n paths: [applicationArchivePath],\n },\n logger: ctx.logger,\n });\n });\n\n return ctx.artifacts;\n}\n\nasync function runInstallPodsAsync(ctx: BuildContext<Ios.Job>): Promise<void> {\n let warnTimeout: NodeJS.Timeout | undefined;\n let killTimeout: NodeJS.Timeout | undefined;\n let timedOutToKill: boolean = false;\n try {\n const installPodsSpawnPromise = (\n await installPods(ctx, {\n infoCallbackFn: () => {\n warnTimeout?.refresh();\n killTimeout?.refresh();\n },\n })\n ).spawnPromise;\n warnTimeout = setTimeout(() => {\n ctx.logger.warn(\n '\"Install pods\" phase takes longer then expected and it did not produce any logs in the past 15 minutes'\n );\n }, INSTALL_PODS_WARN_TIMEOUT_MS);\n\n killTimeout = setTimeout(async () => {\n timedOutToKill = true;\n ctx.logger.error(\n '\"Install pods\" phase takes a very long time and it did not produce any logs in the past 30 minutes. Most likely an unexpected error happened which caused the process to hang and it will be terminated'\n );\n const ppid = nullthrows(installPodsSpawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(ppid);\n pids.forEach((pid) => {\n process.kill(pid);\n });\n ctx.reportError?.('\"Install pods\" phase takes a very long time', undefined, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n }, INSTALL_PODS_KILL_TIMEOUT_MS);\n\n await installPodsSpawnPromise;\n } catch (err: any) {\n if (timedOutToKill) {\n throw new InstallPodsTimeoutError('\"Install pods\" phase was inactive for over 30 minutes');\n }\n throw err;\n } finally {\n if (warnTimeout) {\n clearTimeout(warnTimeout);\n }\n if (killTimeout) {\n clearTimeout(killTimeout);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/builders/ios.ts"],"names":[],"mappings":";;;;;AAmCA,6BAWC;AA9CD,wDAAgC;AAChC,yDAAiD;AACjD,uDAAgG;AAChG,wDAA0B;AAC1B,4DAAoC;AAGpC,sDAG8B;AAC9B,kDAA8D;AAC9D,0CAAwD;AACxD,gDAAyD;AACzD,yEAA4D;AAC5D,8CAAoE;AACpE,oCAAyC;AACzC,0CAAgE;AAChE,4CAA+F;AAC/F,2CAA6C;AAC7C,iDAAmD;AACnD,4EAAyE;AACzE,kDAA4E;AAC5E,uDAA+E;AAC/E,sEAAoE;AACpE,4EAA2F;AAE3F,qCAAoD;AACpD,qCAA+C;AAE/C,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAClE,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAElE,MAAM,uBAAwB,SAAQ,KAAK;CAAG;AAE/B,KAAK,UAAU,UAAU,CAAC,GAA0B;IACjE,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,yBAAS,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,IAAA,+CAAsB,EAAC,GAAG,CAAC,CAAC;QAClC,OAAO,MAAM,IAAA,iCAAwB,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,yBAAS,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,yBAAS,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,yBAAS,CAAC,MAAM,EAAE,CAAC;QAClF,OAAO,MAAM,IAAA,4BAAmB,EAAC,GAAG,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAA0B;IAClD,MAAM,IAAA,kBAAU,EAAC,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,wBAAQ,CAAC,OAAO,CAAC;IACxD,MAAM,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC;IACnC,MAAM,kBAAkB,GAAG,IAAI,iBAAkB,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,GAAG,CAAC,8BAA8B,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YACrF,OAAO,MAAM,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACtD,IAAI,aAAa,EAAE,CAAC;gBAClB,GAAG,CAAC,qBAAqB,EAAE,CAAC;gBAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,mKAAmK,CACpK,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAA2B,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM;gBAC3D,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE;gBACvC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAA,wBAAa,EAAC,GAAG,EAAE;gBACvB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,8BAA8B,EAAE;gBAChD,OAAO,EAAE,EAAE,SAAS,EAAE;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;;YAC3D,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,MAAM,CAAA,MAAA,GAAG,CAAC,YAAY,0CAAE,YAAY,CAAC,GAAG,CAAC,CAAA,CAAC;YAC1C,MAAM,IAAA,sCAAkB,EAAC;gBACvB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,gBAAgB;gBAChB,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ;gBAC1B,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO;aACzB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAA,wBAAgB,EAAC,GAAG,EAAE,YAAI,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,MAAM,iCAAiC,GAAG,MAAM,GAAG,CAAC,aAAa,CAC/D,0BAAU,CAAC,sCAAsC,EACjD,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,IAAA,kEAAoD,EAAC;gBAChE,GAAG,EAAE,GAAG,CAAC,8BAA8B,EAAE;gBACzC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI;gBACtB,GAAG,EAAE,GAAG,CAAC,GAAG;aACb,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,MAAM,kBAAkB,GAAG,IAAA,mCAAyB,EAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;gBACrE,MAAM,IAAA,iCAAqB,EAAC,GAAG,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;;YACpE,MAAM,IAAA,kDAAoC,EAAC,GAAG,EAAE;gBAC9C,sBAAsB,EAAE,MAAA,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,cAAc,mCAAI,IAAI;gBACjF,0BAA0B,EAAE,MAAA,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,kBAAkB,mCAAI,IAAI;aAC1F,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,wCAAwC,IAAI,IAAA,kCAAoB,EAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5F,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBAC1D,MAAM,IAAA,8BAAgB,EAAC;oBACrB,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ;oBAC1B,UAAU,EAAE,GAAG,CAAC,8BAA8B,EAAE;oBAChD,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,GAAG,EAAE;wBACH,GAAG,GAAG,CAAC,GAAG;wBACV,GAAG,CAAC,CAAA,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,cAAc;4BACnD,CAAC,CAAC;gCACE,iCAAiC,EAC/B,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,cAAc;gCACnD,8BAA8B,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI;6BAC7C;4BACH,CAAC,CAAC,IAAI,CAAC;qBACV;oBACD,cAAc,EAAE,GAAG,CAAC,cAAc;iBACnC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACtF,MAAM,IAAA,yBAAc,EAAC,GAAG,EAAE;gBACxB,WAAW;gBACX,MAAM;gBACN,kBAAkB;gBAClB,YAAY;gBACZ,GAAG,CAAC,CAAA,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,cAAc;oBACnD,CAAC,CAAC;wBACE,QAAQ,EAAE;4BACR,iCAAiC,EAC/B,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,cAAc;4BACnD,8BAA8B,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI;yBAC7C;qBACF;oBACH,CAAC,CAAC,IAAI,CAAC;aACV,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,kBAAkB,CAAC,OAAO,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,IAAA,wBAAgB,EAAC,GAAG,EAAE,YAAI,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,IAAA,oCAAwB,EAAC,GAAG,EAAE;YAClC,aAAa,EAAE,IAAA,6BAAmB,EAAC,GAAG,CAAC;YACvC,OAAO,EAAE,GAAG,CAAC,8BAA8B,EAAE;YAC7C,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;;QACxD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,MAAM,CAAA,MAAA,GAAG,CAAC,YAAY,0CAAE,SAAS,CAAC,GAAG,CAAC,CAAA,CAAC;QACvC,MAAM,IAAA,gCAAe,EAAC;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,gBAAgB;YAChB,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ;YAC1B,eAAe;YACf,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,IAAA,mCAAe,EAAC;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,GAA0B,EAC1B,EAAE,MAAM,EAAE,kBAAkB,EAAkD;IAE9E,IAAI,CAAC;QACH,MAAM,qBAAqB,GACzB,MAAM,0BAAS,CAAC,WAAW,CAAC,sCAAsC,CAChE,GAAG,CAAC,8BAA8B,EAAE,EACpC,MAAM,CACP,CAAC;QACJ,MAAM,gBAAgB,GAAG,0BAAS,CAAC,YAAY,CAAC,mBAAmB,CACjE,GAAG,CAAC,8BAA8B,EAAE,EACpC;YACE,kBAAkB;YAClB,UAAU,EAAE,qBAAqB;SAClC,CACF,CAAC;QACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,eAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC;QACxD,GAAG,CAAC,yBAAyB,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAA0B;IACnD,MAAM,sBAAsB,GAAG,MAAM,GAAG,CAAC,aAAa,CACpD,0BAAU,CAAC,4BAA4B,EACvC,KAAK,IAAI,EAAE;QACT,OAAO,MAAM,IAAA,wCAA+B,EAAC,GAAG,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;IAEF,MAAM,kBAAkB,GAAG,IAAI,iBAAkB,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YACrF,OAAO,MAAM,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,IAAA,4BAAiB,EAAC,GAAG,EAAE;gBAC3B,WAAW,EAAE,IAAA,oBAAU,EAAC,WAAW,CAAC;gBACpC,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,kBAAkB,CAAC,OAAO,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,sBAAsB,EAAE,CAAC,CAAC;QAClE,MAAM,GAAG,CAAC,cAAc,CAAC;YACvB,QAAQ,EAAE;gBACR,IAAI,EAAE,mCAAmB,CAAC,mBAAmB;gBAC7C,KAAK,EAAE,CAAC,sBAAsB,CAAC;aAChC;YACD,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC,SAAS,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,GAA0B;IAC3D,IAAI,WAAuC,CAAC;IAC5C,IAAI,WAAuC,CAAC;IAC5C,IAAI,cAAc,GAAY,KAAK,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,uBAAuB,GAAG,CAC9B,MAAM,IAAA,iBAAW,EAAC,GAAG,EAAE;YACrB,cAAc,EAAE,GAAG,EAAE;gBACnB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;gBACvB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;YACzB,CAAC;SACF,CAAC,CACH,CAAC,YAAY,CAAC;QACf,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,wGAAwG,CACzG,CAAC;QACJ,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAEjC,WAAW,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;;YAClC,cAAc,GAAG,IAAI,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,yMAAyM,CAC1M,CAAC;YACF,MAAM,IAAI,GAAG,IAAA,oBAAU,EAAC,uBAAuB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,IAAA,kDAAsC,EAAC,IAAI,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;YACH,MAAA,GAAG,CAAC,WAAW,oDAAG,6CAA6C,EAAE,SAAS,EAAE;gBAC1E,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE;aAC1C,CAAC,CAAC;QACL,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAEjC,MAAM,uBAAuB,CAAC;IAChC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,uBAAuB,CAAC,uDAAuD,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,YAAY,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,YAAY,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import plist from '@expo/plist';\nimport { IOSConfig } from '@expo/config-plugins';\nimport { ManagedArtifactType, BuildMode, BuildPhase, Ios, Workflow } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\nimport nullthrows from 'nullthrows';\n\nimport { Artifacts, BuildContext } from '../context';\nimport {\n resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync,\n configureExpoUpdatesIfInstalledAsync,\n} from '../utils/expoUpdates';\nimport { uploadApplicationArchive } from '../utils/artifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { configureXcodeProject } from '../ios/configure';\nimport CredentialsManager from '../ios/credentials/manager';\nimport { runFastlaneGym, runFastlaneResign } from '../ios/fastlane';\nimport { installPods } from '../ios/pod';\nimport { downloadApplicationArchiveAsync } from '../ios/resign';\nimport { resolveArtifactPath, resolveBuildConfiguration, resolveScheme } from '../ios/resolve';\nimport { setupAsync } from '../common/setup';\nimport { prebuildAsync } from '../common/prebuild';\nimport { prepareExecutableAsync } from '../utils/prepareBuildExecutable';\nimport { getParentAndDescendantProcessPidsAsync } from '../utils/processes';\nimport { eagerBundleAsync, shouldUseEagerBundle } from '../common/eagerBundle';\nimport { saveCcacheAsync } from '../steps/functions/saveBuildCache';\nimport { cacheStatsAsync, restoreCcacheAsync } from '../steps/functions/restoreBuildCache';\n\nimport { runBuilderWithHooksAsync } from './common';\nimport { runCustomBuildAsync } from './custom';\n\nconst INSTALL_PODS_WARN_TIMEOUT_MS = 15 * 60 * 1000; // 15 minutes\nconst INSTALL_PODS_KILL_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nclass InstallPodsTimeoutError extends Error {}\n\nexport default async function iosBuilder(ctx: BuildContext<Ios.Job>): Promise<Artifacts> {\n if (ctx.job.mode === BuildMode.BUILD) {\n await prepareExecutableAsync(ctx);\n return await runBuilderWithHooksAsync(ctx, buildAsync);\n } else if (ctx.job.mode === BuildMode.RESIGN) {\n return await resignAsync(ctx);\n } else if (ctx.job.mode === BuildMode.CUSTOM || ctx.job.mode === BuildMode.REPACK) {\n return await runCustomBuildAsync(ctx);\n } else {\n throw new Error('Not implemented');\n }\n}\n\nasync function buildAsync(ctx: BuildContext<Ios.Job>): Promise<void> {\n await setupAsync(ctx);\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n const evictUsedBefore = new Date();\n const credentialsManager = new CredentialsManager(ctx);\n const workingDirectory = ctx.getReactNativeProjectDirectory();\n try {\n const credentials = await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n return await credentialsManager.prepare();\n });\n\n await ctx.runBuildPhase(BuildPhase.PREBUILD, async () => {\n if (hasNativeCode) {\n ctx.markBuildPhaseSkipped();\n ctx.logger.info(\n 'Skipped running \"expo prebuild\" because the \"ios\" directory already exists. Learn more about the build process: https://docs.expo.dev/build-reference/ios-builds/'\n );\n return;\n }\n const extraEnvs: Record<string, string> = credentials?.teamId\n ? { APPLE_TEAM_ID: credentials.teamId }\n : {};\n await prebuildAsync(ctx, {\n logger: ctx.logger,\n workingDir: ctx.getReactNativeProjectDirectory(),\n options: { extraEnvs },\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support restoring cache');\n return;\n }\n await ctx.cacheManager?.restoreCache(ctx);\n await restoreCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_PODS, async () => {\n await runInstallPodsAsync(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n const resolvedExpoUpdatesRuntimeVersion = await ctx.runBuildPhase(\n BuildPhase.CALCULATE_EXPO_UPDATES_RUNTIME_VERSION,\n async () => {\n return await resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync({\n cwd: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n appConfig: ctx.appConfig,\n platform: ctx.job.platform,\n workflow: ctx.job.type,\n env: ctx.env,\n });\n }\n );\n\n const buildConfiguration = resolveBuildConfiguration(ctx);\n if (credentials) {\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_XCODE_PROJECT, async () => {\n await configureXcodeProject(ctx, { credentials, buildConfiguration });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx, {\n resolvedRuntimeVersion: resolvedExpoUpdatesRuntimeVersion?.runtimeVersion ?? null,\n resolvedFingerprintSources: resolvedExpoUpdatesRuntimeVersion?.fingerprintSources ?? null,\n });\n });\n\n if (!ctx.env.EAS_BUILD_DISABLE_BUNDLE_JAVASCRIPT_STEP && shouldUseEagerBundle(ctx.metadata)) {\n await ctx.runBuildPhase(BuildPhase.EAGER_BUNDLE, async () => {\n await eagerBundleAsync({\n platform: ctx.job.platform,\n workingDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n env: {\n ...ctx.env,\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE:\n resolvedExpoUpdatesRuntimeVersion?.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n }\n : null),\n },\n packageManager: ctx.packageManager,\n });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.RUN_FASTLANE, async () => {\n const scheme = resolveScheme(ctx);\n const entitlements = await readEntitlementsAsync(ctx, { scheme, buildConfiguration });\n await runFastlaneGym(ctx, {\n credentials,\n scheme,\n buildConfiguration,\n entitlements,\n ...(resolvedExpoUpdatesRuntimeVersion?.runtimeVersion\n ? {\n extraEnv: {\n EXPO_UPDATES_FINGERPRINT_OVERRIDE:\n resolvedExpoUpdatesRuntimeVersion?.runtimeVersion,\n EXPO_UPDATES_WORKFLOW_OVERRIDE: ctx.job.type,\n },\n }\n : null),\n });\n });\n } finally {\n await ctx.runBuildPhase(BuildPhase.CLEAN_UP_CREDENTIALS, async () => {\n await credentialsManager.cleanUp();\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.UPLOAD_APPLICATION_ARCHIVE, async () => {\n await uploadApplicationArchive(ctx, {\n patternOrPath: resolveArtifactPath(ctx),\n rootDir: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n if (ctx.isLocal) {\n ctx.logger.info('Local builds do not support saving cache.');\n return;\n }\n await ctx.cacheManager?.saveCache(ctx);\n await saveCcacheAsync({\n logger: ctx.logger,\n workingDirectory,\n platform: ctx.job.platform,\n evictUsedBefore,\n env: ctx.env,\n secrets: ctx.job.secrets,\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.CACHE_STATS, async () => {\n await cacheStatsAsync({\n logger: ctx.logger,\n env: ctx.env,\n });\n });\n}\n\nasync function readEntitlementsAsync(\n ctx: BuildContext<Ios.Job>,\n { scheme, buildConfiguration }: { scheme: string; buildConfiguration: string }\n): Promise<object | null> {\n try {\n const applicationTargetName =\n await IOSConfig.BuildScheme.getApplicationTargetNameForSchemeAsync(\n ctx.getReactNativeProjectDirectory(),\n scheme\n );\n const entitlementsPath = IOSConfig.Entitlements.getEntitlementsPath(\n ctx.getReactNativeProjectDirectory(),\n {\n buildConfiguration,\n targetName: applicationTargetName,\n }\n );\n if (!entitlementsPath) {\n return null;\n }\n const entitlementsRaw = await fs.readFile(entitlementsPath, 'utf8');\n return plist.parse(entitlementsRaw);\n } catch (err) {\n ctx.logger.warn({ err }, 'Failed to read entitlements');\n ctx.markBuildPhaseHasWarnings();\n return null;\n }\n}\n\nasync function resignAsync(ctx: BuildContext<Ios.Job>): Promise<Artifacts> {\n const applicationArchivePath = await ctx.runBuildPhase(\n BuildPhase.DOWNLOAD_APPLICATION_ARCHIVE,\n async () => {\n return await downloadApplicationArchiveAsync(ctx);\n }\n );\n\n const credentialsManager = new CredentialsManager(ctx);\n try {\n const credentials = await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n return await credentialsManager.prepare();\n });\n\n await ctx.runBuildPhase(BuildPhase.RUN_FASTLANE, async () => {\n await runFastlaneResign(ctx, {\n credentials: nullthrows(credentials),\n ipaPath: applicationArchivePath,\n });\n });\n } finally {\n await ctx.runBuildPhase(BuildPhase.CLEAN_UP_CREDENTIALS, async () => {\n await credentialsManager.cleanUp();\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.UPLOAD_APPLICATION_ARCHIVE, async () => {\n ctx.logger.info(`Application archive: ${applicationArchivePath}`);\n await ctx.uploadArtifact({\n artifact: {\n type: ManagedArtifactType.APPLICATION_ARCHIVE,\n paths: [applicationArchivePath],\n },\n logger: ctx.logger,\n });\n });\n\n return ctx.artifacts;\n}\n\nasync function runInstallPodsAsync(ctx: BuildContext<Ios.Job>): Promise<void> {\n let warnTimeout: NodeJS.Timeout | undefined;\n let killTimeout: NodeJS.Timeout | undefined;\n let timedOutToKill: boolean = false;\n try {\n const installPodsSpawnPromise = (\n await installPods(ctx, {\n infoCallbackFn: () => {\n warnTimeout?.refresh();\n killTimeout?.refresh();\n },\n })\n ).spawnPromise;\n warnTimeout = setTimeout(() => {\n ctx.logger.warn(\n '\"Install pods\" phase takes longer then expected and it did not produce any logs in the past 15 minutes'\n );\n }, INSTALL_PODS_WARN_TIMEOUT_MS);\n\n killTimeout = setTimeout(async () => {\n timedOutToKill = true;\n ctx.logger.error(\n '\"Install pods\" phase takes a very long time and it did not produce any logs in the past 30 minutes. Most likely an unexpected error happened which caused the process to hang and it will be terminated'\n );\n const ppid = nullthrows(installPodsSpawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(ppid);\n pids.forEach((pid) => {\n process.kill(pid);\n });\n ctx.reportError?.('\"Install pods\" phase takes a very long time', undefined, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n }, INSTALL_PODS_KILL_TIMEOUT_MS);\n\n await installPodsSpawnPromise;\n } catch (err: any) {\n if (timedOutToKill) {\n throw new InstallPodsTimeoutError('\"Install pods\" phase was inactive for over 30 minutes');\n }\n throw err;\n } finally {\n if (warnTimeout) {\n clearTimeout(warnTimeout);\n }\n if (killTimeout) {\n clearTimeout(killTimeout);\n }\n }\n}\n"]}
|
|
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.prepareProjectSourcesAsync = prepareProjectSourcesAsync;
|
|
7
7
|
exports.downloadAndUnpackProjectFromTarGzAsync = downloadAndUnpackProjectFromTarGzAsync;
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
10
|
const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
|
|
10
|
-
const
|
|
11
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
11
12
|
const eas_build_job_1 = require("@expo/eas-build-job");
|
|
12
13
|
const downloader_1 = __importDefault(require("@expo/downloader"));
|
|
13
14
|
const zod_1 = require("zod");
|
|
@@ -44,10 +45,7 @@ async function prepareProjectSourcesAsync(ctx, destinationDirectory = ctx.buildD
|
|
|
44
45
|
}
|
|
45
46
|
case eas_build_job_1.ArchiveSourceType.URL: {
|
|
46
47
|
await downloadAndUnpackProjectFromTarGzAsync(ctx, projectArchive.url, destinationDirectory);
|
|
47
|
-
|
|
48
|
-
if (!uploadResult.ok) {
|
|
49
|
-
ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);
|
|
50
|
-
}
|
|
48
|
+
uploadProjectMetadataAsFireAndForget(ctx, { projectDirectory: destinationDirectory });
|
|
51
49
|
return { handled: true };
|
|
52
50
|
}
|
|
53
51
|
case eas_build_job_1.ArchiveSourceType.GIT: {
|
|
@@ -56,10 +54,7 @@ async function prepareProjectSourcesAsync(ctx, destinationDirectory = ctx.buildD
|
|
|
56
54
|
archiveSource: projectArchive,
|
|
57
55
|
destinationDirectory,
|
|
58
56
|
});
|
|
59
|
-
|
|
60
|
-
if (!uploadResult.ok) {
|
|
61
|
-
ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);
|
|
62
|
-
}
|
|
57
|
+
uploadProjectMetadataAsFireAndForget(ctx, { projectDirectory: destinationDirectory });
|
|
63
58
|
return { handled: true };
|
|
64
59
|
}
|
|
65
60
|
}
|
|
@@ -84,7 +79,7 @@ async function downloadAndUnpackProjectFromTarGzAsync(ctx, projectArchiveUrl, de
|
|
|
84
79
|
}
|
|
85
80
|
async function prepareProjectSourcesLocallyAsync(ctx, projectArchivePath, destinationDirectory) {
|
|
86
81
|
const projectTarball = path_1.default.join(ctx.workingdir, 'project.tar.gz');
|
|
87
|
-
await
|
|
82
|
+
await promises_1.default.copyFile(projectArchivePath, projectTarball);
|
|
88
83
|
await unpackTarGzAsync({
|
|
89
84
|
destination: destinationDirectory,
|
|
90
85
|
source: projectTarball,
|
|
@@ -96,6 +91,14 @@ async function unpackTarGzAsync({ logger, source, destination, }) {
|
|
|
96
91
|
logger,
|
|
97
92
|
});
|
|
98
93
|
}
|
|
94
|
+
function uploadProjectMetadataAsFireAndForget(ctx, { projectDirectory }) {
|
|
95
|
+
void (async () => {
|
|
96
|
+
const uploadResult = await (0, results_1.asyncResult)(uploadProjectMetadataAsync(ctx, { projectDirectory }));
|
|
97
|
+
if (!uploadResult.ok) {
|
|
98
|
+
ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
}
|
|
99
102
|
async function uploadProjectMetadataAsync(ctx, { projectDirectory }) {
|
|
100
103
|
if (!ctx.job.platform) {
|
|
101
104
|
// Not a build job, skip.
|
|
@@ -117,7 +120,7 @@ async function uploadProjectMetadataAsync(ctx, { projectDirectory }) {
|
|
|
117
120
|
files.push('.git/...');
|
|
118
121
|
continue;
|
|
119
122
|
}
|
|
120
|
-
const entries = await
|
|
123
|
+
const entries = await promises_1.default.readdir(dir, { withFileTypes: true });
|
|
121
124
|
for (const entry of entries) {
|
|
122
125
|
const fullPath = path_1.default.join(dir, entry.name);
|
|
123
126
|
const relativeFilePath = path_1.default.join(relativePath, entry.name);
|
|
@@ -147,7 +150,7 @@ async function uploadProjectMetadataAsync(ctx, { projectDirectory }) {
|
|
|
147
150
|
throw result.error;
|
|
148
151
|
}
|
|
149
152
|
const uploadSession = result.data.uploadSession.createUploadSession;
|
|
150
|
-
await
|
|
153
|
+
await (0, node_fetch_1.default)(uploadSession.url, {
|
|
151
154
|
method: 'PUT',
|
|
152
155
|
body: JSON.stringify({ archiveContent: sortedFiles }),
|
|
153
156
|
headers: uploadSession.headers,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectSources.js","sourceRoot":"","sources":["../../src/common/projectSources.ts"],"names":[],"mappings":";;;;;AAiBA,gEAmEC;AAED,wFAoBC;AA1GD,gDAAwB;AAExB,sEAAuC;AACvC,wDAA0B;AAC1B,uDAAkG;AAElG,kEAA4C;AAC5C,6BAAwB;AACxB,2CAA4C;AAC5C,4DAAoC;AACpC,uCAAmC;AAGnC,sDAAmD;AAEnD,+BAAoD;AAE7C,KAAK,UAAU,0BAA0B,CAC9C,GAAuB,EACvB,oBAAoB,GAAG,GAAG,CAAC,cAAc;;IAGzC,IAAI,cAAc,GAAkB,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3D,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,MAAM,oBAAoB,GAAG,MAAM,IAAA,qBAAW,EAAC,8BAA8B,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpF,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,EAAE,GAAG,EAAE,oBAAoB,CAAC,MAAM,EAAE,EACpC,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAED,cAAc,GAAG,MAAA,oBAAoB,CAAC,KAAK,mCAAI,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;IACxE,CAAC;IAED,QAAQ,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,iCAAiB,CAAC,EAAE,CAAC;QAC1B,KAAK,iCAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QAED,KAAK,iCAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,MAAM,iCAAiC,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,4BAA4B;YACrH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,KAAK,iCAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,uDAAuD;YACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,KAAK,iCAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,MAAM,sCAAsC,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;YAE5F,MAAM,YAAY,GAAG,MAAM,IAAA,qBAAW,EACpC,0BAA0B,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC,CAC5E,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,KAAK,iCAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,MAAM,IAAA,iCAA2B,EAAC;gBAChC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,aAAa,EAAE,cAAc;gBAC7B,oBAAoB;aACrB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,IAAA,qBAAW,EACpC,0BAA0B,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC,CAC5E,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,sCAAsC,CAC1D,GAAuB,EACvB,iBAAyB,EACzB,oBAA4B;;IAE5B,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,IAAA,oBAAY,EAAC,iBAAiB,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAA,GAAG,CAAC,WAAW,oDAAG,oCAAoC,EAAE,GAAG,EAAE;YAC3D,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE;SAC1C,CAAC,CAAC;QACH,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,CAAC;QACrB,WAAW,EAAE,oBAAoB;QACjC,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iCAAiC,CAC9C,GAAuB,EACvB,kBAA0B,EAC1B,oBAA4B;IAE5B,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACnE,MAAM,kBAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAElD,MAAM,gBAAgB,CAAC;QACrB,WAAW,EAAE,oBAAoB;QACjC,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,EAC9B,MAAM,EACN,MAAM,EACN,WAAW,GAKZ;IACC,MAAM,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QACjF,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,GAAsB,EACtB,EAAE,gBAAgB,EAAgC;IAElD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtB,yBAAyB;QACzB,OAAO;IACT,CAAC;SAAM,IACL,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,iCAAiB,CAAC,GAAG;QACrD,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,gBAAgB,EACvC,CAAC;QACD,4CAA4C;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,iBAAiB,GAA4C;QACjE,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,EAAE;KAC5C,CAAC;IAEF,OAAO,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,KAAK,EAAG,CAAC;QAEzD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,6EAA6E;YAC7E,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE7D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,KAAK;SACtB,GAAG;IACF,kCAAkC;IAClC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAC/B;SACA,IAAI,EAAE,CAAC,CAAC,+BAA+B;IAE1C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa;SACnC,QAAQ,CACP,IAAA,kBAAO,EAAC;;;;;;OAMP,CAAC,EACF,EAAE,CACH;SACA,SAAS,EAAE,CAAC;IAEf,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,IAAK,CAAC,aAAa,CAAC,mBAIhD,CAAC;IAEF,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE;QAC7B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QACrD,OAAO,EAAE,aAAa,CAAC,OAAO;KAC/B,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,MAAM,GAAG,CAAC,aAAa;SACjD,QAAQ,CACP,IAAA,kBAAO,EAAC;;;;;;;;;;;;;;OAcP,CAAC,EACF;QACE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY;QAC7B,mBAAmB,EAAE;YACnB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,aAAa,CAAC,SAAS;SACnC;KACF,CACF;SACA,SAAS,EAAE,CAAC;IAEf,IAAI,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,oBAAoB,CAAC,KAAK,CAAC;IACnC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,GAAsB;;IAClE,MAAM,MAAM,GAAG,IAAA,oBAAU,EAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;IAC3E,MAAM,gBAAgB,GAAG,IAAA,oBAAU,EAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,6BAA6B,CAAC,CAAC;IAC7F,MAAM,gBAAgB,GAAG,IAAA,oBAAU,EACjC,MAAA,GAAG,CAAC,GAAG,CAAC,OAAO,0CAAE,gBAAgB,EACjC,+BAA+B,CAChC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,IAAA,yBAAW,EAChC,IAAI,GAAG,CACL,GAAG,CAAC,GAAG,CAAC,QAAQ;QACd,CAAC,CAAC,qBAAqB,MAAM,2BAA2B;QACxD,CAAC,CAAC,uBAAuB,MAAM,2BAA2B,EAC5D,gBAAgB,CACjB,CAAC,QAAQ,EAAE,EACZ,MAAM,EACN;QACE,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,gBAAgB,EAAE;SAC5C;QACD,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CACF,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAW,EAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAW,EAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,CAAC,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,oCAAoB,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxF,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,gCAAgC,QAAQ,CAAC,MAAM,MAAM,OAAC,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CACzF,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,CAAC","sourcesContent":["import path from 'path';\n\nimport spawn from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport { ArchiveSourceType, Job, ArchiveSource, ArchiveSourceSchemaZ } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport downloadFile from '@expo/downloader';\nimport { z } from 'zod';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\nimport { graphql } from 'gql.tada';\n\nimport { BuildContext } from '../context';\nimport { turtleFetch } from '../utils/turtleFetch';\n\nimport { shallowCloneRepositoryAsync } from './git';\n\nexport async function prepareProjectSourcesAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n destinationDirectory = ctx.buildDirectory\n): // Return type required to make switch exhaustive.\nPromise<{ handled: boolean }> {\n let projectArchive: ArchiveSource = ctx.job.projectArchive;\n if (ctx.isLocal) {\n console.warn('Local build, skipping project archive refresh');\n } else {\n const projectArchiveResult = await asyncResult(fetchProjectArchiveSourceAsync(ctx));\n\n if (!projectArchiveResult.ok) {\n ctx.logger.error(\n { err: projectArchiveResult.reason },\n 'Failed to refresh project archive, falling back to the original one'\n );\n }\n\n projectArchive = projectArchiveResult.value ?? ctx.job.projectArchive;\n }\n\n switch (projectArchive.type) {\n case ArchiveSourceType.R2:\n case ArchiveSourceType.GCS: {\n throw new Error('Remote project sources should be resolved earlier to URL');\n }\n\n case ArchiveSourceType.PATH: {\n await prepareProjectSourcesLocallyAsync(ctx, projectArchive.path, destinationDirectory); // used in eas build --local\n return { handled: true };\n }\n\n case ArchiveSourceType.NONE: {\n // May be used in no-sources jobs like submission jobs.\n return { handled: true };\n }\n\n case ArchiveSourceType.URL: {\n await downloadAndUnpackProjectFromTarGzAsync(ctx, projectArchive.url, destinationDirectory);\n\n const uploadResult = await asyncResult(\n uploadProjectMetadataAsync(ctx, { projectDirectory: destinationDirectory })\n );\n if (!uploadResult.ok) {\n ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);\n }\n\n return { handled: true };\n }\n\n case ArchiveSourceType.GIT: {\n await shallowCloneRepositoryAsync({\n logger: ctx.logger,\n archiveSource: projectArchive,\n destinationDirectory,\n });\n\n const uploadResult = await asyncResult(\n uploadProjectMetadataAsync(ctx, { projectDirectory: destinationDirectory })\n );\n if (!uploadResult.ok) {\n ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);\n }\n\n return { handled: true };\n }\n }\n}\n\nexport async function downloadAndUnpackProjectFromTarGzAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchiveUrl: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n try {\n await downloadFile(projectArchiveUrl, projectTarball, { retry: 3 });\n } catch (err: any) {\n ctx.reportError?.('Failed to download project archive', err, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n throw err;\n }\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function prepareProjectSourcesLocallyAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchivePath: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n await fs.copy(projectArchivePath, projectTarball);\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function unpackTarGzAsync({\n logger,\n source,\n destination,\n}: {\n logger: bunyan;\n source: string;\n destination: string;\n}): Promise<void> {\n await spawn('tar', ['-C', destination, '--strip-components', '1', '-zxf', source], {\n logger,\n });\n}\n\nasync function uploadProjectMetadataAsync(\n ctx: BuildContext<Job>,\n { projectDirectory }: { projectDirectory: string }\n): Promise<void> {\n if (!ctx.job.platform) {\n // Not a build job, skip.\n return;\n } else if (\n ctx.job.projectArchive.type === ArchiveSourceType.GCS &&\n ctx.job.projectArchive.metadataLocation\n ) {\n // Build already has project metadata, skip.\n return;\n }\n\n const files: string[] = [];\n\n const directoriesToScan: { dir: string; relativePath: string }[] = [\n { dir: projectDirectory, relativePath: '' },\n ];\n\n while (directoriesToScan.length > 0) {\n const { dir, relativePath } = directoriesToScan.shift()!;\n\n if (relativePath === '.git') {\n // Do not include whole `.git` directory in the archive, just that it exists.\n files.push('.git/...');\n continue;\n }\n\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n directoriesToScan.push({ dir: fullPath, relativePath: relativeFilePath });\n } else {\n files.push(relativeFilePath);\n }\n }\n }\n const sortedFiles = files\n .map(\n // Prepend entries with \"project/\"\n (f) => path.join('project', f)\n )\n .sort(); // Sort for consistent ordering\n\n const result = await ctx.graphqlClient\n .mutation(\n graphql(`\n mutation {\n uploadSession {\n createUploadSession(type: EAS_BUILD_GCS_PROJECT_METADATA)\n }\n }\n `),\n {}\n )\n .toPromise();\n\n if (result.error) {\n throw result.error;\n }\n\n const uploadSession = result.data!.uploadSession.createUploadSession as {\n url: string;\n bucketKey: string;\n headers: Record<string, string>;\n };\n\n await fetch(uploadSession.url, {\n method: 'PUT',\n body: JSON.stringify({ archiveContent: sortedFiles }),\n headers: uploadSession.headers,\n });\n\n const updateMetadataResult = await ctx.graphqlClient\n .mutation(\n graphql(`\n mutation UpdateTurtleBuildMetadataMutation(\n $buildId: ID!\n $projectMetadataFile: ProjectMetadataFileInput!\n ) {\n build {\n updateBuildMetadata(\n buildId: $buildId\n metadata: { projectMetadataFile: $projectMetadataFile }\n ) {\n id\n }\n }\n }\n `),\n {\n buildId: ctx.env.EAS_BUILD_ID,\n projectMetadataFile: {\n type: 'GCS',\n bucketKey: uploadSession.bucketKey,\n },\n }\n )\n .toPromise();\n\n if (updateMetadataResult.error) {\n throw updateMetadataResult.error;\n }\n}\n\nasync function fetchProjectArchiveSourceAsync(ctx: BuildContext<Job>): Promise<ArchiveSource> {\n const taskId = nullthrows(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const expoApiServerURL = nullthrows(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const robotAccessToken = nullthrows(\n ctx.job.secrets?.robotAccessToken,\n 'robot access token is not set'\n );\n\n const response = await turtleFetch(\n new URL(\n ctx.job.platform\n ? `/v2/turtle-builds/${taskId}/download-project-archive`\n : `/v2/turtle-job-runs/${taskId}/download-project-archive`,\n expoApiServerURL\n ).toString(),\n 'POST',\n {\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n },\n timeout: 20000,\n retries: 3,\n logger: ctx.logger,\n }\n );\n\n if (!response.ok) {\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const jsonResult = await asyncResult(response.json());\n if (!jsonResult.ok) {\n throw new Error(\n `Expected JSON response from server (${response.status}): ${jsonResult.reason}`\n );\n }\n\n const dataResult = z.object({ data: ArchiveSourceSchemaZ }).safeParse(jsonResult.value);\n if (!dataResult.success) {\n throw new Error(\n `Unexpected data from server (${response.status}): ${z.prettifyError(dataResult.error)}`\n );\n }\n\n return dataResult.data.data;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"projectSources.js","sourceRoot":"","sources":["../../src/common/projectSources.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport fs from 'fs/promises';\n\nimport spawn from '@expo/turtle-spawn';\nimport fetch from 'node-fetch';\nimport { ArchiveSourceType, Job, ArchiveSource, ArchiveSourceSchemaZ } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport downloadFile from '@expo/downloader';\nimport { z } from 'zod';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\nimport { graphql } from 'gql.tada';\n\nimport { BuildContext } from '../context';\nimport { turtleFetch } from '../utils/turtleFetch';\n\nimport { shallowCloneRepositoryAsync } from './git';\n\nexport async function prepareProjectSourcesAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n destinationDirectory = ctx.buildDirectory\n): // Return type required to make switch exhaustive.\nPromise<{ handled: boolean }> {\n let projectArchive: ArchiveSource = ctx.job.projectArchive;\n if (ctx.isLocal) {\n console.warn('Local build, skipping project archive refresh');\n } else {\n const projectArchiveResult = await asyncResult(fetchProjectArchiveSourceAsync(ctx));\n\n if (!projectArchiveResult.ok) {\n ctx.logger.error(\n { err: projectArchiveResult.reason },\n 'Failed to refresh project archive, falling back to the original one'\n );\n }\n\n projectArchive = projectArchiveResult.value ?? ctx.job.projectArchive;\n }\n\n switch (projectArchive.type) {\n case ArchiveSourceType.R2:\n case ArchiveSourceType.GCS: {\n throw new Error('Remote project sources should be resolved earlier to URL');\n }\n\n case ArchiveSourceType.PATH: {\n await prepareProjectSourcesLocallyAsync(ctx, projectArchive.path, destinationDirectory); // used in eas build --local\n return { handled: true };\n }\n\n case ArchiveSourceType.NONE: {\n // May be used in no-sources jobs like submission jobs.\n return { handled: true };\n }\n\n case ArchiveSourceType.URL: {\n await downloadAndUnpackProjectFromTarGzAsync(ctx, projectArchive.url, destinationDirectory);\n\n uploadProjectMetadataAsFireAndForget(ctx, { projectDirectory: destinationDirectory });\n\n return { handled: true };\n }\n\n case ArchiveSourceType.GIT: {\n await shallowCloneRepositoryAsync({\n logger: ctx.logger,\n archiveSource: projectArchive,\n destinationDirectory,\n });\n\n uploadProjectMetadataAsFireAndForget(ctx, { projectDirectory: destinationDirectory });\n\n return { handled: true };\n }\n }\n}\n\nexport async function downloadAndUnpackProjectFromTarGzAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchiveUrl: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n try {\n await downloadFile(projectArchiveUrl, projectTarball, { retry: 3 });\n } catch (err: any) {\n ctx.reportError?.('Failed to download project archive', err, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n throw err;\n }\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function prepareProjectSourcesLocallyAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchivePath: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n await fs.copyFile(projectArchivePath, projectTarball);\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function unpackTarGzAsync({\n logger,\n source,\n destination,\n}: {\n logger: bunyan;\n source: string;\n destination: string;\n}): Promise<void> {\n await spawn('tar', ['-C', destination, '--strip-components', '1', '-zxf', source], {\n logger,\n });\n}\n\nfunction uploadProjectMetadataAsFireAndForget(\n ctx: BuildContext<Job>,\n { projectDirectory }: { projectDirectory: string }\n): void {\n void (async () => {\n const uploadResult = await asyncResult(uploadProjectMetadataAsync(ctx, { projectDirectory }));\n if (!uploadResult.ok) {\n ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);\n }\n })();\n}\n\nasync function uploadProjectMetadataAsync(\n ctx: BuildContext<Job>,\n { projectDirectory }: { projectDirectory: string }\n): Promise<void> {\n if (!ctx.job.platform) {\n // Not a build job, skip.\n return;\n } else if (\n ctx.job.projectArchive.type === ArchiveSourceType.GCS &&\n ctx.job.projectArchive.metadataLocation\n ) {\n // Build already has project metadata, skip.\n return;\n }\n\n const files: string[] = [];\n\n const directoriesToScan: { dir: string; relativePath: string }[] = [\n { dir: projectDirectory, relativePath: '' },\n ];\n\n while (directoriesToScan.length > 0) {\n const { dir, relativePath } = directoriesToScan.shift()!;\n\n if (relativePath === '.git') {\n // Do not include whole `.git` directory in the archive, just that it exists.\n files.push('.git/...');\n continue;\n }\n\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n directoriesToScan.push({ dir: fullPath, relativePath: relativeFilePath });\n } else {\n files.push(relativeFilePath);\n }\n }\n }\n const sortedFiles = files\n .map(\n // Prepend entries with \"project/\"\n (f) => path.join('project', f)\n )\n .sort(); // Sort for consistent ordering\n\n const result = await ctx.graphqlClient\n .mutation(\n graphql(`\n mutation {\n uploadSession {\n createUploadSession(type: EAS_BUILD_GCS_PROJECT_METADATA)\n }\n }\n `),\n {}\n )\n .toPromise();\n\n if (result.error) {\n throw result.error;\n }\n\n const uploadSession = result.data!.uploadSession.createUploadSession as {\n url: string;\n bucketKey: string;\n headers: Record<string, string>;\n };\n\n await fetch(uploadSession.url, {\n method: 'PUT',\n body: JSON.stringify({ archiveContent: sortedFiles }),\n headers: uploadSession.headers,\n });\n\n const updateMetadataResult = await ctx.graphqlClient\n .mutation(\n graphql(`\n mutation UpdateTurtleBuildMetadataMutation(\n $buildId: ID!\n $projectMetadataFile: ProjectMetadataFileInput!\n ) {\n build {\n updateBuildMetadata(\n buildId: $buildId\n metadata: { projectMetadataFile: $projectMetadataFile }\n ) {\n id\n }\n }\n }\n `),\n {\n buildId: ctx.env.EAS_BUILD_ID,\n projectMetadataFile: {\n type: 'GCS',\n bucketKey: uploadSession.bucketKey,\n },\n }\n )\n .toPromise();\n\n if (updateMetadataResult.error) {\n throw updateMetadataResult.error;\n }\n}\n\nasync function fetchProjectArchiveSourceAsync(ctx: BuildContext<Job>): Promise<ArchiveSource> {\n const taskId = nullthrows(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const expoApiServerURL = nullthrows(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const robotAccessToken = nullthrows(\n ctx.job.secrets?.robotAccessToken,\n 'robot access token is not set'\n );\n\n const response = await turtleFetch(\n new URL(\n ctx.job.platform\n ? `/v2/turtle-builds/${taskId}/download-project-archive`\n : `/v2/turtle-job-runs/${taskId}/download-project-archive`,\n expoApiServerURL\n ).toString(),\n 'POST',\n {\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n },\n timeout: 20000,\n retries: 3,\n logger: ctx.logger,\n }\n );\n\n if (!response.ok) {\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const jsonResult = await asyncResult(response.json());\n if (!jsonResult.ok) {\n throw new Error(\n `Expected JSON response from server (${response.status}): ${jsonResult.reason}`\n );\n }\n\n const dataResult = z.object({ data: ArchiveSourceSchemaZ }).safeParse(jsonResult.value);\n if (!dataResult.success) {\n throw new Error(\n `Unexpected data from server (${response.status}): ${z.prettifyError(dataResult.error)}`\n );\n }\n\n return dataResult.data.data;\n}\n"]}
|
|
@@ -11,3 +11,7 @@ export declare function restoreCcacheAsync({ logger, workingDirectory, platform,
|
|
|
11
11
|
robotAccessToken?: string;
|
|
12
12
|
};
|
|
13
13
|
}): Promise<void>;
|
|
14
|
+
export declare function cacheStatsAsync({ logger, env, }: {
|
|
15
|
+
logger: bunyan;
|
|
16
|
+
env: Record<string, string | undefined>;
|
|
17
|
+
}): Promise<void>;
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.createRestoreBuildCacheFunction = createRestoreBuildCacheFunction;
|
|
7
7
|
exports.restoreCcacheAsync = restoreCcacheAsync;
|
|
8
|
+
exports.cacheStatsAsync = cacheStatsAsync;
|
|
8
9
|
const steps_1 = require("@expo/steps");
|
|
9
10
|
const eas_build_job_1 = require("@expo/eas-build-job");
|
|
10
11
|
const results_1 = require("@expo/results");
|
|
@@ -48,13 +49,13 @@ async function restoreCcacheAsync({ logger, workingDirectory, platform, env, sec
|
|
|
48
49
|
if (!enabled) {
|
|
49
50
|
return;
|
|
50
51
|
}
|
|
52
|
+
const robotAccessToken = (0, nullthrows_1.default)(secrets === null || secrets === void 0 ? void 0 : secrets.robotAccessToken, 'Robot access token is required for cache operations');
|
|
53
|
+
const expoApiServerURL = (0, nullthrows_1.default)(env.__API_SERVER_URL, '__API_SERVER_URL is not set');
|
|
54
|
+
const cachePath = (0, cacheKey_1.getCcachePath)(env);
|
|
51
55
|
try {
|
|
52
56
|
const cacheKey = await (0, cacheKey_1.generateDefaultBuildCacheKeyAsync)(workingDirectory, platform);
|
|
53
57
|
logger.info(`Restoring cache key: ${cacheKey}`);
|
|
54
58
|
const jobId = (0, nullthrows_1.default)(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');
|
|
55
|
-
const robotAccessToken = (0, nullthrows_1.default)(secrets === null || secrets === void 0 ? void 0 : secrets.robotAccessToken, 'Robot access token is required for cache operations');
|
|
56
|
-
const expoApiServerURL = (0, nullthrows_1.default)(env.__API_SERVER_URL, '__API_SERVER_URL is not set');
|
|
57
|
-
const cachePath = (0, cacheKey_1.getCcachePath)(env);
|
|
58
59
|
const { archivePath, matchedKey } = await (0, restoreCache_1.downloadCacheAsync)({
|
|
59
60
|
logger,
|
|
60
61
|
jobId,
|
|
@@ -81,11 +82,41 @@ async function restoreCcacheAsync({ logger, workingDirectory, platform, env, sec
|
|
|
81
82
|
}
|
|
82
83
|
catch (err) {
|
|
83
84
|
if (err instanceof turtleFetch_1.TurtleFetchError && ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 404) {
|
|
84
|
-
|
|
85
|
+
try {
|
|
86
|
+
logger.info('No cache found for this key. Downloading public cache...');
|
|
87
|
+
const { archivePath } = await (0, restoreCache_1.downloadPublicCacheAsync)({
|
|
88
|
+
logger,
|
|
89
|
+
expoApiServerURL,
|
|
90
|
+
robotAccessToken,
|
|
91
|
+
paths: [cachePath],
|
|
92
|
+
platform,
|
|
93
|
+
});
|
|
94
|
+
await (0, restoreCache_1.decompressCacheAsync)({
|
|
95
|
+
archivePath,
|
|
96
|
+
workingDirectory,
|
|
97
|
+
verbose: env.EXPO_DEBUG === '1',
|
|
98
|
+
logger,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger.warn({ err }, 'Failed to download public cache');
|
|
103
|
+
}
|
|
85
104
|
}
|
|
86
105
|
else {
|
|
87
106
|
logger.warn({ err }, 'Failed to restore cache');
|
|
88
107
|
}
|
|
89
108
|
}
|
|
90
109
|
}
|
|
110
|
+
async function cacheStatsAsync({ logger, env, }) {
|
|
111
|
+
const enabled = env.EAS_RESTORE_CACHE === '1' || (env.EAS_USE_CACHE === '1' && env.EAS_RESTORE_CACHE !== '0');
|
|
112
|
+
if (!enabled) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
logger.info('Cache stats:');
|
|
116
|
+
await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--show-stats', '-v'], {
|
|
117
|
+
env,
|
|
118
|
+
logger,
|
|
119
|
+
stdio: 'pipe',
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
91
122
|
//# sourceMappingURL=restoreBuildCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoreBuildCache.js","sourceRoot":"","sources":["../../../src/steps/functions/restoreBuildCache.ts"],"names":[],"mappings":";;;;;AAoBA,0EAiCC;AAED,
|
|
1
|
+
{"version":3,"file":"restoreBuildCache.js","sourceRoot":"","sources":["../../../src/steps/functions/restoreBuildCache.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport { Platform } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\n\nimport {\n CACHE_KEY_PREFIX_BY_PLATFORM,\n generateDefaultBuildCacheKeyAsync,\n getCcachePath,\n} from '../../utils/cacheKey';\nimport { TurtleFetchError } from '../../utils/turtleFetch';\n\nimport { downloadCacheAsync, decompressCacheAsync, downloadPublicCacheAsync } from './restoreCache';\n\nexport function createRestoreBuildCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'restore_build_cache',\n name: 'Restore Cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'platform',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepCtx, { env, inputs }) => {\n const { logger } = stepCtx;\n const workingDirectory = stepCtx.workingDirectory;\n const platform =\n (inputs.platform.value as Platform | undefined) ??\n stepCtx.global.staticContext.job.platform;\n if (!platform || ![Platform.ANDROID, Platform.IOS].includes(platform)) {\n throw new Error(\n `Unsupported platform: ${platform}. Platform must be \"${Platform.ANDROID}\" or \"${Platform.IOS}\"`\n );\n }\n\n await restoreCcacheAsync({\n logger,\n workingDirectory,\n platform,\n env,\n secrets: stepCtx.global.staticContext.job.secrets,\n });\n },\n });\n}\n\nexport async function restoreCcacheAsync({\n logger,\n workingDirectory,\n platform,\n env,\n secrets,\n}: {\n logger: bunyan;\n workingDirectory: string;\n platform: Platform;\n env: Record<string, string | undefined>;\n secrets?: { robotAccessToken?: string };\n}): Promise<void> {\n const enabled =\n env.EAS_RESTORE_CACHE === '1' || (env.EAS_USE_CACHE === '1' && env.EAS_RESTORE_CACHE !== '0');\n\n if (!enabled) {\n return;\n }\n const robotAccessToken = nullthrows(\n secrets?.robotAccessToken,\n 'Robot access token is required for cache operations'\n );\n const expoApiServerURL = nullthrows(env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const cachePath = getCcachePath(env);\n try {\n const cacheKey = await generateDefaultBuildCacheKeyAsync(workingDirectory, platform);\n logger.info(`Restoring cache key: ${cacheKey}`);\n\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const { archivePath, matchedKey } = await downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths: [cachePath],\n key: cacheKey,\n keyPrefixes: [CACHE_KEY_PREFIX_BY_PLATFORM[platform]],\n platform,\n });\n\n await decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose: env.EXPO_DEBUG === '1',\n logger,\n });\n\n logger.info(\n `Cache restored successfully ${matchedKey === cacheKey ? '(direct hit)' : '(prefix match)'}`\n );\n\n // Zero ccache stats for accurate tracking\n await asyncResult(\n spawnAsync('ccache', ['--zero-stats'], {\n env,\n logger,\n stdio: 'pipe',\n })\n );\n } catch (err: unknown) {\n if (err instanceof TurtleFetchError && err.response?.status === 404) {\n try {\n logger.info('No cache found for this key. Downloading public cache...');\n const { archivePath } = await downloadPublicCacheAsync({\n logger,\n expoApiServerURL,\n robotAccessToken,\n paths: [cachePath],\n platform,\n });\n await decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose: env.EXPO_DEBUG === '1',\n logger,\n });\n } catch (err: unknown) {\n logger.warn({ err }, 'Failed to download public cache');\n }\n } else {\n logger.warn({ err }, 'Failed to restore cache');\n }\n }\n}\n\nexport async function cacheStatsAsync({\n logger,\n env,\n}: {\n logger: bunyan;\n env: Record<string, string | undefined>;\n}): Promise<void> {\n const enabled =\n env.EAS_RESTORE_CACHE === '1' || (env.EAS_USE_CACHE === '1' && env.EAS_RESTORE_CACHE !== '0');\n\n if (!enabled) {\n return;\n }\n logger.info('Cache stats:');\n await asyncResult(\n spawnAsync('ccache', ['--show-stats', '-v'], {\n env,\n logger,\n stdio: 'pipe',\n })\n );\n}\n"]}
|
|
@@ -15,6 +15,16 @@ export declare function downloadCacheAsync({ logger, jobId, expoApiServerURL, ro
|
|
|
15
15
|
archivePath: string;
|
|
16
16
|
matchedKey: string;
|
|
17
17
|
}>;
|
|
18
|
+
export declare function downloadPublicCacheAsync({ logger, expoApiServerURL, robotAccessToken, paths, platform, }: {
|
|
19
|
+
logger: bunyan;
|
|
20
|
+
expoApiServerURL: string;
|
|
21
|
+
robotAccessToken: string;
|
|
22
|
+
paths: string[];
|
|
23
|
+
platform: Platform;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
archivePath: string;
|
|
26
|
+
matchedKey: string;
|
|
27
|
+
}>;
|
|
18
28
|
export declare function decompressCacheAsync({ archivePath, workingDirectory, verbose, logger, }: {
|
|
19
29
|
archivePath: string;
|
|
20
30
|
workingDirectory: string;
|
|
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.createRestoreCacheFunction = createRestoreCacheFunction;
|
|
30
30
|
exports.downloadCacheAsync = downloadCacheAsync;
|
|
31
|
+
exports.downloadPublicCacheAsync = downloadPublicCacheAsync;
|
|
31
32
|
exports.decompressCacheAsync = decompressCacheAsync;
|
|
32
33
|
const fs_1 = __importDefault(require("fs"));
|
|
33
34
|
const os_1 = __importDefault(require("os"));
|
|
@@ -44,6 +45,7 @@ const retryOnDNSFailure_1 = require("../../utils/retryOnDNSFailure");
|
|
|
44
45
|
const artifacts_1 = require("../../utils/artifacts");
|
|
45
46
|
const cache_1 = require("../utils/cache");
|
|
46
47
|
const turtleFetch_1 = require("../../utils/turtleFetch");
|
|
48
|
+
const cacheKey_1 = require("../../utils/cacheKey");
|
|
47
49
|
const streamPipeline = (0, util_1.promisify)(stream_1.default.pipeline);
|
|
48
50
|
function createRestoreCacheFunction() {
|
|
49
51
|
return new steps_1.BuildFunction({
|
|
@@ -171,6 +173,49 @@ async function downloadCacheAsync({ logger, jobId, expoApiServerURL, robotAccess
|
|
|
171
173
|
throw err;
|
|
172
174
|
}
|
|
173
175
|
}
|
|
176
|
+
async function downloadPublicCacheAsync({ logger, expoApiServerURL, robotAccessToken, paths, platform, }) {
|
|
177
|
+
const routerURL = 'v2/public-turtle-caches/download';
|
|
178
|
+
const key = cacheKey_1.PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM[platform];
|
|
179
|
+
try {
|
|
180
|
+
const response = await (0, turtleFetch_1.turtleFetch)(new URL(routerURL, expoApiServerURL).toString(), 'POST', {
|
|
181
|
+
json: {
|
|
182
|
+
key,
|
|
183
|
+
version: (0, cache_1.getCacheVersion)(paths),
|
|
184
|
+
keyPrefixes: [key],
|
|
185
|
+
},
|
|
186
|
+
headers: {
|
|
187
|
+
Authorization: `Bearer ${robotAccessToken}`,
|
|
188
|
+
'Content-Type': 'application/json',
|
|
189
|
+
},
|
|
190
|
+
retries: 2,
|
|
191
|
+
shouldThrowOnNotOk: true,
|
|
192
|
+
});
|
|
193
|
+
const result = await (0, results_1.asyncResult)(response.json());
|
|
194
|
+
if (!result.ok) {
|
|
195
|
+
throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);
|
|
196
|
+
}
|
|
197
|
+
const { matchedKey, downloadUrl } = result.value.data;
|
|
198
|
+
logger.info(`Matched public cache key: ${matchedKey}. Downloading...`);
|
|
199
|
+
const downloadDestinationDirectory = await fs_1.default.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'restore-cache-'));
|
|
200
|
+
const downloadResponse = await (0, retryOnDNSFailure_1.retryOnDNSFailure)(node_fetch_1.default)(downloadUrl);
|
|
201
|
+
if (!downloadResponse.ok) {
|
|
202
|
+
throw new Error(`Unexpected response from cache server (${downloadResponse.status}): ${downloadResponse.statusText}`);
|
|
203
|
+
}
|
|
204
|
+
const archiveFilename = path_1.default
|
|
205
|
+
.basename(new URL(downloadUrl).pathname)
|
|
206
|
+
.replace(/([^a-z0-9.-]+)/gi, '_');
|
|
207
|
+
const archivePath = path_1.default.join(downloadDestinationDirectory, archiveFilename);
|
|
208
|
+
await streamPipeline(downloadResponse.body, fs_1.default.createWriteStream(archivePath));
|
|
209
|
+
return { archivePath, matchedKey };
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
if (err instanceof turtleFetch_1.TurtleFetchError && err.response.status !== 404) {
|
|
213
|
+
const textResult = await (0, results_1.asyncResult)(err.response.text());
|
|
214
|
+
throw new Error(`Unexpected response from server (${err.response.status}): ${textResult.value}`);
|
|
215
|
+
}
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
174
219
|
async function decompressCacheAsync({ archivePath, workingDirectory, verbose, logger, }) {
|
|
175
220
|
if (verbose) {
|
|
176
221
|
logger.info(`Extracting cache to ${workingDirectory}:`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoreCache.js","sourceRoot":"","sources":["../../../src/steps/functions/restoreCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport stream from 'stream';\nimport { promisify } from 'util';\n\nimport * as tar from 'tar';\nimport { bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\nimport z from 'zod';\nimport nullthrows from 'nullthrows';\nimport fetch from 'node-fetch';\nimport { asyncResult } from '@expo/results';\nimport { Platform } from '@expo/eas-build-job';\n\nimport { retryOnDNSFailure } from '../../utils/retryOnDNSFailure';\nimport { formatBytes } from '../../utils/artifacts';\nimport { getCacheVersion } from '../utils/cache';\nimport { turtleFetch, TurtleFetchError } from '../../utils/turtleFetch';\n\nconst streamPipeline = promisify(stream.pipeline);\n\nexport function createRestoreCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'restore_cache',\n name: 'Restore Cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'path',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'restore_keys',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'cache_hit',\n required: false,\n }),\n ],\n fn: async (stepsCtx, { env, inputs, outputs }) => {\n const { logger } = stepsCtx;\n\n try {\n if (stepsCtx.global.staticContext.job.platform) {\n logger.error('Caches are not supported in build jobs yet.');\n return;\n }\n\n const paths = z\n .array(z.string())\n .parse(((inputs.path.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((path) => path.length > 0);\n const key = z.string().parse(inputs.key.value);\n const restoreKeys = z\n .array(z.string())\n .parse(((inputs.restore_keys.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((key) => key !== '');\n\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n stepsCtx.global.staticContext.job.secrets?.robotAccessToken,\n 'robotAccessToken is not set'\n );\n\n const { archivePath, matchedKey } = await downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n keyPrefixes: restoreKeys,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n logger.info(`Downloaded cache archive from ${archivePath} (${formatBytes(size)}).`);\n\n await decompressCacheAsync({\n archivePath,\n workingDirectory: stepsCtx.workingDirectory,\n verbose: true,\n logger,\n });\n\n outputs.cache_hit.set(`${matchedKey === key}`);\n } catch (error) {\n logger.error({ err: error }, 'Failed to restore cache');\n }\n },\n });\n}\n\nexport async function downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n keyPrefixes,\n platform,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n keyPrefixes: string[];\n platform: Platform | undefined;\n}): Promise<{ archivePath: string; matchedKey: string }> {\n const routerURL = platform ? 'v2/turtle-builds/caches/download' : 'v2/turtle-caches/download';\n\n try {\n const response = await turtleFetch(new URL(routerURL, expoApiServerURL).toString(), 'POST', {\n json: platform\n ? {\n buildId: jobId,\n key,\n version: getCacheVersion(paths),\n keyPrefixes,\n }\n : {\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n keyPrefixes,\n },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n // It's ok to retry POST caches/download, because we're only retrying signing a download URL.\n retries: 2,\n shouldThrowOnNotOk: true,\n });\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { matchedKey, downloadUrl } = result.value.data;\n\n logger.info(`Matched cache key: ${matchedKey}. Downloading...`);\n\n const downloadDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'restore-cache-')\n );\n\n const downloadResponse = await retryOnDNSFailure(fetch)(downloadUrl);\n if (!downloadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${downloadResponse.status}): ${downloadResponse.statusText}`\n );\n }\n\n // URL may contain percent-encoded characters, e.g. my%20file.apk\n // this replaces all non-alphanumeric characters (excluding dot) with underscore\n const archiveFilename = path\n .basename(new URL(downloadUrl).pathname)\n .replace(/([^a-z0-9.-]+)/gi, '_');\n const archivePath = path.join(downloadDestinationDirectory, archiveFilename);\n\n await streamPipeline(downloadResponse.body, fs.createWriteStream(archivePath));\n\n return { archivePath, matchedKey };\n } catch (err: any) {\n if (err instanceof TurtleFetchError && err.response.status !== 404) {\n const textResult = await asyncResult(err.response.text());\n throw new Error(\n `Unexpected response from server (${err.response.status}): ${textResult.value}`\n );\n }\n throw err;\n }\n}\n\nexport async function decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose,\n logger,\n}: {\n archivePath: string;\n workingDirectory: string;\n verbose: boolean;\n logger: bunyan;\n}): Promise<void> {\n if (verbose) {\n logger.info(`Extracting cache to ${workingDirectory}:`);\n }\n\n // First, extract everything to the working directory\n const fileHandle = await fs.promises.open(archivePath, 'r');\n const extractedFiles: string[] = [];\n\n await streamPipeline(\n fileHandle.createReadStream(),\n tar.extract({\n cwd: workingDirectory,\n onwarn: (code, message, data) => {\n logger.warn({ code, data }, message);\n },\n preservePaths: true,\n onReadEntry: (entry) => {\n extractedFiles.push(entry.path);\n if (verbose) {\n logger.info(`- ${entry.path}`);\n }\n },\n })\n );\n\n // Handle absolute paths that were prefixed with __absolute__\n for (const extractedPath of extractedFiles) {\n if (extractedPath.startsWith('__absolute__/')) {\n const originalAbsolutePath = extractedPath.slice('__absolute__'.length);\n const currentPath = path.join(workingDirectory, extractedPath);\n\n try {\n // Ensure the target directory exists\n await fs.promises.mkdir(path.dirname(originalAbsolutePath), { recursive: true });\n\n // Move the file to its original absolute location\n await fs.promises.rename(currentPath, originalAbsolutePath);\n\n if (verbose) {\n logger.info(`Moved ${extractedPath} to ${originalAbsolutePath}`);\n }\n } catch (error) {\n logger.warn(`Failed to restore absolute path ${originalAbsolutePath}: ${error}`);\n }\n }\n }\n\n // Clean up any remaining __absolute__ directories\n const absoluteDir = path.join(workingDirectory, '__absolute__');\n if (\n await fs.promises\n .access(absoluteDir)\n .then(() => true)\n .catch(() => false)\n ) {\n await fs.promises.rm(absoluteDir, { recursive: true, force: true });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"restoreCache.js","sourceRoot":"","sources":["../../../src/steps/functions/restoreCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport stream from 'stream';\nimport { promisify } from 'util';\n\nimport * as tar from 'tar';\nimport { bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\nimport z from 'zod';\nimport nullthrows from 'nullthrows';\nimport fetch from 'node-fetch';\nimport { asyncResult } from '@expo/results';\nimport { Platform } from '@expo/eas-build-job';\n\nimport { retryOnDNSFailure } from '../../utils/retryOnDNSFailure';\nimport { formatBytes } from '../../utils/artifacts';\nimport { getCacheVersion } from '../utils/cache';\nimport { turtleFetch, TurtleFetchError } from '../../utils/turtleFetch';\nimport { PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM } from '../../utils/cacheKey';\n\nconst streamPipeline = promisify(stream.pipeline);\n\nexport function createRestoreCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'restore_cache',\n name: 'Restore Cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'path',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'restore_keys',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'cache_hit',\n required: false,\n }),\n ],\n fn: async (stepsCtx, { env, inputs, outputs }) => {\n const { logger } = stepsCtx;\n\n try {\n if (stepsCtx.global.staticContext.job.platform) {\n logger.error('Caches are not supported in build jobs yet.');\n return;\n }\n\n const paths = z\n .array(z.string())\n .parse(((inputs.path.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((path) => path.length > 0);\n const key = z.string().parse(inputs.key.value);\n const restoreKeys = z\n .array(z.string())\n .parse(((inputs.restore_keys.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((key) => key !== '');\n\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n stepsCtx.global.staticContext.job.secrets?.robotAccessToken,\n 'robotAccessToken is not set'\n );\n\n const { archivePath, matchedKey } = await downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n keyPrefixes: restoreKeys,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n logger.info(`Downloaded cache archive from ${archivePath} (${formatBytes(size)}).`);\n\n await decompressCacheAsync({\n archivePath,\n workingDirectory: stepsCtx.workingDirectory,\n verbose: true,\n logger,\n });\n\n outputs.cache_hit.set(`${matchedKey === key}`);\n } catch (error) {\n logger.error({ err: error }, 'Failed to restore cache');\n }\n },\n });\n}\n\nexport async function downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n keyPrefixes,\n platform,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n keyPrefixes: string[];\n platform: Platform | undefined;\n}): Promise<{ archivePath: string; matchedKey: string }> {\n const routerURL = platform ? 'v2/turtle-builds/caches/download' : 'v2/turtle-caches/download';\n\n try {\n const response = await turtleFetch(new URL(routerURL, expoApiServerURL).toString(), 'POST', {\n json: platform\n ? {\n buildId: jobId,\n key,\n version: getCacheVersion(paths),\n keyPrefixes,\n }\n : {\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n keyPrefixes,\n },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n // It's ok to retry POST caches/download, because we're only retrying signing a download URL.\n retries: 2,\n shouldThrowOnNotOk: true,\n });\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { matchedKey, downloadUrl } = result.value.data;\n\n logger.info(`Matched cache key: ${matchedKey}. Downloading...`);\n\n const downloadDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'restore-cache-')\n );\n\n const downloadResponse = await retryOnDNSFailure(fetch)(downloadUrl);\n if (!downloadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${downloadResponse.status}): ${downloadResponse.statusText}`\n );\n }\n\n // URL may contain percent-encoded characters, e.g. my%20file.apk\n // this replaces all non-alphanumeric characters (excluding dot) with underscore\n const archiveFilename = path\n .basename(new URL(downloadUrl).pathname)\n .replace(/([^a-z0-9.-]+)/gi, '_');\n const archivePath = path.join(downloadDestinationDirectory, archiveFilename);\n\n await streamPipeline(downloadResponse.body, fs.createWriteStream(archivePath));\n\n return { archivePath, matchedKey };\n } catch (err: any) {\n if (err instanceof TurtleFetchError && err.response.status !== 404) {\n const textResult = await asyncResult(err.response.text());\n throw new Error(\n `Unexpected response from server (${err.response.status}): ${textResult.value}`\n );\n }\n throw err;\n }\n}\n\nexport async function downloadPublicCacheAsync({\n logger,\n expoApiServerURL,\n robotAccessToken,\n paths,\n platform,\n}: {\n logger: bunyan;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n platform: Platform;\n}): Promise<{ archivePath: string; matchedKey: string }> {\n const routerURL = 'v2/public-turtle-caches/download';\n const key = PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM[platform];\n\n try {\n const response = await turtleFetch(new URL(routerURL, expoApiServerURL).toString(), 'POST', {\n json: {\n key,\n version: getCacheVersion(paths),\n keyPrefixes: [key],\n },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n retries: 2,\n shouldThrowOnNotOk: true,\n });\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { matchedKey, downloadUrl } = result.value.data;\n\n logger.info(`Matched public cache key: ${matchedKey}. Downloading...`);\n\n const downloadDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'restore-cache-')\n );\n\n const downloadResponse = await retryOnDNSFailure(fetch)(downloadUrl);\n if (!downloadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${downloadResponse.status}): ${downloadResponse.statusText}`\n );\n }\n\n const archiveFilename = path\n .basename(new URL(downloadUrl).pathname)\n .replace(/([^a-z0-9.-]+)/gi, '_');\n const archivePath = path.join(downloadDestinationDirectory, archiveFilename);\n\n await streamPipeline(downloadResponse.body, fs.createWriteStream(archivePath));\n\n return { archivePath, matchedKey };\n } catch (err: any) {\n if (err instanceof TurtleFetchError && err.response.status !== 404) {\n const textResult = await asyncResult(err.response.text());\n throw new Error(\n `Unexpected response from server (${err.response.status}): ${textResult.value}`\n );\n }\n throw err;\n }\n}\n\nexport async function decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose,\n logger,\n}: {\n archivePath: string;\n workingDirectory: string;\n verbose: boolean;\n logger: bunyan;\n}): Promise<void> {\n if (verbose) {\n logger.info(`Extracting cache to ${workingDirectory}:`);\n }\n\n // First, extract everything to the working directory\n const fileHandle = await fs.promises.open(archivePath, 'r');\n const extractedFiles: string[] = [];\n\n await streamPipeline(\n fileHandle.createReadStream(),\n tar.extract({\n cwd: workingDirectory,\n onwarn: (code, message, data) => {\n logger.warn({ code, data }, message);\n },\n preservePaths: true,\n onReadEntry: (entry) => {\n extractedFiles.push(entry.path);\n if (verbose) {\n logger.info(`- ${entry.path}`);\n }\n },\n })\n );\n\n // Handle absolute paths that were prefixed with __absolute__\n for (const extractedPath of extractedFiles) {\n if (extractedPath.startsWith('__absolute__/')) {\n const originalAbsolutePath = extractedPath.slice('__absolute__'.length);\n const currentPath = path.join(workingDirectory, extractedPath);\n\n try {\n // Ensure the target directory exists\n await fs.promises.mkdir(path.dirname(originalAbsolutePath), { recursive: true });\n\n // Move the file to its original absolute location\n await fs.promises.rename(currentPath, originalAbsolutePath);\n\n if (verbose) {\n logger.info(`Moved ${extractedPath} to ${originalAbsolutePath}`);\n }\n } catch (error) {\n logger.warn(`Failed to restore absolute path ${originalAbsolutePath}: ${error}`);\n }\n }\n }\n\n // Clean up any remaining __absolute__ directories\n const absoluteDir = path.join(workingDirectory, '__absolute__');\n if (\n await fs.promises\n .access(absoluteDir)\n .then(() => true)\n .catch(() => false)\n ) {\n await fs.promises.rm(absoluteDir, { recursive: true, force: true });\n }\n}\n"]}
|
|
@@ -64,12 +64,6 @@ async function saveCcacheAsync({ logger, workingDirectory, platform, evictUsedBe
|
|
|
64
64
|
logger,
|
|
65
65
|
stdio: 'pipe',
|
|
66
66
|
}));
|
|
67
|
-
logger.info('Cache stats:');
|
|
68
|
-
await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--show-stats', '-v'], {
|
|
69
|
-
env,
|
|
70
|
-
logger,
|
|
71
|
-
stdio: 'pipe',
|
|
72
|
-
}));
|
|
73
67
|
logger.info('Preparing cache archive...');
|
|
74
68
|
const { archivePath } = await (0, saveCache_1.compressCacheAsync)({
|
|
75
69
|
paths: [cachePath],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveBuildCache.js","sourceRoot":"","sources":["../../../src/steps/functions/saveBuildCache.ts"],"names":[],"mappings":";;;;;AAiBA,oEAkCC;AAED,
|
|
1
|
+
{"version":3,"file":"saveBuildCache.js","sourceRoot":"","sources":["../../../src/steps/functions/saveBuildCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\n\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport { Platform } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\n\nimport { generateDefaultBuildCacheKeyAsync, getCcachePath } from '../../utils/cacheKey';\n\nimport { compressCacheAsync, uploadCacheAsync } from './saveCache';\n\nexport function createSaveBuildCacheFunction(evictUsedBefore: Date): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'save_build_cache',\n name: 'Save Cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'platform',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepCtx, { env, inputs }) => {\n const { logger } = stepCtx;\n const workingDirectory = stepCtx.workingDirectory;\n const platform =\n (inputs.platform.value as Platform | undefined) ??\n stepCtx.global.staticContext.job.platform;\n if (!platform || ![Platform.ANDROID, Platform.IOS].includes(platform)) {\n throw new Error(\n `Unsupported platform: ${platform}. Platform must be \"${Platform.ANDROID}\" or \"${Platform.IOS}\"`\n );\n }\n\n await saveCcacheAsync({\n logger,\n workingDirectory,\n platform,\n evictUsedBefore,\n env,\n secrets: stepCtx.global.staticContext.job.secrets,\n });\n },\n });\n}\n\nexport async function saveCcacheAsync({\n logger,\n workingDirectory,\n platform,\n evictUsedBefore,\n env,\n secrets,\n}: {\n logger: bunyan;\n workingDirectory: string;\n platform: Platform;\n evictUsedBefore: Date;\n env: Record<string, string | undefined>;\n secrets?: { robotAccessToken?: string };\n}): Promise<void> {\n const enabled =\n env.EAS_SAVE_CACHE === '1' || (env.EAS_USE_CACHE === '1' && env.EAS_SAVE_CACHE !== '0');\n\n if (!enabled) {\n return;\n }\n\n try {\n const cacheKey = await generateDefaultBuildCacheKeyAsync(workingDirectory, platform);\n logger.info(`Saving cache key: ${cacheKey}`);\n\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n secrets?.robotAccessToken,\n 'Robot access token is required for cache operations'\n );\n const expoApiServerURL = nullthrows(env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const cachePath = getCcachePath(env);\n\n // Cache size can blow up over time over many builds, so evict stale files\n // and only upload what was used within this build's time window\n const evictWindow = Math.floor((Date.now() - evictUsedBefore.getTime()) / 1000);\n logger.info('Pruning cache...');\n await asyncResult(\n spawnAsync('ccache', ['--evict-older-than', evictWindow + 's'], {\n env,\n logger,\n stdio: 'pipe',\n })\n );\n\n logger.info('Preparing cache archive...');\n\n const { archivePath } = await compressCacheAsync({\n paths: [cachePath],\n workingDirectory,\n verbose: env.EXPO_DEBUG === '1',\n logger,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n\n await uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n archivePath,\n key: cacheKey,\n paths: [cachePath],\n size,\n platform,\n });\n } catch (err) {\n logger.error({ err }, 'Failed to save cache');\n }\n}\n"]}
|
|
@@ -13,6 +13,17 @@ export declare function uploadCacheAsync({ logger, jobId, expoApiServerURL, robo
|
|
|
13
13
|
size: number;
|
|
14
14
|
platform: Platform | undefined;
|
|
15
15
|
}): Promise<void>;
|
|
16
|
+
export declare function uploadPublicCacheAsync({ logger, jobId, expoApiServerURL, robotAccessToken, paths, key, archivePath, size, }: {
|
|
17
|
+
logger: bunyan;
|
|
18
|
+
jobId: string;
|
|
19
|
+
expoApiServerURL: string;
|
|
20
|
+
robotAccessToken: string;
|
|
21
|
+
paths: string[];
|
|
22
|
+
key: string;
|
|
23
|
+
archivePath: string;
|
|
24
|
+
size: number;
|
|
25
|
+
platform: Platform | undefined;
|
|
26
|
+
}): Promise<void>;
|
|
16
27
|
export declare function compressCacheAsync({ paths, workingDirectory, verbose, logger, }: {
|
|
17
28
|
paths: string[];
|
|
18
29
|
workingDirectory: string;
|
|
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.createSaveCacheFunction = createSaveCacheFunction;
|
|
30
30
|
exports.uploadCacheAsync = uploadCacheAsync;
|
|
31
|
+
exports.uploadPublicCacheAsync = uploadPublicCacheAsync;
|
|
31
32
|
exports.compressCacheAsync = compressCacheAsync;
|
|
32
33
|
const fs_1 = __importDefault(require("fs"));
|
|
33
34
|
const os_1 = __importDefault(require("os"));
|
|
@@ -77,17 +78,32 @@ function createSaveCacheFunction() {
|
|
|
77
78
|
logger,
|
|
78
79
|
});
|
|
79
80
|
const { size } = await fs_1.default.promises.stat(archivePath);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
81
|
+
if (env.EAS_PUBLIC_CACHE === '1') {
|
|
82
|
+
await uploadPublicCacheAsync({
|
|
83
|
+
logger,
|
|
84
|
+
jobId,
|
|
85
|
+
expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,
|
|
86
|
+
robotAccessToken,
|
|
87
|
+
archivePath,
|
|
88
|
+
key,
|
|
89
|
+
paths,
|
|
90
|
+
size,
|
|
91
|
+
platform: stepsCtx.global.staticContext.job.platform,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
await uploadCacheAsync({
|
|
96
|
+
logger,
|
|
97
|
+
jobId,
|
|
98
|
+
expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,
|
|
99
|
+
robotAccessToken,
|
|
100
|
+
archivePath,
|
|
101
|
+
key,
|
|
102
|
+
paths,
|
|
103
|
+
size,
|
|
104
|
+
platform: stepsCtx.global.staticContext.job.platform,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
91
107
|
}
|
|
92
108
|
catch (error) {
|
|
93
109
|
logger.error({ err: error }, 'Failed to create cache');
|
|
@@ -144,6 +160,45 @@ async function uploadCacheAsync({ logger, jobId, expoApiServerURL, robotAccessTo
|
|
|
144
160
|
}
|
|
145
161
|
logger.info(`Uploaded cache archive to ${archivePath} (${(0, artifacts_1.formatBytes)(size)}).`);
|
|
146
162
|
}
|
|
163
|
+
async function uploadPublicCacheAsync({ logger, jobId, expoApiServerURL, robotAccessToken, paths, key, archivePath, size, }) {
|
|
164
|
+
const routerPath = 'v2/public-turtle-caches/upload-sessions';
|
|
165
|
+
const response = await (0, retryOnDNSFailure_1.retryOnDNSFailure)(node_fetch_1.default)(new URL(routerPath, expoApiServerURL), {
|
|
166
|
+
method: 'POST',
|
|
167
|
+
body: JSON.stringify({
|
|
168
|
+
jobRunId: jobId,
|
|
169
|
+
key,
|
|
170
|
+
version: (0, cache_1.getCacheVersion)(paths),
|
|
171
|
+
size,
|
|
172
|
+
}),
|
|
173
|
+
headers: {
|
|
174
|
+
Authorization: `Bearer ${robotAccessToken}`,
|
|
175
|
+
'Content-Type': 'application/json',
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
if (response.status === 409) {
|
|
180
|
+
logger.info(`Cache ${key} already exists, skipping upload`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const textResult = await (0, results_1.asyncResult)(response.text());
|
|
184
|
+
throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);
|
|
185
|
+
}
|
|
186
|
+
const result = await (0, results_1.asyncResult)(response.json());
|
|
187
|
+
if (!result.ok) {
|
|
188
|
+
throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);
|
|
189
|
+
}
|
|
190
|
+
const { url, headers } = result.value.data;
|
|
191
|
+
logger.info(`Uploading public cache...`);
|
|
192
|
+
const uploadResponse = await (0, retryOnDNSFailure_1.retryOnDNSFailure)(node_fetch_1.default)(new URL(url), {
|
|
193
|
+
method: 'PUT',
|
|
194
|
+
headers,
|
|
195
|
+
body: fs_1.default.createReadStream(archivePath),
|
|
196
|
+
});
|
|
197
|
+
if (!uploadResponse.ok) {
|
|
198
|
+
throw new Error(`Unexpected response from cache server (${uploadResponse.status}): ${uploadResponse.statusText}`);
|
|
199
|
+
}
|
|
200
|
+
logger.info(`Uploaded cache archive to ${archivePath} (${(0, artifacts_1.formatBytes)(size)}).`);
|
|
201
|
+
}
|
|
147
202
|
async function compressCacheAsync({ paths, workingDirectory, verbose, logger, }) {
|
|
148
203
|
const archiveDestinationDirectory = await fs_1.default.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'save-cache-'));
|
|
149
204
|
// Process and normalize all paths
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveCache.js","sourceRoot":"","sources":["../../../src/steps/functions/saveCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport * as tar from 'tar';\nimport fg from 'fast-glob';\nimport { bunyan } from '@expo/logger';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport z from 'zod';\nimport nullthrows from 'nullthrows';\nimport fetch from 'node-fetch';\nimport { asyncResult } from '@expo/results';\nimport { Platform } from '@expo/eas-build-job';\n\nimport { retryOnDNSFailure } from '../../utils/retryOnDNSFailure';\nimport { formatBytes } from '../../utils/artifacts';\nimport { getCacheVersion } from '../utils/cache';\n\nexport function createSaveCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'save_cache',\n name: 'Save Cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'path',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepsCtx, { env, inputs }) => {\n const { logger } = stepsCtx;\n\n try {\n const paths = z\n .array(z.string())\n .parse(((inputs.path.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((path) => path.length > 0);\n const key = z.string().parse(inputs.key.value);\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n stepsCtx.global.staticContext.job.secrets?.robotAccessToken,\n 'robotAccessToken is not set'\n );\n\n const { archivePath } = await compressCacheAsync({\n paths,\n workingDirectory: stepsCtx.workingDirectory,\n verbose: true,\n logger,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n\n await uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n archivePath,\n key,\n paths,\n size,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n } catch (error) {\n logger.error({ err: error }, 'Failed to create cache');\n }\n },\n });\n}\n\nexport async function uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n archivePath,\n size,\n platform,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n archivePath: string;\n size: number;\n platform: Platform | undefined;\n}): Promise<void> {\n const routerURL = platform\n ? 'v2/turtle-builds/caches/upload-sessions'\n : 'v2/turtle-caches/upload-sessions';\n\n // attempts to upload should only attempt on DNS errors, and not application errors such as 409 (cache exists)\n const response = await retryOnDNSFailure(fetch)(new URL(routerURL, expoApiServerURL), {\n method: 'POST',\n body: platform\n ? JSON.stringify({\n buildId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n })\n : JSON.stringify({\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n }),\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n if (response.status === 409) {\n logger.info(`Cache already exists, skipping upload`);\n return;\n }\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { url, headers } = result.value.data;\n\n logger.info(`Uploading cache...`);\n\n const uploadResponse = await retryOnDNSFailure(fetch)(new URL(url), {\n method: 'PUT',\n headers,\n body: fs.createReadStream(archivePath),\n });\n if (!uploadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${uploadResponse.status}): ${uploadResponse.statusText}`\n );\n }\n logger.info(`Uploaded cache archive to ${archivePath} (${formatBytes(size)}).`);\n}\n\nexport async function compressCacheAsync({\n paths,\n workingDirectory,\n verbose,\n logger,\n}: {\n paths: string[];\n workingDirectory: string;\n verbose: boolean;\n logger: bunyan;\n}): Promise<{ archivePath: string }> {\n const archiveDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'save-cache-')\n );\n\n // Process and normalize all paths\n const allFiles: { absolutePath: string; archivePath: string }[] = [];\n\n for (const inputPath of paths) {\n // Resolve to absolute path\n const absolutePath = path.isAbsolute(inputPath)\n ? inputPath\n : path.resolve(workingDirectory, inputPath);\n\n try {\n const stat = await fs.promises.stat(absolutePath);\n\n if (stat.isDirectory()) {\n // For directories, get all files recursively\n const pattern = fg.isDynamicPattern(inputPath) ? inputPath : `${absolutePath}/**`;\n const dirFiles = await fg(pattern, {\n absolute: true,\n onlyFiles: true,\n cwd: fg.isDynamicPattern(inputPath) ? workingDirectory : undefined,\n });\n\n for (const filePath of dirFiles) {\n // Calculate the archive path\n let archivePath: string;\n\n if (path.isAbsolute(inputPath)) {\n // For absolute input paths, check if they're within workingDirectory\n const relativeToWorkdir = path.relative(workingDirectory, filePath);\n if (!relativeToWorkdir.startsWith('..') && !path.isAbsolute(relativeToWorkdir)) {\n // File is within working directory - use relative path\n archivePath = relativeToWorkdir;\n } else {\n // File is outside working directory - preserve relative structure from original path\n const relativeToInput = path.relative(absolutePath, filePath);\n archivePath = path.posix.join('__absolute__' + inputPath, relativeToInput);\n }\n } else {\n // For relative input paths, maintain relative structure\n archivePath = path.relative(workingDirectory, filePath);\n }\n\n allFiles.push({ absolutePath: filePath, archivePath });\n }\n } else {\n // Single file\n let archivePath: string;\n\n if (path.isAbsolute(inputPath)) {\n const relativeToWorkdir = path.relative(workingDirectory, absolutePath);\n if (!relativeToWorkdir.startsWith('..') && !path.isAbsolute(relativeToWorkdir)) {\n archivePath = relativeToWorkdir;\n } else {\n archivePath = '__absolute__' + inputPath;\n }\n } else {\n archivePath = inputPath;\n }\n\n allFiles.push({ absolutePath, archivePath });\n }\n } catch (error) {\n logger.warn({ error }, 'Failed to resolve paths');\n // Handle glob patterns\n if (fg.isDynamicPattern(inputPath)) {\n const globFiles = await fg(inputPath, {\n absolute: true,\n cwd: workingDirectory,\n onlyFiles: true,\n });\n\n for (const filePath of globFiles) {\n const archivePath = path.relative(workingDirectory, filePath);\n allFiles.push({ absolutePath: filePath, archivePath });\n }\n } else {\n throw new Error(`Path does not exist: ${inputPath}`);\n }\n }\n }\n\n if (allFiles.length === 0) {\n throw new Error('No files found to cache');\n }\n\n const archivePath = path.join(archiveDestinationDirectory, 'cache.tar.gz');\n\n if (verbose) {\n logger.info(`Compressing cache with ${allFiles.length} files:`);\n }\n\n // Create a temporary directory with the correct structure\n const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'cache-temp-'));\n\n try {\n // Copy all files to temp directory maintaining archive structure\n for (const { absolutePath, archivePath: targetRelativePath } of allFiles) {\n const targetPath = path.join(tempDir, targetRelativePath);\n await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.promises.copyFile(absolutePath, targetPath);\n\n if (verbose) {\n logger.info(`- ${targetRelativePath}`);\n }\n }\n\n // Create tar archive from the structured temp directory\n await tar.c(\n {\n gzip: true,\n file: archivePath,\n cwd: tempDir,\n },\n allFiles.map(({ archivePath: targetPath }) => targetPath)\n );\n } finally {\n await fs.promises.rm(tempDir, { recursive: true, force: true });\n }\n\n return { archivePath };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"saveCache.js","sourceRoot":"","sources":["../../../src/steps/functions/saveCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport * as tar from 'tar';\nimport fg from 'fast-glob';\nimport { bunyan } from '@expo/logger';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport z from 'zod';\nimport nullthrows from 'nullthrows';\nimport fetch from 'node-fetch';\nimport { asyncResult } from '@expo/results';\nimport { Platform } from '@expo/eas-build-job';\n\nimport { retryOnDNSFailure } from '../../utils/retryOnDNSFailure';\nimport { formatBytes } from '../../utils/artifacts';\nimport { getCacheVersion } from '../utils/cache';\n\nexport function createSaveCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'save_cache',\n name: 'Save Cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'path',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepsCtx, { env, inputs }) => {\n const { logger } = stepsCtx;\n\n try {\n const paths = z\n .array(z.string())\n .parse(((inputs.path.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((path) => path.length > 0);\n const key = z.string().parse(inputs.key.value);\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n stepsCtx.global.staticContext.job.secrets?.robotAccessToken,\n 'robotAccessToken is not set'\n );\n\n const { archivePath } = await compressCacheAsync({\n paths,\n workingDirectory: stepsCtx.workingDirectory,\n verbose: true,\n logger,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n\n if (env.EAS_PUBLIC_CACHE === '1') {\n await uploadPublicCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n archivePath,\n key,\n paths,\n size,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n } else {\n await uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n archivePath,\n key,\n paths,\n size,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n }\n } catch (error) {\n logger.error({ err: error }, 'Failed to create cache');\n }\n },\n });\n}\n\nexport async function uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n archivePath,\n size,\n platform,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n archivePath: string;\n size: number;\n platform: Platform | undefined;\n}): Promise<void> {\n const routerURL = platform\n ? 'v2/turtle-builds/caches/upload-sessions'\n : 'v2/turtle-caches/upload-sessions';\n\n // attempts to upload should only attempt on DNS errors, and not application errors such as 409 (cache exists)\n const response = await retryOnDNSFailure(fetch)(new URL(routerURL, expoApiServerURL), {\n method: 'POST',\n body: platform\n ? JSON.stringify({\n buildId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n })\n : JSON.stringify({\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n }),\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n if (response.status === 409) {\n logger.info(`Cache already exists, skipping upload`);\n return;\n }\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { url, headers } = result.value.data;\n\n logger.info(`Uploading cache...`);\n\n const uploadResponse = await retryOnDNSFailure(fetch)(new URL(url), {\n method: 'PUT',\n headers,\n body: fs.createReadStream(archivePath),\n });\n if (!uploadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${uploadResponse.status}): ${uploadResponse.statusText}`\n );\n }\n logger.info(`Uploaded cache archive to ${archivePath} (${formatBytes(size)}).`);\n}\n\nexport async function uploadPublicCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n archivePath,\n size,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n archivePath: string;\n size: number;\n platform: Platform | undefined;\n}): Promise<void> {\n const routerPath = 'v2/public-turtle-caches/upload-sessions';\n const response = await retryOnDNSFailure(fetch)(new URL(routerPath, expoApiServerURL), {\n method: 'POST',\n body: JSON.stringify({\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n }),\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n if (response.status === 409) {\n logger.info(`Cache ${key} already exists, skipping upload`);\n return;\n }\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { url, headers } = result.value.data;\n\n logger.info(`Uploading public cache...`);\n\n const uploadResponse = await retryOnDNSFailure(fetch)(new URL(url), {\n method: 'PUT',\n headers,\n body: fs.createReadStream(archivePath),\n });\n if (!uploadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${uploadResponse.status}): ${uploadResponse.statusText}`\n );\n }\n logger.info(`Uploaded cache archive to ${archivePath} (${formatBytes(size)}).`);\n}\n\nexport async function compressCacheAsync({\n paths,\n workingDirectory,\n verbose,\n logger,\n}: {\n paths: string[];\n workingDirectory: string;\n verbose: boolean;\n logger: bunyan;\n}): Promise<{ archivePath: string }> {\n const archiveDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'save-cache-')\n );\n\n // Process and normalize all paths\n const allFiles: { absolutePath: string; archivePath: string }[] = [];\n\n for (const inputPath of paths) {\n // Resolve to absolute path\n const absolutePath = path.isAbsolute(inputPath)\n ? inputPath\n : path.resolve(workingDirectory, inputPath);\n\n try {\n const stat = await fs.promises.stat(absolutePath);\n\n if (stat.isDirectory()) {\n // For directories, get all files recursively\n const pattern = fg.isDynamicPattern(inputPath) ? inputPath : `${absolutePath}/**`;\n const dirFiles = await fg(pattern, {\n absolute: true,\n onlyFiles: true,\n cwd: fg.isDynamicPattern(inputPath) ? workingDirectory : undefined,\n });\n\n for (const filePath of dirFiles) {\n // Calculate the archive path\n let archivePath: string;\n\n if (path.isAbsolute(inputPath)) {\n // For absolute input paths, check if they're within workingDirectory\n const relativeToWorkdir = path.relative(workingDirectory, filePath);\n if (!relativeToWorkdir.startsWith('..') && !path.isAbsolute(relativeToWorkdir)) {\n // File is within working directory - use relative path\n archivePath = relativeToWorkdir;\n } else {\n // File is outside working directory - preserve relative structure from original path\n const relativeToInput = path.relative(absolutePath, filePath);\n archivePath = path.posix.join('__absolute__' + inputPath, relativeToInput);\n }\n } else {\n // For relative input paths, maintain relative structure\n archivePath = path.relative(workingDirectory, filePath);\n }\n\n allFiles.push({ absolutePath: filePath, archivePath });\n }\n } else {\n // Single file\n let archivePath: string;\n\n if (path.isAbsolute(inputPath)) {\n const relativeToWorkdir = path.relative(workingDirectory, absolutePath);\n if (!relativeToWorkdir.startsWith('..') && !path.isAbsolute(relativeToWorkdir)) {\n archivePath = relativeToWorkdir;\n } else {\n archivePath = '__absolute__' + inputPath;\n }\n } else {\n archivePath = inputPath;\n }\n\n allFiles.push({ absolutePath, archivePath });\n }\n } catch (error) {\n logger.warn({ error }, 'Failed to resolve paths');\n // Handle glob patterns\n if (fg.isDynamicPattern(inputPath)) {\n const globFiles = await fg(inputPath, {\n absolute: true,\n cwd: workingDirectory,\n onlyFiles: true,\n });\n\n for (const filePath of globFiles) {\n const archivePath = path.relative(workingDirectory, filePath);\n allFiles.push({ absolutePath: filePath, archivePath });\n }\n } else {\n throw new Error(`Path does not exist: ${inputPath}`);\n }\n }\n }\n\n if (allFiles.length === 0) {\n throw new Error('No files found to cache');\n }\n\n const archivePath = path.join(archiveDestinationDirectory, 'cache.tar.gz');\n\n if (verbose) {\n logger.info(`Compressing cache with ${allFiles.length} files:`);\n }\n\n // Create a temporary directory with the correct structure\n const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'cache-temp-'));\n\n try {\n // Copy all files to temp directory maintaining archive structure\n for (const { absolutePath, archivePath: targetRelativePath } of allFiles) {\n const targetPath = path.join(tempDir, targetRelativePath);\n await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.promises.copyFile(absolutePath, targetPath);\n\n if (verbose) {\n logger.info(`- ${targetRelativePath}`);\n }\n }\n\n // Create tar archive from the structured temp directory\n await tar.c(\n {\n gzip: true,\n file: archivePath,\n cwd: tempDir,\n },\n allFiles.map(({ archivePath: targetPath }) => targetPath)\n );\n } finally {\n await fs.promises.rm(tempDir, { recursive: true, force: true });\n }\n\n return { archivePath };\n}\n"]}
|
package/dist/utils/cacheKey.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { Platform } from '@expo/eas-build-job';
|
|
2
|
-
export declare const IOS_CACHE_KEY_PREFIX = "ios-ccache-";
|
|
3
|
-
export declare const ANDROID_CACHE_KEY_PREFIX = "android-ccache-";
|
|
4
|
-
export declare const DARWIN_CACHE_PATH = "Library/Caches/ccache";
|
|
5
|
-
export declare const LINUX_CACHE_PATH = ".cache/ccache";
|
|
6
2
|
export declare const CACHE_KEY_PREFIX_BY_PLATFORM: Record<Platform, string>;
|
|
3
|
+
export declare const PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM: Record<Platform, string>;
|
|
7
4
|
export declare function getCcachePath(env: Record<string, string | undefined>): string;
|
|
8
5
|
export declare function generateDefaultBuildCacheKeyAsync(workingDirectory: string, platform: Platform): Promise<string>;
|
package/dist/utils/cacheKey.js
CHANGED
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
29
|
+
exports.PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM = exports.CACHE_KEY_PREFIX_BY_PLATFORM = void 0;
|
|
30
30
|
exports.getCcachePath = getCcachePath;
|
|
31
31
|
exports.generateDefaultBuildCacheKeyAsync = generateDefaultBuildCacheKeyAsync;
|
|
32
32
|
const path_1 = __importDefault(require("path"));
|
|
@@ -36,17 +36,23 @@ const PackageManagerUtils = __importStar(require("@expo/package-manager"));
|
|
|
36
36
|
const steps_1 = require("@expo/steps");
|
|
37
37
|
const eas_build_job_1 = require("@expo/eas-build-job");
|
|
38
38
|
const packageManager_1 = require("./packageManager");
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
const IOS_CACHE_KEY_PREFIX = 'ios-ccache-';
|
|
40
|
+
const ANDROID_CACHE_KEY_PREFIX = 'android-ccache-';
|
|
41
|
+
const PUBLIC_IOS_CACHE_KEY_PREFIX = 'public-ios-ccache-';
|
|
42
|
+
const PUBLIC_ANDROID_CACHE_KEY_PREFIX = 'public-android-ccache-';
|
|
43
|
+
const DARWIN_CACHE_PATH = 'Library/Caches/ccache';
|
|
44
|
+
const LINUX_CACHE_PATH = '.cache/ccache';
|
|
43
45
|
exports.CACHE_KEY_PREFIX_BY_PLATFORM = {
|
|
44
|
-
[eas_build_job_1.Platform.ANDROID]:
|
|
45
|
-
[eas_build_job_1.Platform.IOS]:
|
|
46
|
+
[eas_build_job_1.Platform.ANDROID]: ANDROID_CACHE_KEY_PREFIX,
|
|
47
|
+
[eas_build_job_1.Platform.IOS]: IOS_CACHE_KEY_PREFIX,
|
|
48
|
+
};
|
|
49
|
+
exports.PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM = {
|
|
50
|
+
[eas_build_job_1.Platform.ANDROID]: PUBLIC_ANDROID_CACHE_KEY_PREFIX,
|
|
51
|
+
[eas_build_job_1.Platform.IOS]: PUBLIC_IOS_CACHE_KEY_PREFIX,
|
|
46
52
|
};
|
|
47
53
|
const PATH_BY_PLATFORM = {
|
|
48
|
-
darwin:
|
|
49
|
-
linux:
|
|
54
|
+
darwin: DARWIN_CACHE_PATH,
|
|
55
|
+
linux: LINUX_CACHE_PATH,
|
|
50
56
|
};
|
|
51
57
|
function getCcachePath(env) {
|
|
52
58
|
(0, assert_1.default)(env.HOME, 'Failed to infer directory: $HOME environment variable is empty.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheKey.js","sourceRoot":"","sources":["../../src/utils/cacheKey.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cacheKey.js","sourceRoot":"","sources":["../../src/utils/cacheKey.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,sCAGC;AAED,8EAeC;AApDD,gDAAwB;AACxB,4CAAoB;AACpB,oDAA4B;AAE5B,2EAA6D;AAC7D,uCAAwC;AACxC,uDAA+C;AAE/C,qDAAuD;AAEvD,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAC3C,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AACnD,MAAM,2BAA2B,GAAG,oBAAoB,CAAC;AACzD,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACjE,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAE5B,QAAA,4BAA4B,GAA6B;IACpE,CAAC,wBAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB;IAC5C,CAAC,wBAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB;CACrC,CAAC;AAEW,QAAA,mCAAmC,GAA6B;IAC3E,CAAC,wBAAQ,CAAC,OAAO,CAAC,EAAE,+BAA+B;IACnD,CAAC,wBAAQ,CAAC,GAAG,CAAC,EAAE,2BAA2B;CAC5C,CAAC;AAEF,MAAM,gBAAgB,GAA2B;IAC/C,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,gBAAgB;CACxB,CAAC;AAEF,SAAgB,aAAa,CAAC,GAAuC;IACnE,IAAA,gBAAM,EAAC,GAAG,CAAC,IAAI,EAAE,iEAAiE,CAAC,CAAC;IACpF,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,YAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAEM,KAAK,UAAU,iCAAiC,CACrD,gBAAwB,EACxB,QAAkB;IAElB,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,cAAc,GAAG,IAAA,oCAAmB,EAAC,gBAAgB,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,OAAO,GAAG,oCAA4B,CAAC,QAAQ,CAAC,GAAG,IAAA,iBAAS,EAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC7E,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,qDAAqD,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC","sourcesContent":["import path from 'path';\nimport os from 'os';\nimport assert from 'assert';\n\nimport * as PackageManagerUtils from '@expo/package-manager';\nimport { hashFiles } from '@expo/steps';\nimport { Platform } from '@expo/eas-build-job';\n\nimport { findPackagerRootDir } from './packageManager';\n\nconst IOS_CACHE_KEY_PREFIX = 'ios-ccache-';\nconst ANDROID_CACHE_KEY_PREFIX = 'android-ccache-';\nconst PUBLIC_IOS_CACHE_KEY_PREFIX = 'public-ios-ccache-';\nconst PUBLIC_ANDROID_CACHE_KEY_PREFIX = 'public-android-ccache-';\nconst DARWIN_CACHE_PATH = 'Library/Caches/ccache';\nconst LINUX_CACHE_PATH = '.cache/ccache';\n\nexport const CACHE_KEY_PREFIX_BY_PLATFORM: Record<Platform, string> = {\n [Platform.ANDROID]: ANDROID_CACHE_KEY_PREFIX,\n [Platform.IOS]: IOS_CACHE_KEY_PREFIX,\n};\n\nexport const PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM: Record<Platform, string> = {\n [Platform.ANDROID]: PUBLIC_ANDROID_CACHE_KEY_PREFIX,\n [Platform.IOS]: PUBLIC_IOS_CACHE_KEY_PREFIX,\n};\n\nconst PATH_BY_PLATFORM: Record<string, string> = {\n darwin: DARWIN_CACHE_PATH,\n linux: LINUX_CACHE_PATH,\n};\n\nexport function getCcachePath(env: Record<string, string | undefined>): string {\n assert(env.HOME, 'Failed to infer directory: $HOME environment variable is empty.');\n return path.join(env.HOME, PATH_BY_PLATFORM[os.platform()]);\n}\n\nexport async function generateDefaultBuildCacheKeyAsync(\n workingDirectory: string,\n platform: Platform\n): Promise<string> {\n // This will resolve which package manager and use the relevant lock file\n // The lock file hash is the key and ensures cache is fresh\n const packagerRunDir = findPackagerRootDir(workingDirectory);\n const manager = PackageManagerUtils.createForProject(packagerRunDir);\n const lockPath = path.join(packagerRunDir, manager.lockFile);\n\n try {\n return `${CACHE_KEY_PREFIX_BY_PLATFORM[platform]}${hashFiles([lockPath])}`;\n } catch (err: any) {\n throw new Error(`Failed to read lockfile for cache key generation: ${err.message}`);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/build-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.246",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"jest-integration-watch": "jest --config jest/integration-config.ts --watch",
|
|
23
23
|
"clean": "rm -rf node_modules dist coverage",
|
|
24
24
|
"gql": "gql.tada generate-schema ${API_SERVER_URL:-https://api.expo.dev}/graphql --output ./schema.graphql && gql.tada generate-output",
|
|
25
|
-
"gql:local": "API_SERVER_URL=http://api.expo.test yarn gql"
|
|
25
|
+
"gql:local": "API_SERVER_URL=http://api.expo.test yarn gql",
|
|
26
|
+
"test": "yarn jest-unit"
|
|
26
27
|
},
|
|
27
28
|
"author": "Expo <support@expo.io>",
|
|
28
29
|
"bugs": "https://github.com/expo/eas-build/issues",
|
|
@@ -31,13 +32,13 @@
|
|
|
31
32
|
"@expo/config": "10.0.6",
|
|
32
33
|
"@expo/config-plugins": "9.0.12",
|
|
33
34
|
"@expo/downloader": "1.0.221",
|
|
34
|
-
"@expo/eas-build-job": "1.0.
|
|
35
|
+
"@expo/eas-build-job": "1.0.245",
|
|
35
36
|
"@expo/env": "^0.4.0",
|
|
36
37
|
"@expo/logger": "1.0.221",
|
|
37
38
|
"@expo/package-manager": "1.7.0",
|
|
38
39
|
"@expo/plist": "^0.2.0",
|
|
39
40
|
"@expo/results": "^1.0.0",
|
|
40
|
-
"@expo/steps": "1.0.
|
|
41
|
+
"@expo/steps": "1.0.246",
|
|
41
42
|
"@expo/template-file": "1.0.221",
|
|
42
43
|
"@expo/turtle-spawn": "1.0.221",
|
|
43
44
|
"@expo/xcpretty": "^4.3.1",
|
|
@@ -85,5 +86,5 @@
|
|
|
85
86
|
"node": "20.14.0",
|
|
86
87
|
"yarn": "1.22.21"
|
|
87
88
|
},
|
|
88
|
-
"gitHead": "
|
|
89
|
+
"gitHead": "d15cee0ca6bd65120a4de9f54e80e73fb7d0e343"
|
|
89
90
|
}
|