Skip to content

The oren.yaml file

apiVersion: oren.sh/v1
kind: Pipeline
pipelines:
dev:
name: Development
steps:
- id: analyze
task: techlite/analyze-commits@^1.0.0
implementation: techlite/analyze-commits-alpine
name: Version analysis
inputs:
defaultChange: minor
dependencies:
source: "."

One file can hold several pipelines — dev, production, release. You choose which to run: oren run production.

Field What it does
task reference to the contract, with an optional version range
id identifier within the pipeline; later steps reference the output by it
name label shown while running
inputs values for the inputs declared in the contract
dependencies how each resource is satisfied
implementation which implementation runs the step — required
enabled false removes the step; an expression over properties/env decides per environment — see Per-environment properties
continueOnError carries on even if the step fails

id falls back to the task name when omitted, and becomes required when the same task appears more than once.

Every step names its implementation. There is no default, not even when there is a single candidate:

- id: analyze
task: techlite/analyze-commits@^1.0.0
implementation: techlite/analyze-commits-alpine

It looks redundant when there is only one option, and that is exactly when it matters. If the field could be implicit, the pipeline would work today and break the day someone published a second implementation — another person, another repository, without anyone touching yours. What runs has to be a function of what is written here, not of what happens to be published at the time.

For the same reason Oren never chooses for you when there are several. oren add shows the cost of each and asks:

2 implementations — which one?
1) low techlite/analyze-commits-alpine
2) low techlite/analyze-commits-node

In CI, where there is nobody to answer, use --impl.

Scope Example
another step’s output ${outputs['analyze'].change}
environment variable ${env.OREN_GIT_TOKEN}
environment property ${properties.deploy.region}

Only variables prefixed with OREN_ are visible — the pipeline does not see your whole environment.

A string that is exactly an expression keeps the original type; in mixed text the value is interpolated:

incrementMinor: ${outputs['analyze'].minor} # boolean
tagName: v${outputs['version'].version} # string