@limrun/api 0.34.0 → 0.35.0

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/index.d.mts +3 -1
  3. package/index.d.mts.map +1 -1
  4. package/index.d.ts +3 -1
  5. package/index.d.ts.map +1 -1
  6. package/index.js +17 -1
  7. package/index.js.map +1 -1
  8. package/index.mjs +2 -0
  9. package/index.mjs.map +1 -1
  10. package/internal/direct-instance-errors.d.mts +9 -0
  11. package/internal/direct-instance-errors.d.mts.map +1 -1
  12. package/internal/direct-instance-errors.d.ts +9 -0
  13. package/internal/direct-instance-errors.d.ts.map +1 -1
  14. package/internal/direct-instance-errors.js +6 -1
  15. package/internal/direct-instance-errors.js.map +1 -1
  16. package/internal/direct-instance-errors.mjs +5 -1
  17. package/internal/direct-instance-errors.mjs.map +1 -1
  18. package/internal/proxy-transport.d.mts +9 -0
  19. package/internal/proxy-transport.d.mts.map +1 -1
  20. package/internal/proxy-transport.d.ts +9 -0
  21. package/internal/proxy-transport.d.ts.map +1 -1
  22. package/internal/proxy-transport.js +19 -0
  23. package/internal/proxy-transport.js.map +1 -1
  24. package/internal/proxy-transport.mjs +19 -0
  25. package/internal/proxy-transport.mjs.map +1 -1
  26. package/package.json +21 -1
  27. package/rbe-session.d.mts +35 -0
  28. package/rbe-session.d.mts.map +1 -0
  29. package/rbe-session.d.ts +35 -0
  30. package/rbe-session.d.ts.map +1 -0
  31. package/rbe-session.js +72 -0
  32. package/rbe-session.js.map +1 -0
  33. package/rbe-session.mjs +65 -0
  34. package/rbe-session.mjs.map +1 -0
  35. package/rbe-workspace.d.mts +163 -0
  36. package/rbe-workspace.d.mts.map +1 -0
  37. package/rbe-workspace.d.ts +163 -0
  38. package/rbe-workspace.d.ts.map +1 -0
  39. package/rbe-workspace.js +394 -0
  40. package/rbe-workspace.js.map +1 -0
  41. package/rbe-workspace.mjs +382 -0
  42. package/rbe-workspace.mjs.map +1 -0
  43. package/resources/xcode-instances-helpers.d.mts +29 -0
  44. package/resources/xcode-instances-helpers.d.mts.map +1 -1
  45. package/resources/xcode-instances-helpers.d.ts +29 -0
  46. package/resources/xcode-instances-helpers.d.ts.map +1 -1
  47. package/resources/xcode-instances-helpers.js +58 -7
  48. package/resources/xcode-instances-helpers.js.map +1 -1
  49. package/resources/xcode-instances-helpers.mjs +59 -8
  50. package/resources/xcode-instances-helpers.mjs.map +1 -1
  51. package/src/index.ts +23 -0
  52. package/src/internal/direct-instance-errors.ts +11 -1
  53. package/src/internal/proxy-transport.ts +22 -0
  54. package/src/rbe-session.ts +92 -0
  55. package/src/rbe-workspace.ts +407 -0
  56. package/src/resources/xcode-instances-helpers.ts +110 -13
  57. package/src/version.ts +1 -1
  58. package/version.d.mts +1 -1
  59. package/version.d.ts +1 -1
  60. package/version.js +1 -1
  61. package/version.mjs +1 -1
@@ -0,0 +1,382 @@
1
+ // Mirrored between src/rbe-workspace.ts (canonical) and packages/cli/src/lib/rbe-workspace.ts
2
+ // until the CLI imports it from a published @limrun/api; tests/rbe-copy-sync.test.ts keeps the
3
+ // two copies byte-identical. Apply any edit to both.
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ /**
7
+ * Generates the .limrun/ workspace companion for Limrun remote execution: a Bazel
8
+ * package pinning the remote fleet's Xcode version and an rc fragment with the
9
+ * remote-execution flags under the `limrun` config. The caller learns the
10
+ * fleet's version key from the instance's RBE status, so the generated config
11
+ * always matches the fleet without any user action; regenerating the files
12
+ * after a fleet Xcode upgrade refreshes the pin.
13
+ */
14
+ export const LIMRUN_DIR = '.limrun';
15
+ export const TRY_IMPORT_LINE = 'try-import %workspace%/.limrun/bazelrc';
16
+ const TRY_IMPORT_COMMENT = '# Added by Limrun remote-execution setup: loads the generated config.';
17
+ const WORKSPACE_MARKERS = ['MODULE.bazel', 'WORKSPACE', 'WORKSPACE.bazel'];
18
+ /**
19
+ * Finds the Bazel workspace root by walking up from `startDir` to the first
20
+ * ancestor containing a MODULE.bazel / WORKSPACE / WORKSPACE.bazel, mirroring
21
+ * how Bazel itself locates the workspace when run from a subdirectory. Returns
22
+ * null when no workspace is found up to the filesystem root. The generated
23
+ * `.limrun/` and the `try-import` must live at this root, since `%workspace%`
24
+ * in bazelrc resolves here regardless of the directory the build is run from.
25
+ */
26
+ export function findBazelWorkspaceRoot(startDir) {
27
+ let dir = path.resolve(startDir);
28
+ for (;;) {
29
+ if (WORKSPACE_MARKERS.some((m) => fs.existsSync(path.join(dir, m)))) {
30
+ return dir;
31
+ }
32
+ const parent = path.dirname(dir);
33
+ if (parent === dir) {
34
+ return null;
35
+ }
36
+ dir = parent;
37
+ }
38
+ }
39
+ const APP_RULE_RE = /\b(?:ios|macos|tvos|watchos)_application\s*\(/;
40
+ const TARGET_NAME_RE = /^\s*name\s*=\s*"([^"]+)"/;
41
+ const TARGET_SCAN_SKIP_DIRS = new Set(['.git', 'node_modules', '.limrun']);
42
+ /**
43
+ * Best-effort guess of a single buildable app target to show in the printed
44
+ * build command, so it reads `//App` instead of a `//your:target` placeholder.
45
+ * Scans the workspace's BUILD files (buildifier-formatted) for apple
46
+ * `*_application` rules (no bazel invocation) and returns the label in short
47
+ * form (`//pkg` when the target name matches the package's last segment).
48
+ * Returns null when there are zero or multiple candidates (ambiguous → caller
49
+ * keeps the placeholder).
50
+ */
51
+ export function inferBuildTarget(workspaceRoot) {
52
+ const found = [];
53
+ const walk = (dir) => {
54
+ if (found.length > 1)
55
+ return; // already ambiguous; stop early
56
+ let entries;
57
+ try {
58
+ entries = fs.readdirSync(dir, { withFileTypes: true });
59
+ }
60
+ catch {
61
+ return;
62
+ }
63
+ for (const entry of entries) {
64
+ if (entry.isDirectory()) {
65
+ if (TARGET_SCAN_SKIP_DIRS.has(entry.name) || entry.name.startsWith('bazel-'))
66
+ continue;
67
+ walk(path.join(dir, entry.name));
68
+ }
69
+ else if (entry.name === 'BUILD' || entry.name === 'BUILD.bazel') {
70
+ collectAppTargets(path.join(dir, entry.name), workspaceRoot, found);
71
+ }
72
+ }
73
+ };
74
+ walk(workspaceRoot);
75
+ return found.length === 1 ? found[0] : null;
76
+ }
77
+ /** Appends `//pkg[:name]` labels of apple application rules in one BUILD file. */
78
+ function collectAppTargets(buildFile, workspaceRoot, out) {
79
+ let content;
80
+ try {
81
+ content = fs.readFileSync(buildFile, 'utf8');
82
+ }
83
+ catch {
84
+ return;
85
+ }
86
+ const pkg = path.relative(workspaceRoot, path.dirname(buildFile)).split(path.sep).join('/');
87
+ let inAppRule = false;
88
+ for (const line of content.split('\n')) {
89
+ // Skip comment lines so a commented-out `# ios_application(` can't start a
90
+ // phantom rule (and a commented `# name = ...` can't be captured), which
91
+ // would otherwise leave inAppRule set and mislabel a later rule's name.
92
+ if (line.trimStart().startsWith('#'))
93
+ continue;
94
+ if (!inAppRule) {
95
+ if (APP_RULE_RE.test(line))
96
+ inAppRule = true;
97
+ continue;
98
+ }
99
+ const match = line.match(TARGET_NAME_RE);
100
+ if (match) {
101
+ const name = match[1];
102
+ const last = pkg.split('/').pop();
103
+ out.push(pkg === '' || pkg === '.' ? `//:${name}`
104
+ : last === name ? `//${pkg}`
105
+ : `//${pkg}:${name}`);
106
+ inAppRule = false;
107
+ }
108
+ else if (/^\)/.test(line)) {
109
+ inAppRule = false; // rule closed before a name line we could read
110
+ }
111
+ }
112
+ }
113
+ /**
114
+ * Reads the workspace's pinned Bazel major version from `.bazelversion`, or
115
+ * null when the file is absent or its first line has no leading integer.
116
+ *
117
+ * Used to decide whether the generated BUILD must `load` the Xcode rules from
118
+ * apple_support: in Bazel 9 they are no longer native globals and must be
119
+ * loaded, while in Bazel 8 they ARE native globals and the apple_support rule
120
+ * impls `fail()` on the unmigrated Bazel, so loading them there breaks
121
+ * analysis. The generator runs in the workspace on the client, so the file is
122
+ * the authoritative signal for the Bazel that bazelisk will launch.
123
+ */
124
+ export function detectBazelMajorVersion(workspaceDir) {
125
+ try {
126
+ const raw = fs.readFileSync(path.join(workspaceDir, '.bazelversion'), 'utf8');
127
+ const firstLine = (raw.split('\n', 1)[0] ?? '').trim();
128
+ const match = firstLine.match(/^(\d+)/);
129
+ return match ? Number(match[1]) : null;
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * Whether to treat the workspace as Bazel 9+ for RBE config: true when the
137
+ * detected major version is >= 9, OR unknown (no `.bazelversion` means bazelisk
138
+ * runs the latest release, which is 9+). This single predicate decides both
139
+ * emitting the apple_support Xcode-rule loads and surfacing the SHA256 digest
140
+ * hint, so the two stay in lockstep.
141
+ */
142
+ export function isBazel9OrLater(bazelMajor) {
143
+ return bazelMajor === null || bazelMajor >= 9;
144
+ }
145
+ /** Major.minor short alias (e.g. "26.4") used for the SDK default and --xcode_version. */
146
+ function shortVersion(versionKey) {
147
+ const parts = versionKey.split('.');
148
+ if (parts.length < 3) {
149
+ throw new Error(`unexpected Xcode version key from the instance: ${versionKey}`);
150
+ }
151
+ return `${parts[0]}.${parts[1]}`;
152
+ }
153
+ /** Renders one xcode_version rule from a major.minor.patch.build version key. */
154
+ function renderXcodeVersionRule(name, versionKey) {
155
+ // shortVersion validates the key shape (major.minor.patch[.build]) and yields
156
+ // the major.minor used for both the SDK defaults and the short alias.
157
+ const sdk = shortVersion(versionKey);
158
+ const parts = versionKey.split('.');
159
+ const fullAlias = `${parts[0]}.${parts[1]}.${parts[2]}`;
160
+ return `xcode_version(
161
+ name = "${name}",
162
+ aliases = [
163
+ "${sdk}",
164
+ "${fullAlias}",
165
+ ],
166
+ default_ios_sdk_version = "${sdk}",
167
+ default_macos_sdk_version = "${sdk}",
168
+ default_tvos_sdk_version = "${sdk}",
169
+ default_watchos_sdk_version = "${sdk}",
170
+ version = "${versionKey}",
171
+ )`;
172
+ }
173
+ /**
174
+ * Renders an `available_xcodes` set with a single member that is also its
175
+ * mandatory default. Both sets the BUILD file emits (remote, local) are
176
+ * single-version sets of this shape, pointing at the same fleet pin.
177
+ */
178
+ function renderAvailableXcodes(name, target) {
179
+ return `available_xcodes(
180
+ name = "${name}",
181
+ default = "${target}",
182
+ versions = ["${target}"],
183
+ )`;
184
+ }
185
+ /**
186
+ * Renders the generated Bazel package pinning the Xcode version to the fleet's.
187
+ *
188
+ * remoteVersionKey is the fleet's `xcodebuild -version` in major.minor.patch.build
189
+ * form (e.g. 26.4.0.17E192).
190
+ *
191
+ * Uses Bazel's remote/local `xcode_config` split with BOTH sets pointing at the
192
+ * SAME fleet pin (rather than a single `default=/versions=` bucket, which
193
+ * resolves with availability UNKNOWN and leaves Apple/Swift actions eligible for
194
+ * local execution). With local == remote, `--xcode_version` resolves as
195
+ * "mutually available" (BOTH), which declares up front that this build uses only
196
+ * the fleet's Xcode AND keeps apple_support from emitting its remote-only
197
+ * "...specified, but it is not available locally..." DEBUG notice (that notice
198
+ * fires only when the pinned version is in `remote_versions` but not
199
+ * `local_versions`).
200
+ *
201
+ * We intentionally do NOT name the client's own local Xcode: under
202
+ * `--config=limrun` every action runs remotely (`--spawn_strategy=remote` +
203
+ * `--noremote_local_fallback`), so a local DEVELOPER_DIR is never resolved.
204
+ * Declaring a distinct local version would only reintroduce that DEBUG notice on
205
+ * a client whose Xcode differs from the fleet's. (The fleet pin is used, not
206
+ * Bazel's `@local_config_xcode//:host_available_xcodes`: that repo is not
207
+ * visible from the main module under bzlmod and is never generated off-darwin.)
208
+ *
209
+ * When `emitLoads` is true (Bazel 9+), the Xcode rules are loaded from
210
+ * apple_support; on Bazel 8 they are native globals and MUST NOT be loaded
211
+ * (the apple_support rule impls fail on the unmigrated Bazel).
212
+ */
213
+ export function renderXcodeConfigBuild(remoteVersionKey, emitLoads) {
214
+ // Bazel 9 migrated xcode_version/available_xcodes/xcode_config out of native
215
+ // globals into apple_support; they must be loaded there. The repo_name
216
+ // @build_bazel_apple_support is the apple_support module convention.
217
+ const loads = emitLoads ?
218
+ `load("@build_bazel_apple_support//xcode:xcode_version.bzl", "xcode_version")
219
+ load("@build_bazel_apple_support//xcode:available_xcodes.bzl", "available_xcodes")
220
+ load("@build_bazel_apple_support//xcode:xcode_config.bzl", "xcode_config")
221
+
222
+ `
223
+ : '';
224
+ const remoteRule = renderXcodeVersionRule('remote_xcode', remoteVersionKey);
225
+ return `# Generated by lim xcode rbe. Do not edit; rerun the command to refresh.
226
+ #
227
+ # Pins the Xcode version Bazel uses to the limrun fleet's Xcode, independent of
228
+ # any Xcode installed on this machine. Both the remote and local sets point at
229
+ # the SAME pin so --xcode_version resolves as mutually available (no
230
+ # apple_support remote-only DEBUG notice); under --config=limrun all actions run
231
+ # remotely, so a local DEVELOPER_DIR is never resolved. Selected via
232
+ # .limrun/bazelrc (--config=limrun).
233
+ ${loads}${remoteRule}
234
+
235
+ # Both sets point at the single fleet pin.
236
+ ${renderAvailableXcodes('remote_xcodes', ':remote_xcode')}
237
+
238
+ ${renderAvailableXcodes('local_xcodes', ':remote_xcode')}
239
+
240
+ xcode_config(
241
+ name = "remote_xcode_config",
242
+ remote_versions = ":remote_xcodes",
243
+ local_versions = ":local_xcodes",
244
+ )
245
+ `;
246
+ }
247
+ /**
248
+ * Renders the rc fragment with the remote-execution flags under
249
+ * --config=limrun.
250
+ *
251
+ * - `--remote_cache=` (empty) clears any workspace-level `--remote_cache`. The
252
+ * limrun executor carries its own CAS, so a separate cache backend (e.g. a
253
+ * repo pointing `--remote_cache` at BuildBuddy/EngFlow) splits inputs and
254
+ * outputs across two stores the executor cannot reconcile, surfacing as "Lost
255
+ * inputs no longer available remotely". Emptying it under --config=limrun
256
+ * routes caching back to the executor's CAS while leaving the repo's non-limrun
257
+ * builds (where that cache is valid) untouched.
258
+ * - The `--bes_*` flags stream the Build Event Protocol to the daemon's BES
259
+ * service, co-hosted on the same RBE frontend as the executor (hence the same
260
+ * `127.0.0.1:${port}`), powering the live + persisted console.
261
+ * `--bes_upload_mode=nowait_for_upload_complete` keeps the current build from
262
+ * blocking at exit on the BES upload (the wait moves to the start of the next
263
+ * invocation, bounded by `--bes_timeout`), while streams stay complete/acked
264
+ * for the persisted record. An older daemon without the BES service registered
265
+ * answers PublishBuildEvent with a non-fatal warning, so the flags are safe
266
+ * ahead of the image rollout.
267
+ * - `--xcode_version` pins the fleet's version: without it, a mac client
268
+ * lacking that exact version has no mutual version and silently falls back
269
+ * to its LOCAL default, shipping the wrong version to the remote worker via
270
+ * XCODE_VERSION_OVERRIDE (the worker then rejects it).
271
+ * - `--strategy=SwiftCompile=remote` / `--strategy=Genrule=remote` override
272
+ * mnemonic-specific strategies a workspace may pin (rules_swift defaults
273
+ * SwiftCompile to a local persistent `worker`; repos often pin Genrule to
274
+ * `standalone`). Those run locally and break RBE: a local Swift worker can't
275
+ * run on a Linux client at all, and on a mac it would demand the fleet's
276
+ * Xcode locally. --spawn_strategy=remote does not override per-mnemonic
277
+ * pins, so these explicit overrides are required.
278
+ * - `--ios_multi_cpus=sim_arm64` pins the app to the **arm64 iOS simulator**.
279
+ * Limrun's Mac fleet (workers and the attached simulators) is Apple Silicon,
280
+ * so the build product must be arm64. Without this, the simulator cpu follows
281
+ * the CLIENT's Bazel default (`sim_arm64` on an Apple Silicon Mac, but
282
+ * `x86_64` on an Intel Mac or a Linux client), and an x86_64 app installed on
283
+ * the arm64 fleet simulator fails to launch with "needs to be updated by the
284
+ * developer to work on this version of iOS". The pin makes the artifact match
285
+ * the fleet regardless of where bazel runs (the whole point of RBE).
286
+ * - PATH includes /usr/sbin:/sbin so genrules that probe `sysctl` (e.g.
287
+ * `hw.logicalcpu` for `make -j`) resolve it on the worker.
288
+ * - `--remote_download_outputs=minimal` keeps the built .ipa in the instance's
289
+ * CAS instead of downloading it; the daemon auto-installs it server-side from
290
+ * there (driven by the BES stream), so the bytes never round-trip. The printed
291
+ * `lim xcode rbe` output tells users to add `--remote_download_outputs=toplevel`
292
+ * on the command line when they want the .ipa materialized locally (a
293
+ * command-line flag overrides this rc setting).
294
+ * - `--extra_execution_platforms` is emitted ONLY for non-mac clients: a Linux
295
+ * host has no auto-detected darwin execution platform, so the Apple/Swift
296
+ * toolchain (exec_compatible_with macos) needs one registered to route
297
+ * actions to the mac RBE pool. On a mac it is HARMFUL: it makes bazel run
298
+ * exec-config actions on the local host instead of the remote worker, which
299
+ * then demand a local Xcode.
300
+ * - `--modify_execution_info=.*=-no-remote,.*=-no-remote-exec` strips the
301
+ * `no-remote`/`no-remote-exec` execution-info tags rules_apple sets on
302
+ * bundling/linking/signing actions (in-code on device builds, and via its
303
+ * recommended `+no-remote` bazelrc that real iOS repos carry). Under
304
+ * --config=limrun every action runs remotely, so any such tag leaves the
305
+ * action with no usable strategy ("cannot be executed with any of the
306
+ * available strategies: [remote]") and the build fails. That is the exact
307
+ * breakage a Linux client (no local Xcode) hits. This is the execution-info
308
+ * analog of the --strategy=...=remote overrides above; stripping globally is
309
+ * safe because removing a tag an action never had is a no-op.
310
+ * - A `user.limrun.bazelrc` at the workspace root is try-imported last as a user
311
+ * override hook, so callers can extend or override the generated config
312
+ * without editing this file or passing flags on the command line.
313
+ */
314
+ export function renderLimrunBazelrc(port, versionKey, isMacClient) {
315
+ const execPlatform = isMacClient ? '' : ('build:limrun --extra_execution_platforms=@build_bazel_apple_support//platforms:darwin_arm64\n');
316
+ return `# Generated by lim xcode rbe. Do not edit; rerun the command to refresh.
317
+ build:limrun --remote_executor=grpc://127.0.0.1:${port}
318
+ build:limrun --bes_backend=grpc://127.0.0.1:${port}
319
+ build:limrun --bes_upload_mode=nowait_for_upload_complete
320
+ build:limrun --bes_timeout=60s
321
+ build:limrun --remote_cache=
322
+ build:limrun --remote_default_exec_properties=OSFamily=Darwin
323
+ build:limrun --spawn_strategy=remote
324
+ build:limrun --noremote_local_fallback
325
+ build:limrun --strategy=SwiftCompile=remote
326
+ build:limrun --strategy=Genrule=remote
327
+ build:limrun --modify_execution_info=.*=-no-remote,.*=-no-remote-exec
328
+ build:limrun --xcode_version_config=//.limrun:remote_xcode_config
329
+ build:limrun --xcode_version=${shortVersion(versionKey)}
330
+ build:limrun --ios_multi_cpus=sim_arm64
331
+ build:limrun --remote_download_outputs=minimal
332
+ ${execPlatform}build:limrun --action_env=PATH=/usr/bin:/bin:/usr/sbin:/sbin
333
+
334
+ # A user.limrun.bazelrc at the workspace root is try-imported last, so it can
335
+ # extend or override anything above without editing this generated file or
336
+ # passing flags on the command line. A missing file is silently skipped.
337
+ try-import %workspace%/user.limrun.bazelrc
338
+ `;
339
+ }
340
+ /**
341
+ * Idempotently ensures the workspace .bazelrc try-imports the generated
342
+ * fragment. Creates .bazelrc when missing. Returns true when the file changed.
343
+ */
344
+ export function ensureTryImport(workspaceDir) {
345
+ const bazelrcPath = path.join(workspaceDir, '.bazelrc');
346
+ let current = '';
347
+ if (fs.existsSync(bazelrcPath)) {
348
+ current = fs.readFileSync(bazelrcPath, 'utf8');
349
+ // Match the try-import on a line basis (exact, uncommented) rather than a
350
+ // raw substring, so a commented-out occurrence (e.g. `# try-import ...`)
351
+ // doesn't make us skip wiring the active import.
352
+ const alreadyWired = current.split('\n').some((line) => line.trim() === TRY_IMPORT_LINE);
353
+ if (alreadyWired) {
354
+ return false;
355
+ }
356
+ }
357
+ const block = `${TRY_IMPORT_COMMENT}\n${TRY_IMPORT_LINE}\n`;
358
+ const next = current === '' ? block : `${current.replace(/\n*$/, '\n\n')}${block}`;
359
+ fs.writeFileSync(bazelrcPath, next);
360
+ return true;
361
+ }
362
+ /**
363
+ * Writes .limrun/{BUILD,bazelrc,.gitignore} into the workspace and wires the
364
+ * try-import. The .gitignore containing "*" makes the directory self-ignoring
365
+ * so nothing else in the user's repo needs to change.
366
+ */
367
+ export function writeRbeWorkspaceFiles(workspaceDir, xcodeVersionKey, port, isMacClient = process.platform === 'darwin', bazelMajor = detectBazelMajorVersion(workspaceDir)) {
368
+ const dir = path.join(workspaceDir, LIMRUN_DIR);
369
+ fs.mkdirSync(dir, { recursive: true });
370
+ const buildFile = path.join(dir, 'BUILD');
371
+ const bazelrcFragment = path.join(dir, 'bazelrc');
372
+ // Load the Xcode rules from apple_support on Bazel 9+, where they are no
373
+ // longer native globals. On a known Bazel 8 workspace they ARE native (and
374
+ // loading would fail), so omit the loads.
375
+ const emitLoads = isBazel9OrLater(bazelMajor);
376
+ fs.writeFileSync(buildFile, renderXcodeConfigBuild(xcodeVersionKey, emitLoads));
377
+ fs.writeFileSync(bazelrcFragment, renderLimrunBazelrc(port, xcodeVersionKey, isMacClient));
378
+ fs.writeFileSync(path.join(dir, '.gitignore'), '*\n');
379
+ const bazelrcUpdated = ensureTryImport(workspaceDir);
380
+ return { buildFile, bazelrcFragment, bazelrcUpdated };
381
+ }
382
+ //# sourceMappingURL=rbe-workspace.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbe-workspace.mjs","sourceRoot":"","sources":["src/rbe-workspace.ts"],"names":[],"mappings":"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"}
@@ -161,6 +161,26 @@ export type RbeInstallResult = {
161
161
  /** Simulator install duration in milliseconds. */
162
162
  installDurationMs?: number;
163
163
  };
164
+ export type RbeUploadOptions = {
165
+ /** Upload as a named asset: the SDK mints the presigned upload URL via assets.getOrCreate. */
166
+ assetName: string;
167
+ /** Optional asset TTL as a Go duration (e.g. "24h", "30m"; "1d" is invalid), forwarded to assets.getOrCreate. */
168
+ ttl?: string;
169
+ signedUploadUrl?: never;
170
+ } | {
171
+ /** Upload to a caller-minted presigned Limrun asset storage URL. */
172
+ signedUploadUrl: string;
173
+ assetName?: never;
174
+ ttl?: never;
175
+ };
176
+ export type RbeUploadResult = {
177
+ /** The .app bundle name of the uploaded build; it is the root directory of the uploaded tar.gz. */
178
+ appName: string;
179
+ /** CFBundleIdentifier of the uploaded app, when known. */
180
+ bundleId?: string;
181
+ /** Presigned download URL of the asset; present when uploading by assetName. */
182
+ signedDownloadUrl?: string;
183
+ };
164
184
  export type XcodeClient = {
165
185
  /**
166
186
  * Sync source code to the xcode instance. In watch mode, keeps syncing on changes.
@@ -205,6 +225,15 @@ export type XcodeClient = {
205
225
  * --remote_executor=grpc://127.0.0.1:<port>.
206
226
  */
207
227
  startRbeTunnel: (opts?: RbeTunnelOptions) => Promise<Tunnel>;
228
+ /**
229
+ * Upload the latest successful RBE build's app as an asset: the daemon
230
+ * packages the build's .app as a tar.gz (the same artifact format
231
+ * xcodebuild uploads produce) and pushes it to asset storage. Call after
232
+ * `bazel build --config=limrun` succeeds. The build is recorded on the
233
+ * instance asynchronously moments after bazel reports success, so the
234
+ * brief no-build window right after bazel exits is retried automatically.
235
+ */
236
+ uploadLatestRbeBuild: (opts: RbeUploadOptions) => Promise<RbeUploadResult>;
208
237
  /**
209
238
  * Create a new iOS simulator instance and attach it to this xcode instance.
210
239
  * Deletes the simulator if attach fails so it is never leaked. Returns the new
@@ -1 +1 @@
1
- {"version":3,"file":"xcode-instances-helpers.d.mts","sourceRoot":"","sources":["../src/resources/xcode-instances-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xcode-instances-helpers.d.mts","sourceRoot":"","sources":["../src/resources/xcode-instances-helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,KAAK,aAAa,EAAE,8BAA0B;AAClG,OAAO,EAAE,KAAK,WAAW,EAAE,4BAAwB;AACnD,OAAO,EAAQ,KAAK,gBAAgB,EAAoB,2BAAuB;AAC/E,OAAO,EAEL,KAAK,uBAAuB,EAE7B,2BAAuB;AAIxB,OAAO,EAAE,WAAW,EAAE,0BAAsB;AAE5C,OAAO,EAAkB,KAAK,MAAM,EAAE,sBAAkB;AAGxD,YAAY,EAAE,MAAM,EAAE,sBAAkB;AAExC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C;;OAEG;IACH,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACpE;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,8BAA8B,GAC9B,2BAA2B,CAAC;AAEhC,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,qBAAqB,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrD,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,MAAM,MAAM,eAAe,GAAG;IAC5B,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IACE,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC;IAClB,iHAAiH;IACjH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,KAAK,CAAC;CACzB,GACD;IACE,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,GAAG,CAAC,EAAE,KAAK,CAAC;CACb,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG;IAC5B,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,IAAI,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAEzE;;;;;;;;OAQG;IACH,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,iBAAiB,KAAK,gBAAgB,CAAC;IAE7F;;;;;OAKG;IACH,eAAe,EAAE,CACf,SAAS,EAAE,WAAW,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KACvD,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEpC;;OAEG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAE7C;;;OAGG;IACH,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzD,2CAA2C;IAC3C,MAAM,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IAEjC,0BAA0B;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IAElC;;;;OAIG;IACH,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7D;;;;;;;OAOG;IACH,oBAAoB,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAE3E;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IAErF,iFAAiF;IACjF,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAC/B;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAkD3D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAezD;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,SAAS,EAAE,MAAM;CAQ9B;AA8CD,qBAAa,cAAe,SAAQ,uBAAuB;IACnD,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;CA+R1E"}
@@ -161,6 +161,26 @@ export type RbeInstallResult = {
161
161
  /** Simulator install duration in milliseconds. */
162
162
  installDurationMs?: number;
163
163
  };
164
+ export type RbeUploadOptions = {
165
+ /** Upload as a named asset: the SDK mints the presigned upload URL via assets.getOrCreate. */
166
+ assetName: string;
167
+ /** Optional asset TTL as a Go duration (e.g. "24h", "30m"; "1d" is invalid), forwarded to assets.getOrCreate. */
168
+ ttl?: string;
169
+ signedUploadUrl?: never;
170
+ } | {
171
+ /** Upload to a caller-minted presigned Limrun asset storage URL. */
172
+ signedUploadUrl: string;
173
+ assetName?: never;
174
+ ttl?: never;
175
+ };
176
+ export type RbeUploadResult = {
177
+ /** The .app bundle name of the uploaded build; it is the root directory of the uploaded tar.gz. */
178
+ appName: string;
179
+ /** CFBundleIdentifier of the uploaded app, when known. */
180
+ bundleId?: string;
181
+ /** Presigned download URL of the asset; present when uploading by assetName. */
182
+ signedDownloadUrl?: string;
183
+ };
164
184
  export type XcodeClient = {
165
185
  /**
166
186
  * Sync source code to the xcode instance. In watch mode, keeps syncing on changes.
@@ -205,6 +225,15 @@ export type XcodeClient = {
205
225
  * --remote_executor=grpc://127.0.0.1:<port>.
206
226
  */
207
227
  startRbeTunnel: (opts?: RbeTunnelOptions) => Promise<Tunnel>;
228
+ /**
229
+ * Upload the latest successful RBE build's app as an asset: the daemon
230
+ * packages the build's .app as a tar.gz (the same artifact format
231
+ * xcodebuild uploads produce) and pushes it to asset storage. Call after
232
+ * `bazel build --config=limrun` succeeds. The build is recorded on the
233
+ * instance asynchronously moments after bazel reports success, so the
234
+ * brief no-build window right after bazel exits is retried automatically.
235
+ */
236
+ uploadLatestRbeBuild: (opts: RbeUploadOptions) => Promise<RbeUploadResult>;
208
237
  /**
209
238
  * Create a new iOS simulator instance and attach it to this xcode instance.
210
239
  * Deletes the simulator if attach fails so it is never leaked. Returns the new
@@ -1 +1 @@
1
- {"version":3,"file":"xcode-instances-helpers.d.ts","sourceRoot":"","sources":["../src/resources/xcode-instances-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xcode-instances-helpers.d.ts","sourceRoot":"","sources":["../src/resources/xcode-instances-helpers.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ const direct_instance_errors_1 = require("../internal/direct-instance-errors.js"
15
15
  const error_1 = require("../core/error.js");
16
16
  const build_settings_1 = require("../build-settings.js");
17
17
  const tunnel_1 = require("../tunnel.js");
18
+ const rbe_session_1 = require("../rbe-session.js");
18
19
  /** Default local TCP port the RBE tunnel listens on. */
19
20
  exports.DEFAULT_RBE_TUNNEL_PORT = 8980;
20
21
  function createLogger(logLevel) {
@@ -121,6 +122,18 @@ async function readJsonResponse(res, operation) {
121
122
  }
122
123
  return JSON.parse(text);
123
124
  }
125
+ /**
126
+ * Mints presigned upload/download URLs for a named asset via assets.getOrCreate,
127
+ * wrapping failures with the asset name (and the original error as cause).
128
+ * Shared by the xcodebuild `--upload` path and `uploadLatestRbeBuild`.
129
+ */
130
+ function mintAssetUploadUrls(assets, name, ttl) {
131
+ return assets.getOrCreate({ name, ...(ttl && { ttl }) }).catch((err) => {
132
+ const message = `Failed to create upload URL for asset '${name}': ${err instanceof Error ? err.message : err}`;
133
+ // @ts-ignore - not all envs have native support for cause yet
134
+ throw new Error(message, { cause: err });
135
+ });
136
+ }
124
137
  class XcodeInstances extends xcode_instances_1.XcodeInstances {
125
138
  async createClient(params) {
126
139
  let apiUrl;
@@ -268,16 +281,10 @@ class XcodeInstances extends xcode_instances_1.XcodeInstances {
268
281
  ...(options?.buildSettings && { buildSettings: options.buildSettings }),
269
282
  };
270
283
  if (options?.upload && 'assetName' in options.upload) {
271
- const uploadName = options.upload.assetName;
272
- const requestPromise = client.assets
273
- .getOrCreate({ name: uploadName })
274
- .then((asset) => {
284
+ const requestPromise = mintAssetUploadUrls(client.assets, options.upload.assetName).then((asset) => {
275
285
  request.signedUploadUrl = asset.signedUploadUrl;
276
286
  request.additionalMetadata = { signedDownloadUrl: asset.signedDownloadUrl };
277
287
  return request;
278
- })
279
- .catch((err) => {
280
- throw new Error(`Failed to create upload URL for artifact '${uploadName}': ${err instanceof Error ? err.message : err}`);
281
288
  });
282
289
  return (0, exec_client_1.exec)(requestPromise, { apiUrl, token, log });
283
290
  }
@@ -333,6 +340,50 @@ class XcodeInstances extends xcode_instances_1.XcodeInstances {
333
340
  logLevel: opts?.logLevel ?? params.logLevel ?? 'info',
334
341
  });
335
342
  },
343
+ async uploadLatestRbeBuild(opts) {
344
+ let signedUploadUrl;
345
+ let signedDownloadUrl;
346
+ if (opts.assetName !== undefined) {
347
+ if (!opts.assetName) {
348
+ throw new Error('assetName must not be empty');
349
+ }
350
+ const asset = await mintAssetUploadUrls(client.assets, opts.assetName, opts.ttl);
351
+ signedUploadUrl = asset.signedUploadUrl;
352
+ signedDownloadUrl = asset.signedDownloadUrl;
353
+ }
354
+ else {
355
+ signedUploadUrl = opts.signedUploadUrl;
356
+ }
357
+ const post = async () => {
358
+ // The daemon uploads to asset storage before responding, so this
359
+ // request can go minutes without response bytes.
360
+ const res = await proxy_transport_1.nodeProxyTransport.fetchLongRequest(`${apiUrl}/rbe/upload`, {
361
+ method: 'POST',
362
+ headers: {
363
+ 'Content-Type': 'application/json',
364
+ Authorization: `Bearer ${token}`,
365
+ },
366
+ body: JSON.stringify({ signedUploadUrl }),
367
+ });
368
+ if (res.status === 404) {
369
+ // A vanished instance and a limbuild that predates the endpoint
370
+ // 404 indistinguishably (identical bodies), and neither is the
371
+ // RbeUnsupportedError case (the daemon may well support /rbe),
372
+ // hence a plain two-cause error.
373
+ await res.text().catch(() => undefined);
374
+ throw new Error('POST /rbe/upload returned 404: the instance may no longer exist, or its limbuild ' +
375
+ 'predates RBE upload support. Recreate the instance and retry.');
376
+ }
377
+ return readJsonResponse(res, 'POST /rbe/upload');
378
+ };
379
+ // Build recording is asynchronous on the daemon (it lands moments
380
+ // after bazel reports success), so the no-build 400 fired right at
381
+ // build end is as transient as a gateway blip; retry both classes.
382
+ const retryOn = (err) => (0, rbe_session_1.isTransientError)(err) ||
383
+ ((0, direct_instance_errors_1.isDirectInstanceHttpError)(err, 400) && /no successful RBE app build/i.test(err.body));
384
+ const result = await (0, rbe_session_1.retryTransient)(post, { retryOn });
385
+ return { ...result, ...(signedDownloadUrl && { signedDownloadUrl }) };
386
+ },
336
387
  };
337
388
  }
338
389
  }