@expo/build-tools 0.1.162 → 0.1.163

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.
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.runGradleCommand = exports.ensureLFLineEndingsInGradlewScript = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
+ const assert_1 = __importDefault(require("assert"));
8
9
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
9
10
  const fs_extra_1 = __importDefault(require("fs-extra"));
10
11
  async function ensureLFLineEndingsInGradlewScript(ctx) {
@@ -19,7 +20,7 @@ exports.ensureLFLineEndingsInGradlewScript = ensureLFLineEndingsInGradlewScript;
19
20
  async function runGradleCommand(ctx, gradleCommand) {
20
21
  const androidDir = path_1.default.join(ctx.reactNativeProjectDirectory, 'android');
21
22
  ctx.logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);
22
- await (0, turtle_spawn_1.default)('bash', ['-c', `sh gradlew ${gradleCommand}`], {
23
+ const spawnPromise = (0, turtle_spawn_1.default)('bash', ['-c', `sh gradlew ${gradleCommand}`], {
23
24
  cwd: androidDir,
24
25
  logger: ctx.logger,
25
26
  lineTransformer: (line) => {
@@ -32,6 +33,55 @@ async function runGradleCommand(ctx, gradleCommand) {
32
33
  },
33
34
  env: ctx.env,
34
35
  });
36
+ if (ctx.env.EAS_BUILD_RUNNER === 'eas-build' && process.platform === 'linux') {
37
+ adjustOOMScore(spawnPromise, ctx.logger);
38
+ }
39
+ await spawnPromise;
35
40
  }
36
41
  exports.runGradleCommand = runGradleCommand;
42
+ /**
43
+ * OOM Killer sometimes kills worker server while build is exceeding memory limits.
44
+ * `oom_score_adj` is a value between -1000 and 1000 and it defaults to 0.
45
+ * It defines which process is more likely to get killed (higher value more likely).
46
+ *
47
+ * This function sets oom_score_adj for Gradle process and all its child processes.
48
+ */
49
+ function adjustOOMScore(spawnPromise, logger) {
50
+ setTimeout(async () => {
51
+ try {
52
+ (0, assert_1.default)(spawnPromise.child.pid);
53
+ const children = [spawnPromise.child.pid];
54
+ let shouldRetry = true;
55
+ while (shouldRetry) {
56
+ const result = await (0, turtle_spawn_1.default)('pgrep', ['-P', children.join(',')], {
57
+ stdio: 'pipe',
58
+ });
59
+ const pids = result.stdout
60
+ .toString()
61
+ .split('\n')
62
+ .map((i) => Number(i.trim()))
63
+ .filter((i) => i);
64
+ shouldRetry = false;
65
+ for (const pid of pids) {
66
+ if (!children.includes(pid)) {
67
+ shouldRetry = true;
68
+ children.push(pid);
69
+ }
70
+ }
71
+ }
72
+ await Promise.all(children.map(async (pid) => {
73
+ // Value 800 is just a guess here. It's probably higher than most other
74
+ // process. I didn't want to set it any higher, because I'm not sure if OOM Killer
75
+ // can start killing processes when there is still enough memory left.
76
+ const oomScoreOverride = 800;
77
+ await fs_extra_1.default.writeFile(`/proc/${pid}/oom_score_adj`, `${oomScoreOverride}\n`);
78
+ }));
79
+ }
80
+ catch (err) {
81
+ logger.debug({ err, stderr: err === null || err === void 0 ? void 0 : err.stderr }, 'Failed to override oom_score_adj');
82
+ }
83
+ },
84
+ // Wait 20 seconds to make sure all child processes are started
85
+ 20000);
86
+ }
37
87
  //# sourceMappingURL=gradle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,sEAAuC;AAEvC,wDAA0B;AAInB,KAAK,UAAU,kCAAkC,CACtD,GAAuB;IAEvB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACjC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACzE,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;KAChF;AACH,CAAC;AATD,gFASC;AAEM,KAAK,UAAU,gBAAgB,CACpC,GAA8B,EAC9B,aAAqB;IAErB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;IACzE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,aAAa,QAAQ,UAAU,EAAE,CAAC,CAAC;IACvE,MAAM,IAAA,sBAAK,EAAC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,aAAa,EAAE,CAAC,EAAE;QACzD,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC/B,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC;QACD,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAC;AACL,CAAC;AAlBD,4CAkBC","sourcesContent":["import path from 'path';\n\nimport spawn from '@expo/turtle-spawn';\nimport { Android, Job } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nexport async function ensureLFLineEndingsInGradlewScript<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n const gradlewPath = path.join(ctx.reactNativeProjectDirectory, 'android', 'gradlew');\n const gradlewContent = await fs.readFile(gradlewPath, 'utf8');\n if (gradlewContent.includes('\\r')) {\n ctx.logger.info('Replacing CRLF line endings with LF in gradlew script');\n await fs.writeFile(gradlewPath, gradlewContent.replace(/\\r\\n/g, '\\n'), 'utf8');\n }\n}\n\nexport async function runGradleCommand(\n ctx: BuildContext<Android.Job>,\n gradleCommand: string\n): Promise<void> {\n const androidDir = path.join(ctx.reactNativeProjectDirectory, 'android');\n ctx.logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);\n await spawn('bash', ['-c', `sh gradlew ${gradleCommand}`], {\n cwd: androidDir,\n logger: ctx.logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: ctx.env,\n });\n}\n"]}
1
+ {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,oDAA4B;AAE5B,sEAAsE;AAEtE,wDAA0B;AAKnB,KAAK,UAAU,kCAAkC,CACtD,GAAuB;IAEvB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACjC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACzE,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;KAChF;AACH,CAAC;AATD,gFASC;AAEM,KAAK,UAAU,gBAAgB,CACpC,GAA8B,EAC9B,aAAqB;IAErB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;IACzE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,aAAa,QAAQ,UAAU,EAAE,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAA,sBAAK,EAAC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,aAAa,EAAE,CAAC,EAAE;QACxE,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC/B,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC;QACD,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,GAAG,CAAC,gBAAgB,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QAC5E,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KAC1C;IAED,MAAM,YAAY,CAAC;AACrB,CAAC;AAvBD,4CAuBC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAuC,EAAE,MAAc;IAC7E,UAAU,CACR,KAAK,IAAI,EAAE;QACT,IAAI;YACF,IAAA,gBAAM,EAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAa,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpD,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,OAAO,WAAW,EAAE;gBAClB,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAK,EAAC,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC9D,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM;qBACvB,QAAQ,EAAE;qBACV,KAAK,CAAC,IAAI,CAAC;qBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpB,WAAW,GAAG,KAAK,CAAC;gBACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;oBACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;wBAC3B,WAAW,GAAG,IAAI,CAAC;wBACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACpB;iBACF;aACF;YACD,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;gBACjC,uEAAuE;gBACvE,kFAAkF;gBAClF,sEAAsE;gBACtE,MAAM,gBAAgB,GAAG,GAAG,CAAC;gBAC7B,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,GAAG,gBAAgB,EAAE,GAAG,gBAAgB,IAAI,CAAC,CAAC;YAC5E,CAAC,CAAC,CACH,CAAC;SACH;QAAC,OAAO,GAAQ,EAAE;YACjB,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,EAAE,EAAE,kCAAkC,CAAC,CAAC;SAChF;IACH,CAAC;IACD,+DAA+D;IAC/D,KAAK,CACN,CAAC;AACJ,CAAC","sourcesContent":["import path from 'path';\nimport assert from 'assert';\n\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport { Android, Job } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\nimport { bunyan } from '@expo/logger';\n\nimport { BuildContext } from '../context';\n\nexport async function ensureLFLineEndingsInGradlewScript<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n const gradlewPath = path.join(ctx.reactNativeProjectDirectory, 'android', 'gradlew');\n const gradlewContent = await fs.readFile(gradlewPath, 'utf8');\n if (gradlewContent.includes('\\r')) {\n ctx.logger.info('Replacing CRLF line endings with LF in gradlew script');\n await fs.writeFile(gradlewPath, gradlewContent.replace(/\\r\\n/g, '\\n'), 'utf8');\n }\n}\n\nexport async function runGradleCommand(\n ctx: BuildContext<Android.Job>,\n gradleCommand: string\n): Promise<void> {\n const androidDir = path.join(ctx.reactNativeProjectDirectory, 'android');\n ctx.logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);\n const spawnPromise = spawn('bash', ['-c', `sh gradlew ${gradleCommand}`], {\n cwd: androidDir,\n logger: ctx.logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: ctx.env,\n });\n if (ctx.env.EAS_BUILD_RUNNER === 'eas-build' && process.platform === 'linux') {\n adjustOOMScore(spawnPromise, ctx.logger);\n }\n\n await spawnPromise;\n}\n\n/**\n * OOM Killer sometimes kills worker server while build is exceeding memory limits.\n * `oom_score_adj` is a value between -1000 and 1000 and it defaults to 0.\n * It defines which process is more likely to get killed (higher value more likely).\n *\n * This function sets oom_score_adj for Gradle process and all its child processes.\n */\nfunction adjustOOMScore(spawnPromise: SpawnPromise<SpawnResult>, logger: bunyan): void {\n setTimeout(\n async () => {\n try {\n assert(spawnPromise.child.pid);\n const children: number[] = [spawnPromise.child.pid];\n let shouldRetry = true;\n while (shouldRetry) {\n const result = await spawn('pgrep', ['-P', children.join(',')], {\n stdio: 'pipe',\n });\n const pids = result.stdout\n .toString()\n .split('\\n')\n .map((i) => Number(i.trim()))\n .filter((i) => i);\n shouldRetry = false;\n for (const pid of pids) {\n if (!children.includes(pid)) {\n shouldRetry = true;\n children.push(pid);\n }\n }\n }\n await Promise.all(\n children.map(async (pid: number) => {\n // Value 800 is just a guess here. It's probably higher than most other\n // process. I didn't want to set it any higher, because I'm not sure if OOM Killer\n // can start killing processes when there is still enough memory left.\n const oomScoreOverride = 800;\n await fs.writeFile(`/proc/${pid}/oom_score_adj`, `${oomScoreOverride}\\n`);\n })\n );\n } catch (err: any) {\n logger.debug({ err, stderr: err?.stderr }, 'Failed to override oom_score_adj');\n }\n },\n // Wait 20 seconds to make sure all child processes are started\n 20000\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/build-tools",
3
- "version": "0.1.162",
3
+ "version": "0.1.163",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -22,7 +22,7 @@
22
22
  "@expo/config": "7.0.1",
23
23
  "@expo/config-plugins": "5.0.1",
24
24
  "@expo/downloader": "0.0.21",
25
- "@expo/eas-build-job": "0.2.97",
25
+ "@expo/eas-build-job": "0.2.98",
26
26
  "@expo/logger": "0.0.24",
27
27
  "@expo/package-manager": "0.0.54",
28
28
  "@expo/plist": "^0.0.11",