KubeCon India — Shipwright Pavilion Prep

A 1-day interactive study guide to prepare for hosting the Shipwright project table. Built from upstream docs, Adam Kaplan's demos, and competitive research.

Study Plan — 7 Hours

TimeLayerActivity
1 hrLayer 1Problem, What is Shipwright, Elevator Pitch, Key Concepts
2 hrsLayer 2CRDs, Build YAML, BuildRun, Strategies, Features
30 minLunch — practice elevator pitch out loud
1.5 hrsLayer 3vs BuildConfig, vs Tekton, vs Tools, Landscape, CNCF
1.5 hrsLayer 4Demo setup + dry-run, FAQ practice, tough questions
30 minSelf-test quiz + review weak areas

How to Use This Guide

  • Navigate using the sidebar — topics are in study order
  • Click "Mark as Studied" checkboxes as you complete each topic
  • Progress bar tracks your completion across all 19 topics
  • Expand accordion sections for detailed content
  • Code blocks contain real YAML from the Shipwright repo
  • End with the Self-Test Quiz to validate your knowledge

Your KubeCon Table Strategy

Pavilion conversations are 5-10 minutes. Read the person in 30 seconds:

Who walks upStart atGo to
CNCF curious — "What is this?"Elevator pitchQuick demo
Developer — "How do I use it?"Build YAMLStrategy options, CNB demo
Platform engineer — "Why should I adopt?"vs BuildConfigMulti-tenancy, security, caching
OpenShift user — "We use BuildConfig"vs BuildConfigMigration path, future direction
Tekton user — "We already have pipelines"vs Raw Tekton"Tekton is the engine" analogy
Layer 1 — What & Why

The Problem

Why building container images on Kubernetes is harder than it should be.

⏱ ~15 min

Before Shipwright, your options were...

Build on your laptop with docker build, push to a registry. Problems: doesn't scale, no CI/CD integration, no audit trail, works on "my machine" syndrome. Every developer has a different Docker version and build environment.
Run a Docker daemon inside a container on your Kubernetes cluster. Problems: requires privileged: true security context — massive security risk on shared clusters. One compromised build pod can access the host kernel. No multi-tenant isolation.
Each tool has its own CLI, config format, and quirks. Platform teams end up maintaining bespoke Tekton pipelines per tool. When you want to switch tools (e.g., Kaniko to BuildKit for cache performance), you rewrite everything. No unified API.
Tightly coupled to OpenShift — not portable to vanilla Kubernetes. Limited to S2I and Docker strategy. API is frozen (v1, no new features). Docker builds require privileged containers. Jenkins Pipeline strategy already deprecated. Dead end.

How We Got Here — The Evolution

Understanding why each tool exists helps you explain the landscape at the table:

Docker was the only game in town. docker build reads a Dockerfile, executes each instruction in a container, and produces an image. It worked great on laptops but had a fatal flaw for Kubernetes: it requires a Docker daemon running as root. On shared clusters, this means privileged containers — any build pod can escape to the host kernel. The Docker daemon is also monolithic — it does building, running, pushing, networking all in one process.
The security problem drove the community to create daemonless, rootless alternatives:
  • Kaniko (Google, 2018) — Solved "how do I build a Dockerfile without a Docker daemon?" Runs entirely in userspace with filesystem snapshotting. No root, no daemon. Trade-off: slower than Docker for large images, can't use BuildKit syntax.
  • Buildah (Red Hat, 2017) — Solved "how do I build OCI images without Docker at all?" Uses Linux user namespaces for rootless builds. Part of the Podman/Buildah/Skopeo trio that replaced Docker on RHEL. Trade-off: Linux-only, needs some kernel features.
  • BuildKit (Docker/Moby, 2017) — Docker's own answer to its own problems. Rebuilt the builder from scratch with a DAG-based execution model. Concurrent stage execution, advanced caching (inline, registry, S3), RUN --mount syntax. Trade-off: rootless mode still needs some privileges on K8s.
Some tools asked a different question — why write a Dockerfile at all?
  • Cloud Native Buildpacks (Pivotal/Heroku, 2018) — Auto-detect your language, apply the right buildpack, produce an OCI image. No Dockerfile needed. Platform teams maintain buildpack images with security patches. Trade-off: builder images are 1GB+, opaque lifecycle, limited to supported languages.
  • ko (Google, 2019) — For Go apps: run go build, layer the binary onto a distroless base, push. Images under 10MB. Absurdly fast. Trade-off: Go only, no OS packages, no cgo.
  • Source-to-Image / S2I (Red Hat, 2015) — OpenShift's original "no Dockerfile" approach. Builder images contain build logic for a language. Trade-off: OpenShift-specific, limited ecosystem.

Now we have 7+ excellent build tools — each solving a real problem. But this created a new problem: fragmentation.

  • Team A uses Kaniko, Team B uses Buildpacks, Team C uses BuildKit
  • Each team has different Tekton pipelines, different credential management, different YAML
  • Platform teams can't enforce governance — they don't even know what tools teams are using
  • Switching tools means rewriting pipelines
  • No unified audit trail across tools

This is exactly what Shipwright solves. It doesn't replace these tools — it wraps them in a unified API. One Build spec, any strategy. The tools compete on build quality; Shipwright provides the management plane.

The fundamental tension: Developers want simple "source → image" workflows. Platform teams need security, multi-tenancy, and tool flexibility. No single tool satisfies both. Shipwright solves this by separating the concerns.
Layer 1 — What & Why

What is Shipwright

The core concept and architecture in one mental model.

⏱ ~15 min

One-sentence definition

Shipwright is a Kubernetes-native framework that provides a unified API for building container images, powered by Tekton, with pluggable build strategies.

The Key Insight

Separate the "what to build" (Build/BuildRun — developer-facing) from the "how to build" (BuildStrategy — platform team-facing).

This separation is what makes everything else possible — tool flexibility, governance, simplicity, and security.

Four Pillars

CNCF Sandbox Project
Vendor neutral, community governed, open source.
Powered by Tekton
Uses Tekton TaskRuns/PipelineRuns under the hood. Developers never see Tekton.
Strategy-Pluggable
Buildah, Kaniko, BuildKit, Buildpacks, ko, S2I — all through one API.
Production-Ready
Used in production by multiple organizations. Enterprise vendors build supported products on top of it.
Layer 1 — What & Why

Elevator Pitch

Practice this until you can say it naturally in 30 seconds.

⏱ ~10 min practice

The 30-Second Pitch

"Shipwright lets you build container images on Kubernetes with a simple, declarative API. You tell it where your source code is and where to push the image — it handles the rest. Platform teams choose the build tool — Buildah, Kaniko, Buildpacks, or others — through BuildStrategies, so developers get a consistent experience regardless of the underlying tool. It's a CNCF project that runs on any Kubernetes cluster."

Key Analogies (pick one that fits)

"Tekton is the engine. Shipwright is the car. You could drive the engine directly, but the car gives you a steering wheel, brakes, and a dashboard."
"Build is like a CronJob template — it defines what you want. BuildRun is like an individual Job — it's one execution. BuildStrategy is like a plugin — the platform team installs it, developers just reference it by name."
"Think of it like WordPress plugins. Your platform team installs approved build strategies — Buildah, Buildpacks, Kaniko. Developers just pick one and build. If you want to switch from Kaniko to BuildKit, change one line in your YAML."
Layer 1 — What & Why

Key Concepts

Foundation knowledge you need before diving into the API.

⏱ ~20 min

Container Image Basics

  • OCI Image Spec — container images are standardized. Any OCI-compliant tool produces the same format. This is why tool choice matters less than people think — the output is the same regardless of whether Buildah, Kaniko, or BuildKit built it.
  • Layers — images are stacks of filesystem layers. Each Dockerfile instruction creates a layer. Understanding this helps explain caching: unchanged layers are reused.
  • Image Digest — a SHA256 hash of the image manifest. Shipwright records this in BuildRun status for audit.
  • Multi-arch / Manifest Lists — a single image tag can point to multiple architecture-specific images via an OCI Index (manifest list). Critical for ARM64 + AMD64 support.

CNCF Landscape Position

Source Code
Shipwright (Build API)
Tekton (Execution)
Build Tool (Buildah/Kaniko/etc.)
Container Registry

Shipwright sits between the developer and Tekton. It's not a CI/CD system — it's a build-specific abstraction layer.

Shipwright Project Structure

RepositoryWhat it is
shipwright-io/buildCore Build controller — CRDs, reconcilers, webhook
shipwright-io/operatorOLM operator for installing Shipwright
shipwright-io/clishp CLI tool for managing builds
shipwright-io/triggersEvent-driven build triggers (webhooks, image changes)
shipwright-io/websiteDocumentation and blog at shipwright.io
shipwright-io/communitySHIPs (enhancement proposals), tracking issues
Layer 2 — How It Works

CRD Model

The 4 custom resources that make up Shipwright.

⏱ ~20 min

Architecture Overview

Platform Team Defines: ┌──────────────────────────────────────────────────────┐ │ ClusterBuildStrategy BuildStrategy │ │ (cluster-wide, all namespaces) (namespace-scoped) │ │ │ │ HOW to build: steps, images, security, volumes │ └──────────────────────────────────────────────────────┘ Developer Defines: ┌──────────────────────────────────────────────────────┐ │ Build BuildRun │ │ WHAT to build: Execute one build: │ │ - source (git URL) - references a Build │ │ - strategy reference - can override params │ │ - output image + secret - immutable once run │ │ - parameters - OR standalone spec │ └──────────────────────────────────────────────────────┘

Override Precedence (the key design insight)

BuildRun (highest)
Build
Strategy defaults (lowest)

This is consistent across every overridable field: timeout, paramValues, output, env, stepResources, nodeSelector, tolerations, schedulerName, runtimeClassName, volumes. Platform teams set sensible defaults; developers override per-run.

Layer 2 — How It Works

Build YAML Deep Dive

Real examples from the Shipwright repo with field-by-field explanation.

⏱ ~25 min

Minimal Build (12 lines)

build.yaml
apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: my-app
spec:
  source:
    type: Git
    git:
      url: https://github.com/shipwright-io/sample-go
    contextDir: docker-build
  strategy:
    name: buildah
    kind: ClusterBuildStrategy
  output:
    image: quay.io/my-org/my-app:latest
    pushSecret: my-registry-creds

That's it. Source, strategy, output. The developer doesn't need to know Tekton, pipelines, or Buildah flags.

Full Spec Fields

FieldDescription
source.typeGit, OCI, or Local
source.git.urlRepository URL (HTTPS or SSH)
source.git.revisionBranch, tag, or commit SHA
source.git.cloneSecretSecret for private repos
source.git.depthClone depth (default 1 = shallow)
source.contextDirSubdirectory within repo
FieldDescription
output.imageDestination registry URL
output.pushSecretSecret for registry auth
output.annotationsOCI annotations on image
output.labelsLabels on image
output.timestampZero, SourceTimestamp, BuildTimestamp, or epoch
output.vulnerabilityScanEnable scan, failOnFinding, ignore list
Vulnerability Scanning Example
output:
  image: registry.example.com/app:latest
  pushSecret: creds
  vulnerabilityScan:
    enabled: true
    failOnFinding: true
    ignore:
      issues: [CVE-2022-12345]
      severity: Low
      unfixed: true

Parameters pass values into BuildStrategy steps. Support strings, arrays, ConfigMap references, and Secret references.

ParamValues with ConfigMap + Secret
paramValues:
- name: build-args
  values:
  - configMapValue:
      name: project-config
      key: node-version
      format: NODE_VERSION=${CONFIGMAP_VALUE}
  - value: DEBUG_MODE=true
  - secretValue:
      name: npm-registry
      key: auth-token
      format: NPM_AUTH_TOKEN=${SECRET_VALUE}

The format syntax lets you compose values from external sources without scripting.

FieldDescription
timeoutGo duration (default 10m)
envExtra env vars (supports Downward API)
retentionTTL + limits for BuildRun cleanup
volumesOverride strategy volumes (if marked overridable)
stepResourcesCPU/memory per strategy step v0.19
nodeSelectorSchedule on specific nodes
tolerationsTolerate taints (NoSchedule only)
schedulerNameCustom scheduler
runtimeClassNameAlternative runtime (kata, etc.) v0.19
triggerGitHub webhooks, image change, pipeline triggers
Layer 2 — How It Works

BuildRun & Execution

How builds actually execute, plus the standalone BuildRun pattern.

⏱ ~20 min

Controller Flow

BuildRun created
Validate Build + Strategy
Generate Tekton TaskRun
Tekton schedules Pod
Steps: clone → build → push
Watch TaskRun status
Update BuildRun (digest, size)

Two Patterns

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: my-app-run-1
spec:
  build:
    name: my-app        # references existing Build
  serviceAccount: pipeline
  timeout: 15m          # override Build's timeout
apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: standalone-run
spec:
  build:
    spec:               # embed Build spec inline
      source:
        type: Git
        git:
          url: https://github.com/shipwright-io/sample-go
        contextDir: source-build
      strategy:
        kind: ClusterBuildStrategy
        name: buildpacks-v3
      output:
        image: quay.io/my-org/app:latest

No Build CR needed — perfect for CI/CD pipelines where the build definition is ephemeral.

What's in BuildRun Status (Audit Gold)

  • Image digest — SHA256 of the built image
  • Image size — compressed size
  • Git commit SHA — exact commit that was built
  • Git commit author — who committed
  • Vulnerability scan results — CVE IDs with severities
  • Build spec snapshot — copy of the Build spec at execution time (if the Build changes later, you still know what config produced each image)
  • 30+ failure reason codes — rich error reporting: BuildRunTimeout, StepOutOfMemory, GitAuthInvalidKey, GitRevisionNotFound, etc.
Layer 2 — How It Works

BuildStrategies

The pluggable build engine abstraction — where the real power is.

⏱ ~25 min

Why Multiple Strategies?

There is no single "best" way to build a container image. Different teams have different needs:

📚 Different inputs
Some teams write Dockerfiles, others don't want to. Buildpacks auto-detect your language. ko compiles Go directly. S2I uses builder images. Shipwright lets each team use what fits.
🔒 Different security postures
Some clusters ban privileged containers entirely (rootless-only). Others need daemon-based tools for cache performance. The strategy abstraction lets platform teams enforce policy without blocking developers.
⚡ Different performance profiles
BuildKit has advanced layer caching and parallel stage execution. Kaniko trades speed for zero-privilege simplicity. ko skips the Dockerfile entirely for fastest Go builds. Teams pick the right tradeoff.
🎯 One API, many engines
Developers use the same Build/BuildRun CRDs regardless of strategy. Platform teams swap engines without changing developer workflows. That's the whole point of the abstraction.

Supported Strategies

StrategyToolWhat it doesRootless?Platforms
BuildahbuildahDockerfile-based buildsYesAll
Multi-arch BuildahbuildahOrchestrator + per-arch jobs → manifest listYesAll
KanikokanikoDockerfile in userspace, no daemonYesAll
BuildKitbuildkitDaemonless, cache exporters, multi-platformSetupAll
Buildpacks v3CNB lifecycleAuto-detect language, no DockerfileYesamd64
kokoGo binaries → images directlyYesAll
Source-to-Images2i + kanikoS2I generates Dockerfile, kaniko builds itYesamd64

How Do They Differ?

Quick decision guide — pick based on your constraints:

DimensionBuildahKanikoBuildKitBuildpackskoS2I
Needs Dockerfile?YesYesYesNoNoNo
Best forGeneral purpose, OCI-nativeLocked-down clustersSpeed, caching, multi-stageSource-only devsGo projectsLegacy OpenShift
Cache supportLayer cacheLayer cacheAdvanced (inline, registry, local)Layer reuseGo module cacheIncremental builds
Multi-archYes (dedicated strategy)Single archYes (cross-compile)Single archYesSingle arch
Privileged?No (rootless)No (userspace)Needs setupNo (rootless)NoNo
TradeoffJack of all tradesSlower but zero-privilegeFastest but needs configNo control over image layersGo-onlyFewer maintainers, limited to amd64

System Parameters (injected by controller)

ParameterDescription
$(params.shp-source-root)Absolute path to cloned source
$(params.shp-source-context)Path to context dir
$(params.shp-output-directory)Where to store image locally (Shipwright-managed push)
$(params.shp-output-image)Output image URL

The Push Model Decision

Strategy authors choose who pushes the image:

Shipwright-managed push
Strategy writes image to $(params.shp-output-directory). Shipwright handles the push. Gets annotations/labels/SBOM for free.
Strategy-managed push
Strategy pushes directly to $(params.shp-output-image). Can optimize (skip base layer downloads). Annotations cause a second push.
Layer 2 — How It Works

Key Features

The features that make people say "oh, that's nice."

⏱ ~15 min
GitHub webhooks (Push, PullRequest), image change triggers (rebuild when base image updates), Tekton pipeline triggers. Separate shipwright-io/triggers controller.
trigger:
  when:
  - name: push-to-main
    type: GitHub
    github:
      events: [Push]
      branches: [main]
Built into the output spec. Scan results appear in BuildRun status with CVE IDs and severities. failOnFinding: true gates the build on security. Can ignore specific CVEs, unfixed vulnerabilities, or below a severity threshold.
Auto-delete BuildRuns after a TTL (ttlAfterFailed: 30m, ttlAfterSucceeded: 1h) or keep only N most recent (failedLimit: 10, succeededLimit: 20). Cascade-delete BuildRuns when a Build is deleted with atBuildDeletion: true.
Strategies define volumes with overridable: true. Developers override with PVCs for persistent caches. First build: 2+ minutes. Second build with cache: 30 seconds. Platform team sets up the caching strategy, every developer gets fast builds automatically.
Developers can set CPU/memory per strategy step — fine-grained resource control without modifying the strategy.
strategy:
  name: buildah
  kind: ClusterBuildStrategy
  stepResources:
  - name: build
    resources:
      requests: { cpu: 500m, memory: 512Mi }
      limits:   { cpu: "1", memory: 1Gi }
Alternative to TaskRun for multi-pod build execution with PVC-based workspace storage. Foundation for multi-architecture build support — each arch runs as a separate pod on native hardware.
Layer 3 — Positioning

vs OpenShift BuildConfig

Your #1 question from OpenShift users. Know this cold.

⏱ ~20 min

Comparison

DimensionBuildConfig (legacy)Shipwright
APIv1, frozen — no new featuresv1beta1, actively developed
Build toolsDocker build + S2I onlyBuildah, Kaniko, BuildKit, Buildpacks, ko, S2I, custom
PortabilityOpenShift-onlyAny Kubernetes
ExtensibilityNoneBuildStrategy API — bring your own tool
Multi-archNot supportedNative multi-arch Buildah + PipelineRun mode
SecurityDocker build needs privilegedRootless by default
MigrationCrane-based migration tool (dev preview, Jan 2026)
FutureDeprecated pathStrategic direction for OpenShift

Your Lines

Diplomatic: "BuildConfig served OpenShift well for years. Shipwright is the evolution — portable, extensible, and secure by default. It's where the community is investing."
Blunt (for platform engineers who push): "BuildConfig is a dead end. It's not getting new features, it can't do multi-arch, it requires privileged containers for Docker builds, and it only works on OpenShift. Migration tooling already exists."

Migration Path

  • S2I builds: Shipwright has an S2I strategy — existing builder images still work
  • Docker builds: Switch to the Buildah strategy (rootless, more secure)
  • Jenkins Pipeline: Already deprecated — move to Tekton pipelines or Shipwright
  • YAML conversion: Build YAML is simpler than BuildConfig — concepts map 1:1
  • Tooling: Crane-based migration tool auto-converts BuildConfig → Build (dev preview)
Layer 3 — Positioning

vs Raw Tekton

"Why not just write a Tekton pipeline for builds?"

⏱ ~15 min
DimensionRaw TektonShipwright
YAML lines60-100+ (Task + Pipeline + PipelineRun + Workspaces)~15-25 (Build + BuildRun)
AbstractionGeneral-purpose CI/CDPurpose-built for builds
Strategy reuseCopy-paste Tasks across teamsClusterBuildStrategy — install once
Credential mgmtManual workspace/secret wiringDeclarative pushSecret
Build featuresBuild yourself: clone, push, digest, scanningAll built-in
MaintenanceEvery team maintains pipelinesPlatform team maintains strategies
The line: "Tekton is the engine. Shipwright is the car. You could drive the engine directly — but you'd be reinventing source cloning, credential injection, image pushing, digest tracking, and vulnerability scanning. Shipwright gives you all of that with 12 lines of YAML."
Layer 3 — Positioning

vs Standalone Tools

For people who say "I just use Kaniko / ko / Buildpacks directly."

⏱ ~15 min
ConcernStandalone toolShipwright
Switching toolsRewrite CI/CD pipelineChange one line (strategy.name)
Multi-tenancyRoll your own RBACK8s-native namespaces, RBAC, resource limits
Audit trailCheck CI logsBuildRun status: digest, commit, author — in K8s API
GovernanceNo control over dev choicesClusterBuildStrategy — platform curates approved tools
ConsistencyEvery team does it differentlyOne API, one workflow, any tool
"You're not giving up your favorite tool — you're wrapping it in an API that gives your organization consistency, governance, and the ability to switch later without rewriting everything."

Tool-Specific Details

Truly rootless and daemonless — safe for multi-tenant clusters. Uses userspace filesystem snapshotting. Limitations: Dockerfile-only, no BuildKit syntax (RUN --mount=type=cache), slower than BuildKit for large images, single-platform per run. Available as a Shipwright strategy.
Advanced caching (inline, registry, S3), RUN --mount syntax, parallel stage execution, zstd compression. Limitations: Rootless mode still needs privileged: true with hostUsers: false; requires AppArmor/SecComp unconfined profiles. Available as a Shipwright strategy.
Auto-detects language, applies the right buildpack. Produces SBOMs. Supports image rebasing for OS patches. Limitations: Builder images are 1GB+, debugging is opaque, limited to languages with maintained buildpacks. CNCF Incubating. Available as a Shipwright strategy.
No Dockerfile, no Docker daemon. Runs go build, layers binary onto distroless base. Images under 10MB. Native multi-platform. Used by Tekton, Knative, Sigstore. Limitations: Go only, no cgo, no OS packages. CNCF Sandbox. Available as a Shipwright strategy.
Layer 3 — Positioning

Competitive Landscape

The full picture — where everything sits.

⏱ ~15 min

Landscape Map

ProjectCategoryShipwright Relationship
TektonCI/CD engineShipwright's runtime — layer above, not competitor
KanikoBuild toolOne of 7 Shipwright strategies
BuildKitBuild toolOne of 7 Shipwright strategies
Buildpacks (CNB)Build toolOne of 7 Shipwright strategies
koBuild toolOne of 7 Shipwright strategies
BuildConfigLegacy OCP buildsShipwright is its successor
Google Cloud BuildManaged serviceVendor lock-in, not portable, not self-hosted
GitHub ActionsManaged CI/CDOff-cluster, no K8s-native governance
GitLab CI/CDManaged CI/CDPipeline-first, not build-specific abstraction
The positioning: "Most 'competitors' are tools Shipwright can orchestrate. Shipwright isn't competing with Buildah — it's the framework that makes Buildah (and everything else) manageable at scale."

Why In-Cluster Builds Matter

For skeptics who say "just use GitHub Actions":

  • Data sovereignty — source code and images never leave your cluster
  • Air-gapped environments — works without internet access
  • Unified RBAC — one access control system for everything
  • Supply chain security — Tekton Chains provides SLSA attestations
  • Cost predictability — no per-minute billing at scale
  • Cloud portability — same build definitions work anywhere
Layer 3 — Positioning

CNCF Story

Project governance, community health, and enterprise adoption.

⏱ ~10 min

Project Facts

  • Status: CNCF Sandbox (accepted Aug 2024)
  • Previously: CDF Incubating
  • Stars: 808+ on GitHub
  • Contributors: 197 (+18% YoY)
  • Contributing orgs: 78 (+37% YoY)
  • Latest release: v0.19.7 (June 2026)
  • Community calls: Weekly, Monday 9AM ET
  • Enhancement process: SHIPs
  • Slack: #shipwright on Kubernetes Slack
  • YouTube: @shipwright-io

Lines for the Table

"It's a CNCF project with open governance — community-owned, 78 contributing organizations. Enterprise vendors build supported products on top of it, but the upstream project runs on any Kubernetes."
On "why Sandbox not Incubating": "The CNCF governance process takes time. Sandbox doesn't mean immature — it means the project has been vetted by the TOC as worth investing in. It's already used in production by multiple organizations."
Layer 4 — Demo & FAQ

Live Demos

From Adam Kaplan's builds-openshift-demos repo. Pick 2 for the table.

⏱ ~45 min (setup + dry-run)

Demo 1: Build Strategies (2-3 min)

Point: Same app, two different strategies, one-line change.

Step 1: S2I Build
apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: s2i-nodejs
spec:
  source:
    type: Git
    git:
      url: https://github.com/sclorg/nodejs-ex
  strategy:
    name: source-to-image
    kind: ClusterBuildStrategy
  paramValues:
  - name: builder-image
    value: image-registry.openshift-image-registry.svc:5000/openshift/nodejs:16-ubi9
  output:
    image: image-registry.openshift-image-registry.svc:5000/demo-builds/nodejs-ex:s2i
Step 2: Buildah Build (same app, different strategy)
apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-nodejs
spec:
  source:
    type: Git
    git:
      url: https://github.com/shipwright-io/sample-nodejs.git
    contextDir: docker-build
  strategy:
    name: buildah                    # <-- only this changes
    kind: ClusterBuildStrategy
  output:
    image: image-registry.openshift-image-registry.svc:5000/demo-builds/nodejs-ex:buildah
Commands
oc new-project demo-builds
oc create imagestream nodejs-ex
oc apply -f 01-s2i-nodejs-build.yaml
shp build run s2i-nodejs --follow
# Then switch strategy:
oc apply -f 02-buildah-nodejs-build.yaml
shp build run buildah-nodejs --follow

Demo 2: Build Volumes / Caching (3-5 min)

Point: Platform team sets up caching, developers get fast builds.

Build with PVC cache override
apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-nodejs-cache
spec:
  source:
    type: Git
    git:
      url: https://github.com/shipwright-io/sample-nodejs.git
    contextDir: docker-build
  strategy:
    name: buildah-cache
    kind: BuildStrategy
  output:
    image: image-registry.openshift-image-registry.svc:5000/demo-builds/nodejs-ex:buildah
  volumes:
  - name: build-cache
    persistentVolumeClaim:
      claimName: build-cache          # PVC for layer caching
Demo flow
oc apply -f 00-cache-pvc.yaml           # Create the PVC
oc apply -f 01-buildah-cache-strategy.yaml  # Namespace strategy with cache volume
oc apply -f 02-buildah-nodejs-cache-build.yaml

time shp build run buildah-nodejs-cache --follow  # First: ~2 min
time shp build run buildah-nodejs-cache --follow  # Second: ~30 sec!

Demo Prep Checklist

Cluster running with Shipwright installed
Clone adambkaplan/builds-openshift-demos
Registry secret pre-configured
Dry-run Demo 1 (strategies) twice
Dry-run Demo 2 (caching) twice
Fallback: screenshots or terminal recordings ready
Layer 4 — Demo & FAQ

Top 15 FAQ

What people actually ask at a KubeCon pavilion table. Click to reveal answers.

⏱ ~30 min

The Basics

"A Kubernetes-native framework for building container images. You define what to build in a simple YAML — source, strategy, output. Platform teams define how to build via strategies. Supports Buildah, Kaniko, Buildpacks, BuildKit, ko, and S2I — all through the same API. CNCF Sandbox project, runs on any K8s."
"Both — and primarily community. Shipwright is a CNCF Sandbox project — open governance, community-owned, 78 contributing organizations. It runs on any Kubernetes cluster."
"Tekton is the engine, Shipwright is the car. You could wire up a Tekton pipeline for builds yourself — Task, Pipeline, PipelineRun, Workspace config — that's 60-100 lines of YAML. Shipwright does it in 12 lines because it's purpose-built for image builds. Source cloning, credential injection, image pushing, digest tracking, vulnerability scanning — all built in."

The OpenShift Crowd

"BuildConfig's API is frozen — no new features, no multi-arch, requires privileged containers for Docker builds, OpenShift-only. Shipwright is the strategic direction: portable, extensible, rootless by default. Migration tooling exists to help convert BuildConfig resources. The longer you wait, the more migration work piles up."
"No hard removal date announced, but the trajectory is clear — similar to DeploymentConfig. All investment is in Shipwright. New features only land here. Migration tooling already exists — that's a strong signal."
"Smoother than you'd expect. S2I builds: Shipwright has an S2I strategy — your builder images still work. Docker builds: switch to Buildah (rootless, more secure). Concepts map 1:1. The Crane migration tool auto-converts YAML. Build YAML is actually simpler than BuildConfig."

The Platform Engineer

"ClusterBuildStrategies are cluster-wide — platform teams install approved tools. BuildStrategies are namespace-scoped for experimentation. RBAC controls who can create Builds. Only cluster admins can write ClusterBuildStrategies. Resource limits are set on strategy steps."
"Yes — that's the whole point. A BuildStrategy is a template of container steps. If you can express your build as steps in containers, you can make a strategy. Teams have written custom strategies for proprietary compilers, compliance scanners, WASM builds — anything."
"K8s Secrets referenced directly in the Build spec — pushSecret for registry, cloneSecret for git. Shipwright injects them into the right steps. You can also pass Secret/ConfigMap values as strategy parameters with format strings."
"Strategies define volumes marked as overridable: true. Developers replace them with PVCs. Buildah gets layer caching, BuildKit gets its cache exporters, Buildpacks has built-in layer caching. First build: 2+ min. With cache: ~30 seconds. Platform team configures it once, every developer benefits."

The Technical Deep-Dive

"Two approaches. (1) Multi-arch native Buildah strategy: orchestrator pod spawns one Job per architecture on native hardware, assembles a manifest list. (2) PipelineRun execution mode (v0.19): multi-pod builds with PVC workspaces — foundation for even more flexible multi-arch support."
"First-class API — add vulnerabilityScan to your Build spec. Set failOnFinding: true to gate builds on security. Results appear in BuildRun status with CVE IDs and severities. Ignore specific CVEs, unfixed vulns, or below a severity threshold."
"Three types: GitHub webhooks (Push, PullRequest), image change triggers (rebuild when base image updates), and Tekton Pipeline triggers. Separate shipwright-io/triggers controller handles event routing."

The Skeptic

"Works great for simple cases. Shipwright shines when you need: builds inside your cluster (air-gapped, data sovereignty), consistent governance across teams, strategy abstraction (switch tools without rewriting pipelines), K8s-native audit trail (digest, commit, author in the API), and cost predictability at scale."
"Yes. Shipwright is at v0.19 with active development. 808+ stars, 78 contributing organizations, weekly community calls. CNCF Sandbox project, used in production by multiple organizations, with enterprise vendors building supported products on top."
Layer 4 — Demo & FAQ

Tough Questions

The ones that could catch you off guard. Practice these.

⏱ ~15 min

Know the SHIPs in progress:

  • SHIP-0040 — RuntimeClass support (landed in v0.19)
  • SHIP-0043 — Multi-Arch Image Builds (in progress)
  • SHIP-0044 — BuildRun Executor Field
  • SHIP-0046 — Build Step Resources Override (landed in v0.19)
  • SHIP-0041 — Documentation Restructure

Check the community meeting notes before KubeCon for latest v0.20 plans. Version mapping: v0.20 upstream = builds-1.9 downstream.

"The CNCF governance process takes time. Shipwright migrated from CDF to CNCF in August 2024 — relatively recent. Sandbox means the TOC has vetted it as worth investing in. Multiple organizations use it in production — that's probably a stronger maturity signal than a CNCF tier label."
"Currently Tekton-only — this is a deliberate design choice. Tekton is the CNCF standard for Kubernetes-native task execution. The architecture could theoretically support other executors (the PipelineRun mode in v0.19 shows the executor is somewhat abstracted), but it's not on the roadmap. Tekton gives us battle-tested scheduling, step sequencing, and result reporting."
"kpack is a Kubernetes-native platform specifically for Cloud Native Buildpacks. It's great if you're all-in on Buildpacks. Shipwright is broader — it supports Buildpacks as one of many strategies, alongside Buildah, Kaniko, BuildKit, ko, and S2I. If your org uses different tools for different teams, Shipwright gives you one API for all of them."
"Shipwright runs on Tekton, and Tekton Chains provides SLSA supply-chain attestations. BuildRun status records the exact source commit, image digest, and build configuration — that's your audit trail. Vulnerability scanning is built into the API. The combination of Shipwright + Tekton Chains gives you in-cluster builds with cryptographic provenance."
"First question: are you using caching? Without PVC-backed caches, every build starts from scratch. Second: check your step resources — Tekton only gives full resource requests to the step with the highest value (others get zero or LimitRange minimum). Use stepResources (v0.19) to tune. Third: consider your strategy choice — BuildKit with inline cache is often fastest for Dockerfile builds."
Layer 4 — Demo & FAQ

Self-Test Quiz

10 questions to validate your readiness. Click options to check.

⏱ ~15 min

1. What is the core design insight of Shipwright?

The separation of concerns between developer-facing Build/BuildRun and platform team-facing BuildStrategy is the key design insight that enables everything else.

2. What is the override precedence chain?

BuildRun has highest precedence, then Build, then Strategy defaults. This is consistent across every overridable field.

3. What does Shipwright use under the hood for execution?

Shipwright's Build controller generates Tekton TaskRuns (or PipelineRuns in v0.19+). Developers never see Tekton directly — it's an implementation detail.

4. How many lines of YAML does a minimal Shipwright Build require?

A minimal Build is about 12 lines: source (git URL), strategy reference, output (image + secret). Compare to 60-100+ lines for raw Tekton.

5. What is the relationship between Shipwright and BuildConfig?

Shipwright is the evolution of BuildConfig. Migration tooling exists (Crane-based, dev preview) and all new feature investment goes into Shipwright.

6. Which of these is NOT a supported Shipwright build strategy?

Shipwright ships strategies for Buildah, multi-arch Buildah, Kaniko, BuildKit, Buildpacks v3, ko, and S2I. Bazel is not included, but you could write a custom BuildStrategy for it.

7. What is a ClusterBuildStrategy vs BuildStrategy?

ClusterBuildStrategy is available to all namespaces (installed by platform teams). BuildStrategy is namespace-scoped (for experimentation or team-specific tools).

8. What is Shipwright's CNCF status?

Shipwright is a CNCF Sandbox project, accepted in August 2024 after migrating from the Continuous Delivery Foundation (CDF).

9. How does Shipwright handle build caching?

Strategies declare volumes with overridable: true. Developers override them with PersistentVolumeClaims for persistent caches. This works with Buildah layer caching, BuildKit cache exporters, and Buildpacks built-in caching.

10. What new features were added in Shipwright v0.19?

v0.19 added: stepResources (CPU/memory per strategy step), runtimeClassName (kata etc.), and PipelineRun execution mode (multi-pod builds, foundation for multi-arch).