limrun-bazel
The default way to build any Bazel workspace on Limrun: build its iOS and Android targets on Limrun's shared build plane with `lim bazel setup` and `bazel build --config=limrun`, from any environment (Linux, Windows, macOS, VM, container, CI), with one remote cache shared across the organization. Use when the project is a Bazel workspace (MODULE.bazel) with rules_apple or rules_android and the user wants to build it remotely, run the built app on a Limrun simulator or emulator, set up Bazel remote execution in CI, or fix a `--config=limrun` build that fails on authentication, workers, or missing MODULE.bazel lines. limrun-xcode-bazel covers only the legacy `lim xcode rbe` flow; use it only when the workspace already runs on `lim xcode rbe` or the user asks for it. For non-Bazel Android builds, use limrun-gradle.
Savant verdict: Pending analysis
Imported from the source hub; Savant's analysis is still running.
Live evaluation
Not evaluated yet. Workspaces can request a live evaluation.
Safety (NVIDIA SkillSpector)
Scan pending.
Structure
- No license declaredConfirm you may reuse this skill before importing it into your repository.
SKILL.md
--- name: limrun-bazel description: "The default way to build any Bazel workspace on Limrun: build its iOS and Android targets on Limrun's shared build plane with `lim bazel setup` and `bazel build --config=limrun`, from any environment (Linux, Windows, macOS, VM, container, CI), with one remote cache shared across the organization. Use when the project is a Bazel workspace (MODULE.bazel) with rules_apple or rules_android and the user wants to build it remotely, run the built app on a Limrun simulator or emulator, set up Bazel remote execution in CI, or fix a `--config=limrun` build that fails on authentication, workers, or missing MODULE.bazel lines. limrun-xcode-bazel covers only the legacy `lim xcode rbe` flow; use it only when the workspace already runs on `lim xcode rbe` or the user asks for it. For non-Bazel Android builds, use limrun-gradle." user-invocable: true effort: high --- # Bazel on Limrun's build plane `lim bazel setup` points a Bazel workspace at Limrun's build plane: Apple actions run on Limrun's Macs, Android actions on Limrun's Linux workers, and every build of the organization shares one remote cache. Bazel keeps running where it already does; no local Xcode or Android SDK is needed for the remote actions. ## Auth and CLI Install with npm: `npm install --global lim` (0.44.0 or later). The npm package also installs `lim-bazel-credentials`, the credential helper Bazel calls; the standalone tarball and DotSlash builds do not put it on `PATH`, so Bazel cannot authenticate with them. Auth is `lim login` or `LIM_API_KEY` (it may already be set even when the shell does not show it; check before asking). The helper reads only `lim login` or `LIM_API_KEY`, never a key passed with `--api-key`. The CLI is the source of truth: if a flag errors, check `lim bazel setup --help` instead of guessing. ## Set up Run inside the workspace (it walks up to the directory with `MODULE.bazel`): ```bash lim bazel setup ``` It needs Bazel 8 or later and `rules_apple` or `rules_android` in the root `MODULE.bazel`. It writes a gitignored `.limrun/` with the `--config=limrun` configuration and adds a `try-import` to `.bazelrc`. Nothing secret is written: Bazel asks the credential helper for a short-lived token. - **Region:** setup picks the closest region that runs a build plane. `--region <name>` pins one. - **Android:** Linux workers need `rules_cc`, `rules_java`, `protobuf` and `hermetic_android_toolchains` in the root `MODULE.bazel`. Setup prints the missing lines and asks; `--yes` adds them without asking. Without a terminal and without `--yes` it stops and prints the lines, so pass `--yes` in scripts and CI. - **Java runtime:** a `--java_runtime_version` already in `.bazelrc` is kept; otherwise the limrun config uses `remotejdk_17`. - Re-run setup after upgrading the CLI or when the workspace starts using Apple or Android rules. Do not hand-edit `.limrun/`. ## Build ```bash bazel build --config=limrun //your:target ``` Build actions run remotely and Bazel downloads only the top-level outputs (the `.apk` or `.ipa`). Without `--config=limrun`, Bazel builds as before. Own flags for the limrun path go in `user.limrun.bazelrc` at the workspace root; the generated config imports it last and it survives re-running setup. In CI: install `lim` from npm, set `LIM_API_KEY` as a secret, run `lim bazel setup --yes`, then build with `--config=limrun`. ## Run the app Build for the simulator or emulator, then install the `.ipa` or `.apk` path Bazel prints: ```bash lim ios create && lim ios sync bazel-bin/App/App.ipa lim android create && lim android install-app bazel-bin/app/app.apk ``` Re-run `lim ios sync` after each rebuild; it sends only the difference. To drive the running app, use limrun-ios-simulator or limrun-android-emulator. ## Check results The console's Bazel page (`https://console.limrun.com/bazel`) lists the organization's builds from every region, with live output for running builds and the remote cache hit rate per build. ## When a build fails - **Bazel cannot authenticate** or reports a credential helper error: check that `lim-bazel-credentials` is on `PATH` (npm install) and that `lim login` or `LIM_API_KEY` is set where Bazel runs. - **"the build plane could not start a worker"** or **"no linux worker is free"**: transient capacity; retry the build. - **Missing `@androidsdk` or Android toolchain errors:** the `MODULE.bazel` lines are missing. Re-run `lim bazel setup` and accept them. - **Each region keeps its own cache:** the first build in a new region starts cold.