@expo/build-tools 1.0.243 → 1.0.245

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.
@@ -1,43 +1,14 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
6
  exports.default = androidBuilder;
30
- const crypto_1 = require("crypto");
31
7
  const path_1 = __importDefault(require("path"));
32
8
  const eas_build_job_1 = require("@expo/eas-build-job");
33
- const PackageManagerUtils = __importStar(require("@expo/package-manager"));
34
- const fs_extra_1 = __importDefault(require("fs-extra"));
35
9
  const nullthrows_1 = __importDefault(require("nullthrows"));
36
- const results_1 = require("@expo/results");
37
- const steps_1 = require("@expo/steps");
38
10
  const context_1 = require("../context");
39
11
  const expoUpdates_1 = require("../utils/expoUpdates");
40
- const turtleFetch_1 = require("../utils/turtleFetch");
41
12
  const gradle_1 = require("../android/gradle");
42
13
  const artifacts_1 = require("../utils/artifacts");
43
14
  const hooks_1 = require("../utils/hooks");
@@ -47,12 +18,10 @@ const setup_1 = require("../common/setup");
47
18
  const prebuild_1 = require("../common/prebuild");
48
19
  const prepareBuildExecutable_1 = require("../utils/prepareBuildExecutable");
49
20
  const eagerBundle_1 = require("../common/eagerBundle");
50
- const restoreCache_1 = require("../steps/functions/restoreCache");
51
- const saveCache_1 = require("../steps/functions/saveCache");
52
- const packageManager_1 = require("../utils/packageManager");
21
+ const restoreBuildCache_1 = require("../steps/functions/restoreBuildCache");
22
+ const saveBuildCache_1 = require("../steps/functions/saveBuildCache");
53
23
  const common_1 = require("./common");
54
24
  const custom_1 = require("./custom");
55
- const CACHE_KEY_PREFIX = 'android-ccache-';
56
25
  async function androidBuilder(ctx) {
57
26
  if (ctx.job.mode === eas_build_job_1.BuildMode.BUILD) {
58
27
  await (0, prepareBuildExecutable_1.prepareExecutableAsync)(ctx);
@@ -70,9 +39,8 @@ async function androidBuilder(ctx) {
70
39
  }
71
40
  async function buildAsync(ctx) {
72
41
  await (0, setup_1.setupAsync)(ctx);
73
- const buildStart = Date.now();
42
+ const evictUsedBefore = new Date();
74
43
  const workingDirectory = ctx.getReactNativeProjectDirectory();
75
- const cachePaths = [path_1.default.join(ctx.env.HOME, '.cache/ccache')];
76
44
  const hasNativeCode = ctx.job.type === eas_build_job_1.Workflow.GENERIC;
77
45
  if (hasNativeCode) {
78
46
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.FIX_GRADLEW, async () => {
@@ -91,46 +59,19 @@ async function buildAsync(ctx) {
91
59
  });
92
60
  });
93
61
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.RESTORE_CACHE, async () => {
94
- var _a, _b;
95
- await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.restoreCache(ctx));
96
- if (ctx.shouldRestoreCache) {
97
- try {
98
- const cacheKey = await generateCacheKeyAsync(workingDirectory);
99
- const jobId = (0, nullthrows_1.default)(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');
100
- const robotAccessToken = (0, nullthrows_1.default)((_b = ctx.job.secrets) === null || _b === void 0 ? void 0 : _b.robotAccessToken, 'Robot access token is required for cache operations');
101
- const expoApiServerURL = (0, nullthrows_1.default)(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');
102
- const { archivePath } = await (0, restoreCache_1.downloadCacheAsync)({
103
- logger: ctx.logger,
104
- jobId,
105
- expoApiServerURL,
106
- robotAccessToken,
107
- paths: cachePaths,
108
- key: cacheKey,
109
- keyPrefixes: [CACHE_KEY_PREFIX],
110
- platform: ctx.job.platform,
111
- });
112
- await (0, restoreCache_1.decompressCacheAsync)({
113
- archivePath,
114
- workingDirectory,
115
- verbose: ctx.env.EXPO_DEBUG === '1',
116
- logger: ctx.logger,
117
- });
118
- ctx.logger.info('Cache restored successfully');
119
- await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--zero-stats'], {
120
- env: ctx.env,
121
- logger: ctx.logger,
122
- stdio: 'pipe',
123
- }));
124
- }
125
- catch (err) {
126
- if (err instanceof turtleFetch_1.TurtleFetchError && err.response.status === 404) {
127
- ctx.logger.info('No cache found for this key. Create a cache with function save_cache');
128
- }
129
- else {
130
- ctx.logger.warn({ err }, 'Failed to restore cache');
131
- }
132
- }
62
+ var _a;
63
+ if (ctx.isLocal) {
64
+ ctx.logger.info('Local builds do not support restoring cache');
65
+ return;
133
66
  }
67
+ await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.restoreCache(ctx));
68
+ await (0, restoreBuildCache_1.restoreCcacheAsync)({
69
+ logger: ctx.logger,
70
+ workingDirectory,
71
+ platform: ctx.job.platform,
72
+ env: ctx.env,
73
+ secrets: ctx.job.secrets,
74
+ });
134
75
  });
135
76
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.POST_INSTALL_HOOK, async () => {
136
77
  await (0, hooks_1.runHookIfPresent)(ctx, hooks_1.Hook.POST_INSTALL);
@@ -208,85 +149,26 @@ async function buildAsync(ctx) {
208
149
  });
209
150
  });
210
151
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.SAVE_CACHE, async () => {
211
- var _a, _b;
212
- await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.saveCache(ctx));
213
- if (ctx.shouldSaveCache) {
214
- try {
215
- const cacheKey = await generateCacheKeyAsync(workingDirectory);
216
- const jobId = (0, nullthrows_1.default)(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');
217
- const robotAccessToken = (0, nullthrows_1.default)((_b = ctx.job.secrets) === null || _b === void 0 ? void 0 : _b.robotAccessToken, 'Robot access token is required for cache operations');
218
- const expoApiServerURL = (0, nullthrows_1.default)(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');
219
- // cache size can blow up over time over many builds, so evict stale files and only upload what was used within this builds time window
220
- const evictWindow = Math.floor((Date.now() - buildStart) / 1000);
221
- ctx.logger.info('Pruning cache...');
222
- await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--evict-older-than', evictWindow + 's'], {
223
- env: ctx.env,
224
- logger: ctx.logger,
225
- stdio: 'pipe',
226
- }));
227
- ctx.logger.info('Cache stats:');
228
- await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--show-stats', '-v'], {
229
- env: ctx.env,
230
- logger: ctx.logger,
231
- stdio: 'pipe',
232
- }));
233
- ctx.logger.info('Preparing cache archive...');
234
- const { archivePath } = await (0, saveCache_1.compressCacheAsync)({
235
- paths: cachePaths,
236
- workingDirectory,
237
- verbose: ctx.env.EXPO_DEBUG === '1',
238
- logger: ctx.logger,
239
- });
240
- const { size } = await fs_extra_1.default.stat(archivePath);
241
- await (0, saveCache_1.uploadCacheAsync)({
242
- logger: ctx.logger,
243
- jobId,
244
- expoApiServerURL,
245
- robotAccessToken,
246
- archivePath,
247
- key: cacheKey,
248
- paths: cachePaths,
249
- size,
250
- platform: ctx.job.platform,
251
- });
252
- }
253
- catch (err) {
254
- ctx.logger.error({ err }, 'Failed to save cache');
255
- }
152
+ var _a;
153
+ if (ctx.isLocal) {
154
+ ctx.logger.info('Local builds do not support saving cache.');
155
+ return;
256
156
  }
157
+ await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.saveCache(ctx));
158
+ await (0, saveBuildCache_1.saveCcacheAsync)({
159
+ logger: ctx.logger,
160
+ workingDirectory,
161
+ platform: ctx.job.platform,
162
+ evictUsedBefore,
163
+ env: ctx.env,
164
+ secrets: ctx.job.secrets,
165
+ });
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
+ });
257
172
  });
258
- }
259
- async function generateCacheKeyAsync(workingDirectory) {
260
- // This will resolve which package manager and use the relevant lock file
261
- // The lock file hash is the key and ensures cache is fresh
262
- const packagerRunDir = (0, packageManager_1.findPackagerRootDir)(workingDirectory);
263
- const manager = PackageManagerUtils.createForProject(packagerRunDir);
264
- const lockPath = path_1.default.join(packagerRunDir, manager.lockFile);
265
- try {
266
- const key = await hashFiles([lockPath]);
267
- return `${CACHE_KEY_PREFIX}${key}`;
268
- }
269
- catch (err) {
270
- throw new Error(`Failed to read package files for cache key generation: ${err.message}`);
271
- }
272
- }
273
- async function hashFiles(filePaths) {
274
- const hashes = [];
275
- for (const filePath of filePaths) {
276
- try {
277
- if (await fs_extra_1.default.pathExists(filePath)) {
278
- const fileContent = await fs_extra_1.default.readFile(filePath);
279
- const fileHash = (0, crypto_1.createHash)('sha256')
280
- .update(fileContent)
281
- .digest('hex');
282
- hashes.push(fileHash);
283
- }
284
- }
285
- catch (err) {
286
- throw new Error(`Failed to hash file ${filePath}: ${err.message}`);
287
- }
288
- }
289
- const combinedHashes = hashes.join('');
290
- return (0, crypto_1.createHash)('sha256').update(combinedHashes).digest('hex');
291
173
  }
292
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 { BinaryLike, createHash } from 'crypto';\nimport path from 'path';\n\nimport { Android, BuildMode, BuildPhase, Workflow } from '@expo/eas-build-job';\nimport * as PackageManagerUtils from '@expo/package-manager';\nimport fs from 'fs-extra';\nimport nullthrows from 'nullthrows';\nimport { asyncResult } from '@expo/results';\nimport { spawnAsync } from '@expo/steps';\n\nimport { Artifacts, BuildContext, SkipNativeBuildError } from '../context';\nimport {\n configureExpoUpdatesIfInstalledAsync,\n resolveRuntimeVersionForExpoUpdatesIfConfiguredAsync,\n} from '../utils/expoUpdates';\nimport { TurtleFetchError } from '../utils/turtleFetch';\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 { decompressCacheAsync, downloadCacheAsync } from '../steps/functions/restoreCache';\nimport { compressCacheAsync, uploadCacheAsync } from '../steps/functions/saveCache';\nimport { findPackagerRootDir } from '../utils/packageManager';\n\nimport { runBuilderWithHooksAsync } from './common';\nimport { runCustomBuildAsync } from './custom';\n\nconst CACHE_KEY_PREFIX = 'android-ccache-';\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 buildStart = Date.now();\n const workingDirectory = ctx.getReactNativeProjectDirectory();\n const cachePaths = [path.join(ctx.env.HOME, '.cache/ccache')];\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 await ctx.cacheManager?.restoreCache(ctx);\n if (ctx.shouldRestoreCache) {\n try {\n const cacheKey = await generateCacheKeyAsync(workingDirectory);\n const jobId = nullthrows(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n\n const robotAccessToken = nullthrows(\n ctx.job.secrets?.robotAccessToken,\n 'Robot access token is required for cache operations'\n );\n const expoApiServerURL = nullthrows(\n ctx.env.__API_SERVER_URL,\n '__API_SERVER_URL is not set'\n );\n\n const { archivePath } = await downloadCacheAsync({\n logger: ctx.logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths: cachePaths,\n key: cacheKey,\n keyPrefixes: [CACHE_KEY_PREFIX],\n platform: ctx.job.platform,\n });\n\n await decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose: ctx.env.EXPO_DEBUG === '1',\n logger: ctx.logger,\n });\n\n ctx.logger.info('Cache restored successfully');\n await asyncResult(\n spawnAsync('ccache', ['--zero-stats'], {\n env: ctx.env,\n logger: ctx.logger,\n stdio: 'pipe',\n })\n );\n } catch (err: unknown) {\n if (err instanceof TurtleFetchError && err.response.status === 404) {\n ctx.logger.info('No cache found for this key. Create a cache with function save_cache');\n } else {\n ctx.logger.warn({ err }, 'Failed to restore cache');\n }\n }\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 await ctx.cacheManager?.saveCache(ctx);\n if (ctx.shouldSaveCache) {\n try {\n const cacheKey = await generateCacheKeyAsync(workingDirectory);\n const jobId = nullthrows(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n\n const robotAccessToken = nullthrows(\n ctx.job.secrets?.robotAccessToken,\n 'Robot access token is required for cache operations'\n );\n const expoApiServerURL = nullthrows(\n ctx.env.__API_SERVER_URL,\n '__API_SERVER_URL is not set'\n );\n\n // cache size can blow up over time over many builds, so evict stale files and only upload what was used within this builds time window\n const evictWindow = Math.floor((Date.now() - buildStart) / 1000);\n ctx.logger.info('Pruning cache...');\n await asyncResult(\n spawnAsync('ccache', ['--evict-older-than', evictWindow + 's'], {\n env: ctx.env,\n logger: ctx.logger,\n stdio: 'pipe',\n })\n );\n\n ctx.logger.info('Cache stats:');\n await asyncResult(\n spawnAsync('ccache', ['--show-stats', '-v'], {\n env: ctx.env,\n logger: ctx.logger,\n stdio: 'pipe',\n })\n );\n\n ctx.logger.info('Preparing cache archive...');\n\n const { archivePath } = await compressCacheAsync({\n paths: cachePaths,\n workingDirectory,\n verbose: ctx.env.EXPO_DEBUG === '1',\n logger: ctx.logger,\n });\n\n const { size } = await fs.stat(archivePath);\n\n await uploadCacheAsync({\n logger: ctx.logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n archivePath,\n key: cacheKey,\n paths: cachePaths,\n size,\n platform: ctx.job.platform,\n });\n } catch (err) {\n ctx.logger.error({ err }, 'Failed to save cache');\n }\n }\n });\n}\n\nasync function generateCacheKeyAsync(workingDirectory: string): 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 const key = await hashFiles([lockPath]);\n return `${CACHE_KEY_PREFIX}${key}`;\n } catch (err: any) {\n throw new Error(`Failed to read package files for cache key generation: ${err.message}`);\n }\n}\n\nasync function hashFiles(filePaths: string[]): Promise<string> {\n const hashes: string[] = [];\n\n for (const filePath of filePaths) {\n try {\n if (await fs.pathExists(filePath)) {\n const fileContent = await fs.readFile(filePath);\n const fileHash = createHash('sha256')\n .update(fileContent as BinaryLike)\n .digest('hex');\n hashes.push(fileHash);\n }\n } catch (err: any) {\n throw new Error(`Failed to hash file ${filePath}: ${err.message}`);\n }\n }\n\n const combinedHashes = hashes.join('');\n return createHash('sha256').update(combinedHashes).digest('hex');\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"]}
@@ -1,44 +1,15 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
6
  exports.default = iosBuilder;
30
- const crypto_1 = require("crypto");
31
- const path_1 = __importDefault(require("path"));
32
7
  const plist_1 = __importDefault(require("@expo/plist"));
33
8
  const config_plugins_1 = require("@expo/config-plugins");
34
9
  const eas_build_job_1 = require("@expo/eas-build-job");
35
10
  const fs_extra_1 = __importDefault(require("fs-extra"));
36
11
  const nullthrows_1 = __importDefault(require("nullthrows"));
37
- const PackageManagerUtils = __importStar(require("@expo/package-manager"));
38
- const steps_1 = require("@expo/steps");
39
- const results_1 = require("@expo/results");
40
12
  const expoUpdates_1 = require("../utils/expoUpdates");
41
- const turtleFetch_1 = require("../utils/turtleFetch");
42
13
  const artifacts_1 = require("../utils/artifacts");
43
14
  const hooks_1 = require("../utils/hooks");
44
15
  const configure_1 = require("../ios/configure");
@@ -52,14 +23,12 @@ const prebuild_1 = require("../common/prebuild");
52
23
  const prepareBuildExecutable_1 = require("../utils/prepareBuildExecutable");
53
24
  const processes_1 = require("../utils/processes");
54
25
  const eagerBundle_1 = require("../common/eagerBundle");
55
- const saveCache_1 = require("../steps/functions/saveCache");
56
- const restoreCache_1 = require("../steps/functions/restoreCache");
57
- const packageManager_1 = require("../utils/packageManager");
26
+ const saveBuildCache_1 = require("../steps/functions/saveBuildCache");
27
+ const restoreBuildCache_1 = require("../steps/functions/restoreBuildCache");
58
28
  const common_1 = require("./common");
59
29
  const custom_1 = require("./custom");
60
30
  const INSTALL_PODS_WARN_TIMEOUT_MS = 15 * 60 * 1000; // 15 minutes
61
31
  const INSTALL_PODS_KILL_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
62
- const CACHE_KEY_PREFIX = 'ios-ccache-';
63
32
  class InstallPodsTimeoutError extends Error {
64
33
  }
65
34
  async function iosBuilder(ctx) {
@@ -80,10 +49,9 @@ async function iosBuilder(ctx) {
80
49
  async function buildAsync(ctx) {
81
50
  await (0, setup_1.setupAsync)(ctx);
82
51
  const hasNativeCode = ctx.job.type === eas_build_job_1.Workflow.GENERIC;
83
- const buildStart = Date.now();
52
+ const evictUsedBefore = new Date();
84
53
  const credentialsManager = new manager_1.default(ctx);
85
54
  const workingDirectory = ctx.getReactNativeProjectDirectory();
86
- const cachePaths = [path_1.default.join(ctx.env.HOME, 'Library/Caches/ccache')];
87
55
  try {
88
56
  const credentials = await ctx.runBuildPhase(eas_build_job_1.BuildPhase.PREPARE_CREDENTIALS, async () => {
89
57
  return await credentialsManager.prepare();
@@ -104,46 +72,19 @@ async function buildAsync(ctx) {
104
72
  });
105
73
  });
106
74
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.RESTORE_CACHE, async () => {
107
- var _a, _b;
108
- await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.restoreCache(ctx));
109
- if (ctx.shouldRestoreCache) {
110
- try {
111
- const cacheKey = await generateCacheKeyAsync(workingDirectory);
112
- const jobId = (0, nullthrows_1.default)(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');
113
- const robotAccessToken = (0, nullthrows_1.default)((_b = ctx.job.secrets) === null || _b === void 0 ? void 0 : _b.robotAccessToken, 'Robot access token is required for cache operations');
114
- const expoApiServerURL = (0, nullthrows_1.default)(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');
115
- const { archivePath } = await (0, restoreCache_1.downloadCacheAsync)({
116
- logger: ctx.logger,
117
- jobId,
118
- expoApiServerURL,
119
- robotAccessToken,
120
- paths: cachePaths,
121
- key: cacheKey,
122
- keyPrefixes: [CACHE_KEY_PREFIX],
123
- platform: ctx.job.platform,
124
- });
125
- await (0, restoreCache_1.decompressCacheAsync)({
126
- archivePath,
127
- workingDirectory,
128
- verbose: ctx.env.EXPO_DEBUG === '1',
129
- logger: ctx.logger,
130
- });
131
- ctx.logger.info('Cache restored successfully');
132
- await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--zero-stats'], {
133
- env: ctx.env,
134
- logger: ctx.logger,
135
- stdio: 'pipe',
136
- }));
137
- }
138
- catch (err) {
139
- if (err instanceof turtleFetch_1.TurtleFetchError && err.response.status === 404) {
140
- ctx.logger.info('No cache found for this key. Create a cache with function save_cache');
141
- }
142
- else {
143
- ctx.logger.warn({ err }, 'Failed to restore cache');
144
- }
145
- }
75
+ var _a;
76
+ if (ctx.isLocal) {
77
+ ctx.logger.info('Local builds do not support restoring cache');
78
+ return;
146
79
  }
80
+ await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.restoreCache(ctx));
81
+ await (0, restoreBuildCache_1.restoreCcacheAsync)({
82
+ logger: ctx.logger,
83
+ workingDirectory,
84
+ platform: ctx.job.platform,
85
+ env: ctx.env,
86
+ secrets: ctx.job.secrets,
87
+ });
147
88
  });
148
89
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.INSTALL_PODS, async () => {
149
90
  await runInstallPodsAsync(ctx);
@@ -228,52 +169,26 @@ async function buildAsync(ctx) {
228
169
  });
229
170
  });
230
171
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.SAVE_CACHE, async () => {
231
- var _a, _b;
232
- await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.saveCache(ctx));
233
- if (ctx.shouldSaveCache) {
234
- try {
235
- const cacheKey = await generateCacheKeyAsync(workingDirectory);
236
- const jobId = (0, nullthrows_1.default)(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');
237
- const robotAccessToken = (0, nullthrows_1.default)((_b = ctx.job.secrets) === null || _b === void 0 ? void 0 : _b.robotAccessToken, 'Robot access token is required for cache operations');
238
- const expoApiServerURL = (0, nullthrows_1.default)(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');
239
- // cache size can blow up over time over many builds, so evict stale files and only upload what was used within this builds time window
240
- const evictWindow = Math.floor((Date.now() - buildStart) / 1000);
241
- ctx.logger.info('Pruning cache...');
242
- await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--evict-older-than', evictWindow + 's'], {
243
- env: ctx.env,
244
- logger: ctx.logger,
245
- stdio: 'pipe',
246
- }));
247
- ctx.logger.info('Cache stats:');
248
- await (0, results_1.asyncResult)((0, steps_1.spawnAsync)('ccache', ['--show-stats', '-v'], {
249
- env: ctx.env,
250
- logger: ctx.logger,
251
- stdio: 'pipe',
252
- }));
253
- ctx.logger.info('Preparing cache archive...');
254
- const { archivePath } = await (0, saveCache_1.compressCacheAsync)({
255
- paths: cachePaths,
256
- workingDirectory,
257
- verbose: ctx.env.EXPO_DEBUG === '1',
258
- logger: ctx.logger,
259
- });
260
- const { size } = await fs_extra_1.default.stat(archivePath);
261
- await (0, saveCache_1.uploadCacheAsync)({
262
- logger: ctx.logger,
263
- jobId,
264
- expoApiServerURL,
265
- robotAccessToken,
266
- archivePath,
267
- key: cacheKey,
268
- paths: cachePaths,
269
- size,
270
- platform: ctx.job.platform,
271
- });
272
- }
273
- catch (err) {
274
- ctx.logger.error({ err }, 'Failed to save cache');
275
- }
172
+ var _a;
173
+ if (ctx.isLocal) {
174
+ ctx.logger.info('Local builds do not support saving cache.');
175
+ return;
276
176
  }
177
+ await ((_a = ctx.cacheManager) === null || _a === void 0 ? void 0 : _a.saveCache(ctx));
178
+ await (0, saveBuildCache_1.saveCcacheAsync)({
179
+ logger: ctx.logger,
180
+ workingDirectory,
181
+ platform: ctx.job.platform,
182
+ evictUsedBefore,
183
+ env: ctx.env,
184
+ secrets: ctx.job.secrets,
185
+ });
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
+ });
277
192
  });
278
193
  }
279
194
  async function readEntitlementsAsync(ctx, { scheme, buildConfiguration }) {
@@ -372,37 +287,4 @@ async function runInstallPodsAsync(ctx) {
372
287
  }
373
288
  }
374
289
  }
375
- async function generateCacheKeyAsync(workingDirectory) {
376
- // This will resolve which package manager and use the relevant lock file
377
- // The lock file hash is the key and ensures cache is fresh
378
- const packagerRunDir = (0, packageManager_1.findPackagerRootDir)(workingDirectory);
379
- const manager = PackageManagerUtils.createForProject(packagerRunDir);
380
- const lockPath = path_1.default.join(packagerRunDir, manager.lockFile);
381
- try {
382
- const key = await hashFiles([lockPath]);
383
- return `${CACHE_KEY_PREFIX}${key}`;
384
- }
385
- catch (err) {
386
- throw new Error(`Failed to read package files for cache key generation: ${err.message}`);
387
- }
388
- }
389
- async function hashFiles(filePaths) {
390
- const hashes = [];
391
- for (const filePath of filePaths) {
392
- try {
393
- if (await fs_extra_1.default.pathExists(filePath)) {
394
- const fileContent = await fs_extra_1.default.readFile(filePath);
395
- const fileHash = (0, crypto_1.createHash)('sha256')
396
- .update(fileContent)
397
- .digest('hex');
398
- hashes.push(fileHash);
399
- }
400
- }
401
- catch (err) {
402
- throw new Error(`Failed to hash file ${filePath}: ${err.message}`);
403
- }
404
- }
405
- const combinedHashes = hashes.join('');
406
- return (0, crypto_1.createHash)('sha256').update(combinedHashes).digest('hex');
407
- }
408
290
  //# sourceMappingURL=ios.js.map