Skip to main content
Job installations deploy job services to environments. Jobs can run on a cron schedule, be triggered manually via Run Now, or both. Configure environment variables, resource limits, and service-specific settings for your batch jobs, migrations, and scheduled tasks.

Properties

service

string — required Name of the job service to install.

environment

string — required Target environment for this installation.

name

string — optional Custom name for this installation. If not specified, uses the service name.

namespace

string — optional Kubernetes namespace to install into. If not provided, uses the environment’s default namespace, which has the same name as the environment. Cannot be changed after install. See Namespaces.

releaseChannel

string — optional Release channel to follow for this installation. If not specified, uses the environment’s channel. Mutually exclusive with branch.

branch

string — optional Branch to track for this installation. The service must have the branch listed in build.branches. When set, the installation deploys whatever was last built on that branch. Mutually exclusive with releaseChannel.

dependencies

array — optional Installations that must be ready before this installation installs for the first time. Ryvn holds the first install until every entry is satisfied. After that, dependencies hold nothing: upgrades, configuration changes, and secret rotations deploy even while a dependency is being reinstalled. Each entry sets exactly one key: Dependencies have no version bounds; version requirements belong in the service’s release dependencies. When this installation’s release depends on a service and dependencies names installations of that service, the release’s range is checked against the named installations only. See Installation dependencies. You can name several installations of the same service. An entry can’t name this installation, name its own service with service, repeat another entry, sit beside a serviceInstallation entry of the same service, or form a cycle with other installations’ dependencies. Installations created by a blueprint take their dependencies from the blueprint; to set them directly, exclude the installation from blueprint updates first. See Installation Dependencies.

variableGroups

array — optional List of variable group references to link to this installation. Each entry references a variable group by name that must already exist in the target environment. Variable groups provide shared sets of environment variables across installations. Every key in a linked group is injected as an environment variable with the same name (via envFrom), so name group keys after the environment variables your app reads. You don’t need secretKeyRef entries to consume them.

variableGroups[].name

string — required Name of the variable group in the target environment.

env

array — optional Environment variables for the job service. Each variable specifies whether it’s a secret. Ryvn also injects RYVN_RELEASE_VERSION automatically with the installation’s release version. This value is managed by Ryvn.

env[].key

string — required Environment variable name.

env[].isSecret

boolean — required Whether this environment variable is a secret. If true, value must be set on the platform when the blueprint is installed.

env[].value

string — conditional Environment variable value. Cannot be set if isSecret is true.

env[].valueFromInput

object — optional Reference to a blueprint input for the value. If the referenced input has a condition that evaluates to false, this environment variable is automatically omitted.

env[].valueFromOutput

object — optional Reference to an output from a service installation or blueprint installation. Exactly one of serviceInstallation or blueprintInstallation must be specified.
Prefer valueFromOutput over template functions like {{ (serviceInstallation "...").outputs.x }} or {{ (blueprintInstallation "...").outputs.x }} in env var values. Template functions render outputs as plaintext, which means secrets end up in manifests and logs. valueFromOutput routes secret outputs through the secrets system so they are never exposed in plaintext.
Properties:
To concatenate an output with other values, use valueFromOutput to set a base env var and reference it with $(VAR) syntax in a subsequent variable. The referenced variable must appear earlier in the list:

config

string or array — optional Service configuration. For jobs, this is the Helm chart values.yaml content. Configure scheduling, concurrency, resources, and more.

config.image

object — optional Container image configuration.

config.serviceAccount

object — optional Service account configuration.

config.podAnnotations

object — optional Kubernetes annotations for pods.

config.podLabels

object — optional Kubernetes labels for pods.

config.podSecurityContext

object — optional Security context for the pod.

config.securityContext

object — optional Security context for the container.

config.schedule

string — optional Cron schedule expression for the job. When omitted, the job is deployed as a manual-only job that never runs automatically and can only be triggered via the Run Now button in the UI or the trigger-job CLI command.

config.concurrencyPolicy

string — optional How to handle concurrent executions. Valid values: Forbid, Allow, Replace. Defaults to Forbid.

config.startingDeadlineSeconds

integer — optional Time in seconds for starting the job if it misses scheduled time.

config.successfulJobsHistoryLimit

integer — optional Number of successful job executions to keep. Defaults to 3.

config.failedJobsHistoryLimit

integer — optional Number of failed job executions to keep. Defaults to 1.

config.suspend

boolean — optional Suspend job scheduling. Defaults to false.

config.backoffLimit

integer — optional Number of retries before considering a job as failed. Defaults to 1.

config.ttlSecondsAfterFinished

integer — optional Time to live in seconds after job finishes before automatic cleanup.

config.labels

object — optional Additional labels for the CronJob metadata.

config.annotations

object — optional Additional annotations for the CronJob metadata.

config.restartPolicy

string — optional Pod restart policy. Valid values: Never, OnFailure. Defaults to Never.

config.command

array — optional Override container’s default entrypoint.

config.args

array — optional Arguments to container’s entrypoint.

config.env

array — optional Environment variables passed to the container (in addition to the installation-level env field).

config.envFrom

array — optional Environment variables from ConfigMaps or Secrets.

config.resources

object — optional Container resource requests and limits.

config.volumes

array — optional Additional volumes for the job.

config.volumeMounts

array — optional Additional volume mounts for the container.

config.nodeSelector

object — optional Node selector for pod scheduling.

config.tolerations

array — optional Tolerations for pod scheduling.

config.affinity

object — optional Affinity rules for pod scheduling.

resources

object — optional Resource requirements for the service.

resources.cpuCores

number — required Number of CPU cores. Can be fractional (e.g., 0.5, 1, 2).

resources.memoryMB

integer — required Memory in megabytes. Must be a positive integer.

lifecycle

object — optional Lifecycle hooks automatically trigger a job installation after the declaring installation completes a lifecycle phase. Useful for release-phase work such as running database migrations after an application or Terraform module has been installed or upgraded.
Functionality is limited in this release:
  • Job targets only. A hook’s run field must name a job ServiceInstallation in the same environment.
  • One hook per phase. Each phase accepts at most one hook entry.
When the parent’s HelmInstallV1, HelmUpgradeV1, HelmUpdateValuesV1, HelmUpdateSecretsV1, or TerraformApplyV1 task completes successfully, Ryvn auto-queues a HelmTriggerJobV1 run against the configured job for the matching phase. Hook progress and failures are tracked separately from the parent installation’s own operational status. Lifecycle-triggered runs are labeled “Lifecycle hook job run” in the activity feed to distinguish them from manual Run Now triggers.

lifecycle.postInstall

array — optional Hooks to run after the installation’s first install completes successfully.

lifecycle.postInstall[].run

string — required Name of the job ServiceInstallation to run when the phase fires. The target must exist in the same environment as the declaring installation. Inside a blueprint, template syntax is permitted and is resolved before the lifecycle configuration is persisted.

lifecycle.postUpgrade

array — optional Hooks to run after the installation’s upgrade completes successfully. Same rules as postInstall.

lifecycle.postUpgrade[].run

string — required Same semantics as lifecycle.postInstall[].run.

lifecycle.postUpdate

array — optional Hooks to run after the installation’s config or secret update completes successfully. Same rules as postInstall.

lifecycle.postUpdate[].run

string — required Same semantics as lifecycle.postInstall[].run.

Examples

ETL job with scheduling:
With variable groups:
Manual-only migration job that auto-runs after every install and upgrade: