.revyl/config.yaml owns the build recipes used by both local and remote
builds. revyl init writes a detected starting point. Edit the YAML directly,
then run revyl config validate.
Direct builds require a project config with named profiles. If the selected file is
legacy config, revyl build stops and directs you to preview and run
revyl config migrate; it does not translate or rewrite the file implicitly.
Each invocation resolves exactly one named profile and one platform recipe:
--remote changes where the recipe runs and activates
its remote image and caches; it does not select a different recipe.
For Expo, the native prebuild recipes below run Xcode or Gradle directly and
do not require Expo authentication. If you intentionally replace them with an
EAS local-build command, install EAS CLI and add an encrypted EXPO_TOKEN
reference for unattended remote builds.
A complete example
- Expo
- React Native
- iOS
- Android
Profiles and platform recipes
Profiles name a complete build intent such asdevelopment, pull-request,
or release. Each profile may contain an ios recipe, an android recipe, or
both. There is no active or default profile stored in the file or on the
server.
revyl build applies explicit --profile and --platform values first. When
an omitted value has exactly one eligible choice, the CLI selects it. If
multiple choices remain, an interactive terminal prompts and a non-interactive
invocation fails with the valid choices and the flag to provide.
--platform accepts only ios or android; profile names are passed to
--profile.
Build fields
build.framework is required when build is present and applies to every
profile. Supported values are ios, android, react_native, expo, and
flutter.
Build-level env, secrets, and caches are inherited by every recipe. A
recipe can add or override them as described below.
The authored contract permits
app_id and output_path to be absent. A local
build-and-upload requires output_path before running commands. A remote build
may omit it and use the existing platform artifact-discovery default, but it
requires app_id before submission. A local build may run without app_id;
after producing its artifact, the existing app-selection flow selects or
creates the destination and offers to save that app ID into the selected
recipe.
All setup and build commands run in order from the project root selected by the
nearest .revyl/config.yaml (or by -C). Selecting a recipe never rewrites its
commands, publishes project configuration, or registers saved-profile identity
with the ordinary build API. The optional post-build local app binding is the
only config write in this flow; remote builds require the binding up front and
do not select, create, or save an app.
Inheritance
Build-level values are resolved into each recipe deterministically:- Recipe
enventries replace build-level values with the same key. - Effective
secretsare the ordered, de-duplicated build-level names followed by recipe names. - Caches merge by key. Paths are the ordered, de-duplicated build-level paths followed by recipe paths.
- A name cannot be both an effective environment key and a secret reference.
Artifact resolution
After the last build command exits successfully, a local build resolves its requiredoutput_path. A remote build uses its authored output_path when
present, or falls back to the existing platform default:
- iOS:
build/**/*.app; the result must be a simulator.appbundle or a supported authored archive containing one. - Android:
**/build/outputs/apk/**/*.apk;.aabartifacts are unsupported. Use an.apk.
Environment variables
Non-secret values are exported into the selected recipe’s setup and build commands. Use them for public build configuration such asEXPO_PUBLIC_* or
ENVFILE:
--env is a remote-only flag. Its values take precedence over the inherited
config environment. Local builds use the inherited config environment as
authored. Do not put credentials or tokens in env or --env; use secret
references instead.
Compilation cache controls
These reserved environment settings control automatic compilation caching:
All three default to
"1". revyl build --remote --no-cache forces them off
for one remote build and also skips configured path caches. See
Caching.
Do not put credentials or tokens in env or --env; those values are part of
the remote build request. Use encrypted build secrets instead.
Build secrets
Create or update an encrypted organization secret through the masked prompt:--secret flags:
.env.local automatically. Keep it out of version
control. List or delete stored names without revealing their values:
Remote source
revyl build --remote archives the active Git worktree, including its current
unignored working-tree changes, and sends the selected project directory as the
runner workdir. This preserves workspace files and shared packages for nested
monorepo projects while commands and artifact paths remain relative to the
project containing .revyl/config.yaml. It does not publish the config or send
saved-profile identity. The profile name and platform remain invocation-local
selection inputs.
CLI reference
Managing running remote builds:
Timeout
Remote builds are stopped by the server when they exceed their timeout: 60 minutes by default, up to a maximum of four hours. Set a recipe-specific value:revyl build cancel <build-job-id>.
Related
- Caching: compilation and configured path caches
- Toolchain Images: available images and installed tools
- Artifact Requirements: supported
.appand.apkartifacts