Execution model¶
podCI runs a job as an ordered list of steps. Each step is executed in a container, with a deterministic namespace used to scope caches.
Terms¶
- Profile: selects the container environment (
profile.container) and provides default environment variables. - Job: an ordered sequence of steps (
step_order). - Step: a container invocation with a fixed argv (
run) plus optionalworkdirandenv. - Template image: a podCI-built image with required tools installed (when
profile.containeris a template name).
Step lifecycle¶
- Read
podci.toml. - Resolve the job and profile.
- Compute
env_idfrom build-affecting inputs. - Derive
namespacefrom(project, job, env_id). - Resolve the container image:
- if
profile.containermatches a known template name, build/tag it locally as needed - otherwise, require an explicit external image reference (contains
/,:, or@)- bare names (e.g.
ubuntu) are rejected to avoid ambiguity
- bare names (e.g.
- Ensure namespaced cache volumes exist.
- Run the step’s argv inside the container.
- Write a manifest with per-step results.
Determinism posture¶
podCI enforces a reproducible execution posture by:
- using containerized toolchains
- deriving
namespace/env_iddeterministically - isolating caches per namespace
- making reproducibility/supply-chain gates explicit and repeatable (e.g.
cargo ... --locked,cargo deny check) via job steps
This does not imply bit-for-bit identical artifacts across platforms.