Skip to main content
View Markdown ↗

Copy this page

Select and copy the Markdown below, then paste it into your LLM.

On this page

Compatibility

What CI/lock is built for, tested against, and known to interoperate with.

Sources: rookery/cilock/go.mod, rookery/.github/workflows/release.yml, rookery/cilock/cmd/cilock/main.go.

Toolchain

ComponentVersion or configuration
Go (build)1.26.4+ (per go.mod)
Build flagsCGO_ENABLED=0, GOWORK=off, -trimpath
FIPS modeOn by default (//go:debug fips140=on in main.go)

Released platforms

The official rookery release pipeline produces static binaries for:

OSArchitecturesNotes
Linuxamd64, arm64Full feature set including --trace (eBPF where the kernel supports it, else ptrace+seccomp)
macOS (Darwin)amd64, arm64All attestors. --trace reads the Seatbelt sandbox report: it records the process tree, execs, network activity, and reads inside the working directory, but not openedFiles digests or syscalls such as ptrace and mount
Windowsamd64Shipped as a .zip since v3.2.0. No omnitrail attestor (not supported on Windows) and no --trace backend: --trace fails the run.

macOS and Windows binaries are not OS code-signed (no Apple Developer ID or notarization, no Authenticode); see Verify the cilock binary.

Container image

The release pipeline publishes binaries only: it builds no container image and creates no GitHub Release (release.yml). Earlier versions of this page listed a ghcr.io/aflock-ai/cilock image; the current pipeline does not build or update it. To run CI/lock in a container, install the release binary into your own image.

CI platforms

Tested integrations from the cilock-action ecosystem:

PlatformIntegrationSource
GitHub Actionsaflock-ai/cilock-action@d39bb9b17e392520f9e7eef17cf355c027a5c283 (v1.0.4; pin the commit, not a tag or @v1)cilock-action
GitLab CIReusable template at cilock-action/gitlab/cilock.gitlab-ci.ymlSame repo
JenkinsVia the jenkins attestor + raw cilock binaryrookery/plugins/attestors/jenkins
AWS CodeBuildVia the aws-codebuild attestorrookery/plugins/attestors/aws-codebuild

Signers

The default cilock binary blank-imports three signer providers, file, fulcio and piv (verified from cilock/cmd/cilock/main.go):

SignerModuleIn default binary?
Sigstore Fulcioplugins/signers/fulcio✅ default
File (PEM)plugins/signers/file✅ default
PIV smart card (YubiKey, slot 9c)plugins/signers/piv✅ default
KMS (--signer-kms-ref: awskms://, gcpkms://, azurekms://, hashivault://)plugins/signers/kms/{aws,gcp,azure}, vault-transitbuilder opt-in
debug-signerplugins/signers/debug-signerbuilder opt-in
SPIFFE/SPIREplugins/signers/spiffebuilder opt-in
HashiCorp Vaultplugins/signers/vault, vault-transitbuilder opt-in

The default binary links no KMS backend, so it registers no --signer-kms-* or --verifier-kms-* flag; passing one is an unknown-flag error. A build that imports plugins/signers/kms/{aws,gcp,azure} or plugins/signers/vault-transit registers them, and a ref whose scheme that build does not link errors with no kms provider found. The other "builder opt-in" signers likewise exist as Go modules in rookery but aren't blank-imported by default. Add the import to cilock/cmd/cilock/main.go (or use rookery-builder --with …) and rebuild — see build a custom CI/lock.

Timestamp authorities

RFC 3161 compatible TSAs. Tested against:

  • The platform TSA (derived from platform-url; the cilock-action default when timestamp-servers is not set)
  • Sigstore TSA (Sigstore-operated public TSA)
  • Self-hosted TSAs reachable over HTTPS

URL pattern: TSAs are passed via --timestamp-servers <url> (repeatable; -t). There is no config file: it was removed, so flags (or the action's timestamp-servers input) are the only way to set them.

Evidence storage

SinkNotes
File outputDefault; via --outfile.
OCI registryVia the oci attestor + downstream cosign/oras push.
ArchivistaTested against the in-toto/archivista reference server. URL pattern <platform-url>/archivista; auth via static --archivista-headers or OIDC (--archivista-oidc + --archivista-audience).

Witness compatibility

CI/lock shares witness's DSSE + in-toto envelope format, but interop is asymmetric — witness → CI/lock, not fully the reverse:

  • CI/lock attestation type URLs use the https://aflock.ai/attestations/<name>/v0.1 namespace.
  • Legacy witness URLs (https://witness.dev/attestations/<name>/v0.1) are accepted via aliases registered in attestation/legacy.go, called from main.go at startup via attestation.RegisterLegacyAliases().
  • Witness-signed policies (DSSE payload type https://witness.testifysec.com/policy/v0.1) work with cilock verify.
  • Witness-produced attestations verify under cilock verify.
  • The reverse holds only for the shared base attestors. CI/lock's v0.3 Merkle-tree product/material attestations (tree:products root + inline leaves), standalone inclusion proofs, and trace records use predicates and verification logic witness doesn't implement, so witness verify cannot validate most CI/lock attestations.

Predicate types in scope

PredicateNotes
in-toto Statement v1 (with versioned predicate URLs)Native format for all CI/lock attestations.
DSSE envelopeWraps every signed attestation.
SLSA Provenance v1Emitted by the slsa attestor.
CycloneDX, SPDXEmbedded by the sbom attestor when found in products.
SARIFEmbedded by the sarif attestor when found in products.
VEXEmitted by the vex attestor.

Version pinning recommendations

DependencyPin to
aflock-ai/cilock-action in workflowsA commit SHA (not a floating tag like @v1), see the defending-against-supply-chain-attacks tutorial for why.
cilock binaryA specific release version, not :latest, in any production-bound workflow.
Custom binaries built via the rookery builderPin every plugin module to a path-prefixed tag.

What's not covered

  • Blocking network egress. With --trace, CI/lock records network activity (connections, DNS lookups, TLS SNI hostnames) so a policy can fail the step, but it does not block traffic while the step runs. Pair with StepSecurity Harden-Runner for inline blocking.
  • Developer laptop or production server protection. CI/lock operates in CI/CD only.
  • Windows attestor coverage. The released Windows binary has no omnitrail attestor and no --trace backend (--trace fails the run), so a Windows runner cannot produce evidence that needs either.

Reference generated from the product documentation. Match commands and support details to your installed release.