Skip to main content

Composition contract

A composition source exports self-describing documents. The primary contract is a Composition document grouped under a Stack package. Compositions support both inline authoring (single file) and split-kind authoring (multiple files).

Document kinds

KindPurposeRequired fields
CompositionType binding, defaults, referencesmetadata.name, spec.type, spec.defaultJob, spec.jobs
ComponentSchemaInput validation contractmetadata.name, spec.type, spec.schema
JobTemplateReusable execution templatemetadata.name, spec.steps
ExecutionProfileBehavior overlay per contextmetadata.name, spec.jobs

Composition document

A Composition is the public facade for a component type. It can define everything inline or reference split-kind documents via schemaRef, templateRef, and profileRef.

Required fields (inline):

  • metadata.name
  • spec.type
  • spec.defaultJob
  • spec.parameterSchema or spec.schemaRef
  • spec.jobs

Example (split-kind):

apiVersion: sourceplane.io/v1alpha1
kind: Composition
metadata:
name: terraform
spec:
type: terraform
description: Terraform validation jobs for infra components
schemaRef:
name: terraform-component
defaultJob: validate
defaultProfile: verify
jobs:
- name: validate
templateRef:
name: terraform-validate
profiles:
- name: pull-request
profileRef:
name: terraform-pull-request
- name: verify
profileRef:
name: terraform-verify
- name: release
profileRef:
name: terraform-release

Example (inline):

apiVersion: sourceplane.io/v1alpha1
kind: Composition
metadata:
name: helm
spec:
type: helm
defaultJob: deploy
parameterSchema:
$schema: http://json-schema.org/draft-07/schema#
type: object
properties:
type:
const: helm
parameters:
type: object
properties:
chart:
type: string
jobs:
- name: deploy
runsOn: ubuntu-22.04
timeout: 15m
retries: 2
steps:
- name: deploy
run: helm upgrade --install {{.orun.component.name}} {{.parameters.chart}}

defaultJob must be explicit. Orun no longer relies on implicit "first job wins" behavior.

ComponentSchema document

Defines the JSON Schema validation contract for component parameters. Referenced by schemaRef.name in the Composition.

apiVersion: sourceplane.io/v1alpha1
kind: ComponentSchema
metadata:
name: terraform-component
spec:
type: terraform
schema:
$schema: http://json-schema.org/draft-07/schema#
type: object
required: [name, type, parameters]
properties:
name:
type: string
type:
const: terraform
parameters:
type: object
required: [stackName, terraformDir]
properties:
stackName:
type: string
terraformDir:
type: string
terraformVersion:
type: string
additionalProperties: false
additionalProperties: true

JobTemplate document

Defines a reusable job with capability-tagged steps. Referenced by templateRef.name in the Composition's jobs list.

apiVersion: sourceplane.io/v1alpha1
kind: JobTemplate
metadata:
name: terraform-validate
spec:
description: Validate Terraform stacks
runsOn: ubuntu-22.04
timeout: 20m
retries: 0
labels:
scope: infra
capabilities:
- terraform.setup
- terraform.fmt
- terraform.init
- terraform.validate
- terraform.plan
steps:
- id: setup
name: setup
capability: terraform.setup
use: hashicorp/setup-terraform@v4
with:
terraform_version: "{{.parameters.terraformVersion}}"
- id: fmt
name: fmt
capability: terraform.fmt
run: terraform fmt -check
onFailure: stop
- id: init
name: init
capability: terraform.init
run: terraform init -backend=false
onFailure: stop
- id: validate
name: validate
capability: terraform.validate
run: terraform validate -no-color
onFailure: stop
- id: plan
name: plan
capability: terraform.plan
run: terraform plan -no-color
onFailure: stop

The capability field on each step enables semantic selection by profiles.

ExecutionProfile document

Defines which steps to run and how to override them for a specific execution context. Referenced by profileRef.name in the Composition's profiles list.

apiVersion: sourceplane.io/v1alpha1
kind: ExecutionProfile
metadata:
name: terraform-pull-request
spec:
description: Fast PR validation with speculative planning
jobs:
validate:
includeCapabilities:
- terraform.setup
- terraform.fmt
- terraform.init
- terraform.validate
- terraform.plan
stepOverrides:
init:
run: terraform init -backend=false
plan:
run: terraform plan -no-color -lock=false

Profiles can also declare policies for enforcement:

spec:
policies:
requireCleanGitTree: true
requirePinnedTerraformVersion: true
requireApproval: true

Profile step selection

Profiles select which steps to run using one of two mechanisms:

  • includeCapabilities (recommended): Selects steps by their capability tag. This is resilient to step ID renames.
  • stepsEnabled (legacy): Selects steps by their id or name. Works with inline compositions that don't use capabilities.

Profile step overrides

stepOverrides patches specific step fields without duplicating the entire step definition:

stepOverrides:
init:
run: terraform init -backend=false
plan:
with:
lock: "false"

Stack manifest

A Stack manifest (stack.yaml) declares package metadata and an optional OCI registry target.

apiVersion: orun.io/v1
kind: Stack
metadata:
name: my-platform-stack
version: 1.0.0
description: Platform compositions
owner: my-org
registry:
host: ghcr.io
namespace: my-org
repository: my-platform-stack
visibility: public

Package layout (split-kind):

my-platform/
├── stack.yaml
└── compositions/
└── terraform/
├── composition.yaml
├── schema.yaml
├── jobs/
│ └── terraform-validate.yaml
└── profiles/
├── terraform-pull-request.yaml
├── terraform-verify.yaml
└── terraform-release.yaml

Template namespaces

Job steps resolve against a namespaced template context:

NamespacePurposeExample
.orunSystem/compiler-provided context{{ .orun.component.name }}
.parametersResolved component parameters{{ .parameters.terraformDir }}
.envResolved runtime env map{{ .env.AWS_REGION }}

.orun fields

  • .orun.component.name — component name
  • .orun.component.type — composition type
  • .orun.component.domain — group/domain name
  • .orun.environment.name — environment name
  • .orun.composition.type — composition type
  • .orun.profile.name — execution profile name
  • .orun.job.id — job ID (e.g. api.dev.deploy)
  • .orun.job.name — job name (e.g. deploy)

.parameters fields

All resolved component parameters after merge (parameterDefaults + component parameters + subscription parameters):

  • .parameters.terraformDir
  • .parameters.chartPath
  • .parameters.nodeVersion

.env fields

Runtime environment variables declared in intent or component env blocks:

  • .env.AWS_REGION
  • .env.TF_LOG

Execution semantics

Jobs can declare: runsOn, timeout, retries, labels, capabilities, steps.

Steps can declare: run or use, capability, phase, order, with, env, shell, working-directory, timeout, retry, onFailure.

Breaking changes (v2.0.0)

Flat template context removed. Prior to v2.0.0, step templates could use flat context variables like {{ .component }}, {{ .environment }}, {{ .type }}. These have been removed. All templates must use the namespaced form:

Old (removed)New (required)
{{ .component }}{{ .orun.component.name }}
{{ .environment }}{{ .orun.environment.name }}
{{ .type }}{{ .orun.component.type }}

PlanJob.config removed. The config field on plan job output has been removed. Use parameters instead.

inputs/defaults renamed. Component inputs is now parameters. Intent defaults is now parameterDefaults. The old names are no longer accepted.