Skip to content

Chaining steps

steps:
- id: analyze
task: techlite/analyze-commits@^1.0.0
implementation: techlite/analyze-commits-alpine
dependencies:
source: "."
- id: version
task: techlite/version-bump@^1.0.0
implementation: techlite/version-bump-alpine
inputs:
change: ${outputs['analyze'].change}
dependencies:
source: "."

The value is typed and validated: if change does not satisfy the contract of version-bump, the step fails before any container starts.

A contract can declare that it writes to a directory:

dependencies:
source:
type: directory
mutable: true # whatever the worker writes comes back to the host

Without mutable, whatever the worker writes is discarded with the container. With mutable, the change is exported back and later steps mounting the same path see the result.

That is what lets version-bump change package.json and commit-and-tag commit what it changed.

Every run writes to .oren/runs/<id>/:

manifest.json # the resolved pipeline
steps/analyze/output.json
steps/analyze/status.json

Oren re-reads the outputs from that directory rather than keeping them in memory. That is what makes a local run behave the same as a CI run, where each step is a separate job and nothing survives between them.

Values marked as secret are written redacted.