Capabilities
A capability is a pipeline stage. Built-ins default to Aggregate; Graph/Layer variants are explicit constructors. Test, publish, and docker are built-in; you can add your own (see Custom capabilities).
Built-ins
| Capability | Default mode | Runs | Participates | Phase | Gate |
|---|---|---|---|---|---|
| test | Aggregate (Once) | root zipxTestTask | whole build (.aggregate) | Verify | always |
| publish | Aggregate | +?<module>/<publishTask> (joined) | modules that publish | Publish | release tag |
| docker | Aggregate | <module>/Docker/publish (joined) | DockerPlugin modules | Publish | release tag |
Use testGraph / publishGraph / dockerGraph for one-job-per-module. Use *Layers for wave scheduling. Use
testJoined if Aggregate must join <module>/<testTask> instead of a root task.
Phases and replace-by-name
Capabilities run Verify → Publish → Deploy. A capability can depend on another via needsCapabilities.
Path gating is Graph Verify only (zipxAffectedOnPR / zipxAffectedOnPush; fail open). Publish is OnReleaseTag today
(Publish∩Affected is an open seam). Deploy is destination-driven and never path-affected.
Gate today is Always | OnReleaseTag | AffectedOnly. AffectedOnly is rejected at generate time — it is a
design seam for future Publish affected-gating, not a silent Always. See Affected.
zipxCapabilities += ... merges with built-ins; the same name replaces a built-in (e.g. turn Aggregate docker
into a multi-registry Graph capability).
zipxCapabilities += Capability.publish.copy(
env = Map(
"PGP_PASSPHRASE" -> secret"PGP_PASSPHRASE",
"SONATYPE_USERNAME" -> secret"SONATYPE_USERNAME",
)
)
DocsRender.job("publish")(
Capability.publish.copy(
env = Map(
"PGP_PASSPHRASE" -> secret"PGP_PASSPHRASE",
"SONATYPE_USERNAME" -> EnvValue.secret("SONATYPE_USERNAME"),
)
)
)publish:
name: publish
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
env:
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
fetch-depth: "0"
fetch-tags: "true"
- name: Setup JDK 21
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95
with:
distribution: temurin
java-version: "21"
- uses: sbt/setup-sbt@d059c39de700f4cc5cb64f9f56577315e44a984e
with:
disk-cache: "false"
- name: Cache sbt
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: |
~/.sbt
~/.cache/sbt
~/.cache/coursier
target
key: ubuntu-latest-jdk21-sbt-0.1.0-ci-${{ github.run_id }}-publish
restore-keys: |
ubuntu-latest-jdk21-sbt-0.1.0-ci-${{ github.run_id }}-
ubuntu-latest-jdk21-sbt-0.1.0-ci-
ubuntu-latest-jdk21-sbt-0.1.0-
ubuntu-latest-jdk21-sbt-
- name: publish
run: sbt 'schema/publish; api/publish'Verify knobs
Shared across Aggregate, Layer, and Graph (details on the Verify page):
zipxTestTask := "testFull"
zipxVerifyClean := VerifyClean.CleanFull
// Aggregate → sbt 'cleanFull; testFull'
// Graph → sbt 'cleanFull; core/testFull' (per job)