build step instead of copying that config into every pipeline.
Depending on the module, a build produces a container image (pushed to ECR), a directory of static assets (uploaded to S3), or a Lambda zip package (uploaded to S3).
Builds only run through pipelines. There is no standalone build command or dashboard button.
You either add a
build step to a Ravion pipeline, or build in an external CI
system and hand Ravion the finished artifact at deploy time.Build config is part of the module config
You configure a module’s build the same way you configure everything else about it: through the module instance’s inputs, alongside its runtime config. There is no separate build file. For example, theweb-app module in a project config file sets its build inputs next to its port and health check:
Running a build
Add abuild step to your pipeline and point it at the module instance:
module_instanceaccepts a unique ID (mi_…),environment.module, orproject.environment.module.inputpasses build-time values the module accepts, such as a tag, branch, or commit. Check the module’s docs or schema (ravion module schema <module-type>) for what it takes.
Building something that isn’t a module? Use the standalone
build:image or build:static CI
steps, which take the full build config inline.Docker layer cache
Container image builds reuse Docker layer cache from the module’s ECR repo, so repeat builds only rebuild the layers that changed. There is nothing to configure: the module definition points the build at a stable cache image in that repo, and every build also writes a dedicatedbuildcache image holding the layers of each build stage.
Static asset builds and Lambda builds — zip package or container image — don’t use registry layer cache.
To get the most out of the cache:
- Order your
Dockerfilefrom least- to most-frequently-changed. Copy manifest files (package.json,go.mod,requirements.txt) and install dependencies before copying the rest of the source. That way a source change doesn’t invalidate the dependency layer. - Pin base images by digest (or a specific tag) so the base layer is stable across builds.
- Keep the build in one ECR repo. Cache comes from the repo the build pushes to, so a module that pushes elsewhere between builds loses reuse.
Choosing the cache source yourself
Module builds pin the cache source for you and expose no input for changing it. If you need control over it, use a standalonebuild:image step and set cache_from on its builder block:
tag and digest are optional, accept template tokens, and resolve against the step’s first ECR destination — so the tag or digest you name has to exist in that repo. digest wins if you set both. Omit cache_from entirely and the step falls back to the most recent image in that repo. See CacheFromConfig for the full field list.
Inspecting builds
A build is a pipeline step execution — there’s no separate build entity or command. Find it in the pipeline run:Feeding the artifact to a deploy
Every build step outputsbuild_ref — the canonical reference to the artifact it produced:
Pass it to the deploy step:
image_uri, image_digest, s3_bucket, s3_directory, s3_key, and more.
Building outside Ravion
You don’t have to build in Ravion at all. Module definitions typically include a prebuilt image or package option for teams that build in GitHub Actions, CircleCI, or another external system. For example,rvn-ecs-web supports these build_source values:
So with an external build, the flow is: your CI builds and pushes the image, then triggers the release with the artifact reference:
For module authors
How a definition declares its build config — builders (dockerfile, railpack), destinations, build inputs, and templating — is covered in the module definition schema.