Local Deployment (Kind)

Deploying Konflux locally on macOS or Linux using Kind.

This guide walks you through deploying Konflux locally on macOS or Linux using Kind. The automated deploy-local.sh script handles cluster creation, operator deployment, and GitHub integration in a single step.

It relies on sourcing deploy-local.env file which provides it with environment variables. The following steps guide you through setting up the env file and running the script.

Prerequisites

  • Verify that the following tools are installed:

    ToolMinimum version
    Kindv0.26.0
    podman or dockerpodman v5.3.1 / docker v27.0.1
    kubectlv1.31.4
    gitv2.46
    opensslv3.0.13
  • Verify Minimum host free resources:

    • CPU: 4 cores
    • RAM: 8 GB
  • Clone the repository and create a copy of the env file:

    git clone https://github.com/konflux-ci/konflux-ci.git
    cd konflux-ci
    cp scripts/deploy-local.env.template scripts/deploy-local.env
    
  • A GitHub Application: Konflux uses it to receive webhook events from GitHub, trigger build pipelines on pull requests, and write pipeline status back to the PR. Create the App by following GitHub Application Secrets.

Setup

Once you cloned the repo, created your copy of the env file, created the GitHub app and populated its secrets in the env file, refer to Configuration options for a full reference of all available variables. macOS-specific configuration is handled automatically by the script.

Once the env file is set, deploy Konflux:

./scripts/deploy-local.sh

The script performs all of the following automatically:

  • Creates a Kind cluster with proper resource allocation
  • Increases inotify and PID limits
  • Deploys the Konflux operator (using the method set by OPERATOR_INSTALL_METHOD)
  • Applies the Konflux CR configuration
  • Sets up GitHub App integration and smee webhook proxy
  • Provides a local OCI registry at localhost:5001

Verify the installation

Once the script completes, open https://localhost:9443 in your browser and log in with the demo credentials:

  • Username: user1@konflux.dev
  • Password: password

What gets deployed

The script always sets up the base infrastructure, regardless of the install method chosen. The Konflux operator and its managed components are only installed when OPERATOR_INSTALL_METHOD is not none.

All methods

ComponentDetails
Kind clusterSingle-node cluster with ingress on port 9443
cert-managerTLS certificate lifecycle management
trust-managerCA bundle distribution across namespaces
Tekton + Pipelines as CodePipeline execution engine and GitHub-triggered pipeline automation
KyvernoPolicy engine for namespace and RBAC automation
smee clientWebhook proxy relay for GitHub events

release, local and build methods

ComponentDetails
Konflux OperatorDeploys and manages all Konflux components lifecycles

When using none, the script stops after setting up the base infrastructure and secrets. You then install and run the operator manually - see the none method workflow under Install method values below, and Building and Installing from Source.

Configuration options

All options are set in scripts/deploy-local.env (copied from scripts/deploy-local.env.template). They can also be passed as environment variables directly:

OPERATOR_INSTALL_METHOD=build ./scripts/deploy-local.sh

Operator configuration

VariableDefaultDescription
OPERATOR_INSTALL_METHODreleaseHow the operator is installed. See install method values below
OPERATOR_IMAGEquay.io/konflux-ci/konflux-operator:latestOperator image used with the local and build methods
KONFLUX_CR(auto-selected)Path to the Konflux CR file to apply. Available samples are in operator/config/samples/. Can also be passed as a positional argument to the script

Install method values

ValueDescriptionWhen to use
releaseInstalls from the latest GitHub release (install.yaml)Normal local development
localDeploys from your current checkout using kustomize, with the latest released imageTesting manifest changes against a specific release image
buildBuilds the operator image locally before deployingOperator development - testing code changes
noneSets up Kind + dependencies + secrets, then exits without installing the operatorRunning the operator manually - see Building and Installing from Source

The default CR does not enable image-controller. If you set QUAY_TOKEN and QUAY_ORGANIZATION, you must also use a CR that enables it (e.g. konflux-e2e.yaml):

KONFLUX_CR=operator/config/samples/konflux-e2e.yaml ./scripts/deploy-local.sh

If QUAY_TOKEN and QUAY_ORGANIZATION are both set and no CR is specified, the script automatically selects konflux-e2e.yaml.

Infrastructure configuration

VariableDefaultDescription
KIND_MEMORY_GB8Memory allocated to the Kind cluster (GB). Minimum: 8, recommended: 16 for full stack
REGISTRY_HOST_PORT5001Host port for the internal OCI registry. Port 5000 is often taken by macOS AirPlay Receiver
ENABLE_REGISTRY_PORT1Expose the registry on the host (0 to restrict to in-cluster access only)
INCREASE_PODMAN_PIDS_LIMIT1Increase Podman PID limits for Tekton pipeline performance (0 to disable)
PODMAN_MACHINE_NAME(default machine)macOS only - name of the Podman machine to use when multiple machines exist
ENABLE_IMAGE_CACHE0Persist containerd image cache across cluster recreations (1 to enable)

Secrets

VariableRequiredDescription
GITHUB_APP_IDYesNumeric ID of your GitHub App (found in the App settings page)
GITHUB_PRIVATE_KEYYes¹Literal PEM private key content (multi-line, quoted)
GITHUB_PRIVATE_KEY_PATHYes¹Path to .pem file - takes precedence over GITHUB_PRIVATE_KEY
WEBHOOK_SECRETYesWebhook secret for GitHub webhooks. Must match the secret configured in the GitHub App
QUAY_TOKENNo²Quay OAuth token for image-controller auto-provisioning. See Registry Configuration for instructions.
QUAY_ORGANIZATIONNo²Quay organization where component images will be stored. See Registry Configuration for instructions.
SMEE_CHANNELNo³Full Smee channel URL (https://smee.io/<channel-id>). Required only when using smee for webhook relay (cluster not reachable); must match the GitHub App webhook URL. Generate the channel ID with `head -c 30 /dev/random

¹ Provide either GITHUB_PRIVATE_KEY or GITHUB_PRIVATE_KEY_PATH.

² QUAY_TOKEN and QUAY_ORGANIZATION have no effect unless you also set KONFLUX_CR to a sample that enables image-controller (e.g. operator/config/samples/konflux-e2e.yaml).

³ Required when the cluster is not reachable and you use smee as the webhook proxy. Set SMEE_CHANNEL to the same URL you use as the GitHub App webhook URL (e.g. generate a channel ID with head -c 30 /dev/random | base64 | tr -dc 'a-zA-Z0-9' and use https://smee.io/<that-id>). If unset, the script generates a random channel ID at deploy time, but you would then need to set this variable and update the GitHub App webhook URL to match. Omit when your cluster has a publicly reachable webhook URL.

The GitHub App must have the following permissions: checks:write, contents:write, issues:write, pull_requests:write.

What’s next