Skip to content

Artifact resources

Artifact resources are immutable, typed outputs published by unit drivers on the observed ref. A producer writes each artifact to artifacts/<unit-qualified-name>/<logical-name>.yaml|json and records its GVK, path, media type, and digest in the unit's Receipt.

The current bundled artifact kinds are:

Kind Producer Logical name Documentation
ContainerImages OciImages containers Container images
FrontendBundle ViteOciBundle frontend Frontend bundle

Plugins can register additional artifact.gitopsctr.io kinds. The table describes the bundled set, not a complete ecosystem.

Inspect artifacts

Artifact metadata.name remains local. The registry composes its canonical storage path and operator-facing qualified name from the producer Unit's address plus that local name. A Stack-owned producer therefore renders stack/unit/artifact, while a direct producer renders unit/artifact. The Environment and family remain separate command context:

$ gitopsctr get artifacts --environment dev --producer application/image
NAME                           KIND             PARTITION    AUTHENTICATION
application/image/containers  ContainerImages  application  CURRENT

Copy the rendered name into gitopsctr get artifact application/image/containers --environment dev. Add -o yaml --as-list when the generic address, Git provenance, and derived authentication should accompany the exact Artifact document; the tutorial shows that output shape.

get all --environment dev includes an ARTIFACTS section. Inspection authenticates each Artifact through its Receipt descriptor and the Receipt's exact desired producer before reporting it as CURRENT. The producer's authenticated desired resource supplies the Artifact's partition. The existing Receipt shortcuts remain useful for relationship-first navigation: gitopsctr get receipt PRODUCER --environment dev --artifact NAME or --artifacts.

A named query with one result returns the exact Artifact document, matching other get selectors. Collection and aggregate machine queries always use the typed inspection.gitopsctr.io/v1 ResourceList contract, even when the collection contains zero or one item. A named all-Environment query uses the list only if it matches multiple resources. The list's optional per-item inspection.authentication field is derived inspection state, not part of the persisted Artifact: CURRENT means the Receipt descriptor and exact current desired producer authenticate the Artifact; STALE means the descriptor is valid for an older desired producer; and ORPHAN means no matching Receipt/current producer relationship can authenticate it. Historical inspection may set both the desired and observed ref/revision overrides.

How fromArtifact resolves

flowchart LR
  reference["fromArtifact selectors"] --> receipt["Fresh producer receipt"]
  receipt --> descriptor["status.artifacts[name]"]
  descriptor --> artifact["Typed artifact document"]
  desired["Current producer desired unit"] --> artifact
  artifact --> pointer["Apply JSON Pointer<br/>to the whole resource"]
image:
  fromArtifact:
    unit: application-images
    name: containers
    apiVersion: artifact.gitopsctr.io/v1
    kind: ContainerImages
    pointer: /images/application/uri

The lookup first requires a current producer receipt. The driver must declare the logical artifact name and the same GVK selected by the reference. gitopsctr then follows the receipt descriptor, verifies its required path, media type, digest, and GVK, parses the registered artifact contract, and checks its producer identity against the current desired unit. Only then is the pointer applied to the complete artifact resource.

Missing, stale, or integrity-mismatched evidence leaves the consumer waiting. Invalid reference syntax, an unregistered artifact GVK, or a malformed typed artifact document is an error. The artifact digest is the resolved-input fingerprint. See Reference expressions for selector syntax and dryFallback.