Configuration Reference#
Complete schema for pypeline.yaml.
Top-Level Structure#
inputs:
<input_name>:
type: <type>
description: <text>
default: <value>
pipeline:
# List of steps (flat)
- step: StepName
...
# OR grouped steps
group_name:
- step: StepName
...
Note
A malformed pypeline.yaml (a wrong type or a missing required field) is reported with its exact file:line:column, pointing at the offending step or input instead of the top of the file, so you can jump straight to it.
Step Configuration#
Field |
Type |
Required |
Description |
|---|---|---|---|
|
string |
✓ |
Step class name |
|
string |
Python module path |
|
|
string |
Local |
|
|
string/list |
Shell command |
|
|
string |
Override class name |
|
|
string |
Step description |
|
|
integer |
Timeout in seconds |
|
|
object |
Step-specific config |
Note
One of module, file, or run is required.
Step Types#
Module Step#
- step: CreateVEnv
module: pypeline.steps.create_venv
config:
python_version: "3.13"
File Step#
- step: MyStep
file: steps/my_step.py
config:
param: value
Command Step#
- step: Lint
run: ruff check .
# Or as list
- step: Test
run: [pytest, -v, --cov]
# Multiple commands (GitHub Actions style)
- step: QualityChecks
run: |
ruff check .
pytest -v --cov
Including Other Pipeline Files#
A pipeline entry can pull in the steps of another pypeline file with include: instead of step:. The included steps are spliced in at that position, so where the include sits is where its steps run:
# pypeline.yaml
pipeline:
- include: bootstrap.pypeline.yaml # its steps run here, before the rest
- step: Build
run: cmake --build build
# bootstrap.pypeline.yaml — a valid pypeline file on its own
pipeline:
- step: CreateVEnv
module: pypeline.steps.create_venv
- step: InstallDeps
run: uv sync
Path is resolved relative to the including file. Includes may be nested (an included file may include another); a cycle is reported as an error.
The included file must define a flat list of steps (no groups).
A fragment runs both ways.
bootstrap.pypeline.yamlis a normal pypeline file, so you can run it on its own (pypeline run --config-file bootstrap.pypeline.yaml) and include it.
Important
A step’s output directory is determined by the file where the step is defined, never by the file that includes it. So a step produces the same outputs — and reuses the same incremental cache — whether you run its file standalone or as part of a larger pipeline. Splicing an include into a group changes execution order only, not where the included steps write.
Note
Includes do not defer step-class resolution: a fragment that installs the package providing a later step cannot bootstrap that step in the same run (the later step’s class must already be importable). Use include: to organise and reuse steps whose classes are already available.
Built-in Steps#
CreateVEnv#
Creates a Python virtual environment.
Config |
Type |
Default |
Description |
|---|---|---|---|
|
string |
— |
Python version (e.g., |
|
string |
— |
Path to Python (legacy; prefer |
|
string |
|
Package manager |
|
string |
— |
Custom bootstrap script |
- step: CreateVEnv
module: pypeline.steps.create_venv
config:
python_version: "3.13"
python_package_manager: uv>=0.6
Note
Prefer python_version over python_executable. The bootstrap environment is cached per Python major.minor; pinning python_version keeps that identity stable, while relying on a bare python_executable (e.g. python3) lets it drift with PATH between steps and rebuild needlessly. New projects from pypeline init pin python_version to the interpreter that created them.
WestInstall#
Downloads multi-repo dependencies using west.
Config |
Type |
Default |
Description |
|---|---|---|---|
|
string |
|
Relative path to west manifest file |
|
string |
|
Relative path for west workspace directory |
- step: WestInstall
module: pypeline.steps.west_install
config:
manifest_file: deps/west.yaml # custom manifest location
workspace_dir: external/deps # custom workspace directory
The step supports multiple manifest sources. Beyond the configured manifest file, it collects every WestManifestFile registered in the execution context data registry by previous steps, and subclasses can override _collect_manifests() to contribute more sources. The collection order defines the override order, like git config files: the configured manifest is the base, and a later source’s remote or project with the same name overrides the earlier definition. Every collected manifest file is tracked as a step input, so editing any of them re-runs the step.
Because west.yaml is YAML, a malformed entry (a wrong type or a missing required field) is reported with its exact file:line:column, so you can jump straight to the offending line instead of hunting for it. The generated manifest carries only the merged values; the source locations are dropped on the way out.
ScoopInstall#
Installs Windows applications via Scoop.
Config |
Type |
Default |
Description |
|---|---|---|---|
— |
— |
— |
No configuration options |
- step: ScoopInstall
module: pypeline.steps.scoop_install
Dependencies are read from scoopfile.json in the project root. Like WestInstall, the step supports multiple manifest sources: it collects every ScoopManifestFile registered in the data registry, and subclasses can override _collect_manifests() to contribute more. The collection order defines the override order, like git config files: the root scoopfile.json is the base, and a later source’s bucket or app with the same name overrides the earlier definition. Every collected manifest file is tracked as a step input.
Warning
Windows only. Logs a warning and skips on other platforms.
PoksInstall#
Installs tools cross-platform via poks (a scoop-like package manager that works on Windows, Linux, and macOS).
Config |
Type |
Default |
Description |
|---|---|---|---|
|
string |
|
Relative path from project root for the poks installation directory ( |
- step: PoksInstall
module: pypeline.steps.poks_install
config:
install_dir: build/tools
Dependencies are read from poks.json in the project root. The step supports multiple config sources: it collects every PoksManifestFile registered in the data registry, and subclasses can override _collect_manifests() to contribute more. The collection order defines the override order, like git config files: the root poks.json is the base, and a later source’s bucket or app with the same name overrides the earlier definition. Every collected config file is tracked as a step input.
GenerateEnvSetupScript#
Generates environment setup scripts for shell sessions.
Config |
Type |
Default |
Description |
|---|---|---|---|
— |
— |
— |
No configuration options |
- step: GenerateEnvSetupScript
module: pypeline.steps.env_setup_script
Generates platform-specific scripts:
build/env_setup.sh(Unix/Linux/macOS)build/env_setup.ps1(Windows PowerShell)build/env_setup.bat(Windows CMD)
Use before opening an IDE to set up PATH and environment variables:
source ./build/env_setup.sh
Groups (Optional)#
Group related steps together:
pipeline:
venv:
- step: CreateVEnv
module: pypeline.steps.create_venv
build:
- step: Compile
file: steps/compile.py
- step: Link
file: steps/link.py
test:
- step: UnitTest
run: pytest
Each group creates a subdirectory in build/ for outputs.