preconditions
The step-level preconditions field declares tools that must already be on PATH for a step's work to be considered already satisfied — a lighter, inline, single-step-skip variant of the require step type's hard preconditions gate, for skipping one optional step rather than failing an entire run.
steps:
- name: install-stringer
type: shell
command: go install golang.org/x/tools/cmd/stringer@latest
preconditions:
tools: ["stringer"]
go install writes the binary to GOBIN (or GOPATH/bin if GOBIN is unset) — that directory must already be on PATH for preconditions.tools to find it on a later run. If it isn't, stringer never resolves and the step runs every time.
With no explicit when, declaring preconditions alone is enough — the step implicitly means when: "!preconditions.success" (note the negation: preconditions.success means the tool is already there, i.e. skip; the run-signal is its negation — the opposite implicit polarity from inputs's checksum.changed, where the fact itself already means "needs to run"). Run this step when stringer is already installed and it's skipped; run it on a machine without stringer and it installs it.
preconditions is independent of inputs/artifacts and can be declared alongside them — a step with all three implicitly means when: "checksum.changed || !preconditions.success" (run if either signal says so).
Fields
tools- List of executable names resolved via Go's
exec.LookPath— no shell involved, so there's nowhich-vs-wherecross-platform mismatch to work around.preconditions.successistrueiff every entry resolves without error.
Facts exposed to when
preconditions.successtruewhen every tool inpreconditions.toolsresolves onPATH. Reuses the samesuccess/failurevocabulary the condition engine already uses for step lifecycle status, namespaced underpreconditions— not a new, unrelated word for the same concept.
Power users can reference it directly, including negated, to combine it with anything else when already supports:
steps:
- name: install-stringer
type: shell
command: go install golang.org/x/tools/cmd/stringer@latest
preconditions:
tools: ["stringer"]
when: "!preconditions.success"
Storage
preconditions.success is always evaluated live (exec.LookPath at run time) — there's no persisted state, unlike checksum.changed.
The same preconditions field works identically on custom command steps.