Who This Is For
Use remote builds when your team needs dedicated mobile build capacity without managing runner infrastructure. This is especially useful when:- Your CI provider cannot supply enough mobile build capacity.
- Your builds need pinned Xcode/macOS or Android SDK/JDK/Gradle environments.
- You want Revyl to produce the simulator
.appor emulator-installable.apkand immediately register it for testing. - Your build depends on private package mirrors or artifact stores that require a private network path.
Get Access
Remote builds require a dedicated build runner provisioned for your organisation. If you don’t have one yet, book a call to get set up:Book a Demo
Schedule a call to provision dedicated build runners for your org.
Prerequisites
Before using remote builds, make sure you have:- Revyl CLI installed and authenticated. See CLI docs.
- An app registered in Revyl. Create one from the Apps page or via the CLI.
- A
.revyl/config.yamlbuild command for the target platform. - A dedicated build runner provisioned for your org. Revyl confirms runner availability before uploading source.
Configuration
Add abuild section to your .revyl/config.yaml:
| Field | Required | Description |
|---|---|---|
build.system | No | Build system label, such as Xcode, ReactNative, Expo, or Bazel. |
build.platforms.ios.app_id | Yes | UUID of your app in Revyl. Find it on the Builds page or create it with the CLI. |
build.platforms.ios.command | Yes | Build command to run on the remote Mac runner. Remote builds are optimized for iOS simulator builds that produce an .app. |
build.platforms.ios.setup | No | Pre-build setup command, such as dependency install or package-manager auth setup. |
build.platforms.ios.output | No | Optional simulator .app path or glob. Remote iOS builds use it first, then fall back to DerivedData discovery. |
build.platforms.ios.scheme | No | Xcode scheme. The CLI can also override this with --scheme. |
build.platforms.android.app_id | Yes for Android | UUID of your Android app in Revyl. |
build.platforms.android.command | Yes for Android | Build command that produces an emulator-installable APK. V1 rejects AAB artifacts. |
build.platforms.android.setup | No | Pre-build setup command, such as dependency install. |
build.platforms.android.output | Recommended | APK path or glob relative to the source root. Required when multiple APKs are produced. |
.revyl/config.yaml schema, see the Project Configuration reference.
Command Examples
React Native with CocoaPods:Usage
- Check that a build runner is available for your org
- Package the current working tree by default
- Upload the archive to Revyl
- Trigger the remote build
- Stream build logs until completion
- Register the resulting
.appor.apkas a new build version
Large Repositories and Generated CI Pipelines
Remote builds use a source-upload flow: the CLI packages source, uploads that archive, and asks the dedicated runner to build it.revyl build remote
includes dirty working-tree edits by default; pass --committed-only to build
only the committed tree at HEAD. That path is useful for self-contained mobile
projects, but it is not
the best contract for very large monorepos, generated GitLab child pipelines,
or build graphs that already rely on prebuilt artifacts and cache heuristics.
For those systems, use an artifact-first handoff:
Repo-Backed Remote Builds
For large monorepos where you still want Revyl to run the mobile build step, use a repo-backed remote build instead of uploading a fresh source archive from the CLI. In this mode, Revyl’s dedicated runner keeps a cached checkout or mirror, fetches the requested ref, pulls the needed LFS objects, optionally checks out only the relevant subdirectory, and then runs the configured build command. The configuration shape is:Bazel
Bazel is supported today through the same command/output contract used by local and CI uploads. Configure the Bazel target as the build command and pointoutput at the generated mobile artifact:
Private Dependencies
Many enterprise mobile builds need private package mirrors, artifact stores, Git mirrors, license servers, or internal APIs. Revyl supports these with a dedicated runner plus a private network path.Standard Path: No Private Dependencies
If your dependencies are reachable from the public internet, no extra customer networking is required:- Revyl provisions a dedicated runner for your org.
- You configure
.revyl/config.yaml. - You run
revyl build remote --platform iosorrevyl build remote --platform android. - Revyl uploads source, builds on the runner, and registers the
.appor.apk.
PrivateLink Path: Private Dependencies Required
If your build dependencies are private, Revyl can route runner traffic through AWS PrivateLink. Traffic path:| Input | Example |
|---|---|
| First repo/build target | GitLab job, Xcode workspace/project, Gradle module, scheme/flavor |
| Build command | xcodebuild -workspace ios/App.xcworkspace -scheme App -sdk iphonesimulator -configuration Debug build or ./gradlew assembleDebug |
| Setup command | npm install && cd ios && pod install, pnpm install, or project-specific setup |
| Expected artifact | Simulator .app or Android .apk |
| Private dependency list | Artifactory, npm mirror, Maven mirror, CocoaPods mirror, private Git, license server |
| AWS region | For example us-west-2 |
| Endpoint service name | com.amazonaws.vpce.<region>.vpce-svc-... |
| Ports/protocols | HTTPS 443, SSH 22, registry-specific TCP |
| DNS name | The hostname the build tools should use |
| Credentials/secrets | Package manager tokens, certs, Git credentials |
- Dedicated runner provisioning, including M4-class Mac capacity for iOS and Ubuntu Android build runners.
- Host setup for required Xcode, Android SDK/JDK/Gradle, proxy, and dependency configuration.
- Runner org labels and queue routing.
- Source upload, log streaming, build registration, and cleanup.
- Consumer interface endpoint setup after your team authorizes Revyl’s AWS principal.
- Runner proxy configuration and validation from the Mac host.
- Choosing the first build target.
- Exposing the private dependency through your endpoint-service pattern.
- Authorizing Revyl’s AWS principal.
- Providing dependency DNS/auth details.
- Confirming whether cross-region PrivateLink is allowed when Revyl and your services are in different AWS regions.
Optional: Private Access to the Revyl API
The PrivateLink path above is for build dependencies that the Revyl runner must reach. Some teams also require their CI system to call the Revyl API or upload source archives through a private path. Treat that as a separate control-plane setup:- Your CI still uses the same Revyl CLI commands.
- Revyl provides the API endpoint details for the private path.
- Your networking team confirms DNS, endpoint policy, and allowed VPCs.
- The build-runner dependency path and the CI-to-Revyl API path can be rolled out independently.
Troubleshooting
No build runner available
Private dependency unreachable
Symptoms:npm install,pod install,swift package resolve, or artifact downloads hang or fail.- The build log shows DNS failures, TCP timeouts, proxy errors, or package-manager authentication errors.
- The endpoint service is approved for Revyl’s AWS principal.
- The endpoint connection is accepted and healthy.
- The dependency hostname resolves on the runner through the intended private path.
- The required port is open from the endpoint service to the NLB target.
- Package-manager credentials are available to the build.
Artifactory, npm, Maven, CocoaPods, or SPM auth fails
Remote builds run in a clean runner environment. Make sure your setup command can access the same credentials your CI job uses:- npm:
.npmrcor environment token. - Maven/Gradle:
settings.gradle,gradle.properties, or repository credentials. - CocoaPods: private specs repo access and Git credentials.
- Swift Package Manager: Git/token access for private packages.
- Artifactory: registry URL, token, and certificate configuration.
Build timeout
Remote builds have a 30-minute execution timeout. If your build consistently times out:- Use
--cleansparingly (cold builds are slower) - Check if your setup command installs unnecessary dependencies
- Consider splitting large monorepos into smaller build targets
Wrong scheme or missing artifact
If the build exits successfully but no simulator.app is registered:
- Confirm the scheme builds a simulator app, not only tests or a device-only target.
- Include
-sdk iphonesimulator. - Confirm the expected product appears under Xcode DerivedData.
- Try
--scheme <SchemeName>if your config omits the scheme.
- Confirm the command produces an APK, not an AAB.
- Set
build.platforms.android.outputwhen multiple APKs are produced. - Use a debug/emulator-installable artifact for V1.
Working-tree changes
revyl build remote includes dirty working-tree edits by default so agent loops can build the code they just changed. Use --committed-only when you want the old committed-tree behavior. The compatibility alias revyl build upload --remote keeps its legacy committed-only default unless you pass --include-dirty.
Next Steps
Builds Overview
Manage builds and versions
iOS Simulator Builds
Build locally with Xcode
CI/CD
Automate builds in your pipeline
Need help? Contact [email protected]