The oren.yaml file
apiVersion: oren.sh/v1kind: 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.
Step fields
Section titled “Step fields”| 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.
Choosing the implementation
Section titled “Choosing the implementation”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-alpineIt 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-nodeIn CI, where there is nobody to answer, use --impl.
Expressions
Section titled “Expressions”| 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} # booleantagName: v${outputs['version'].version} # string