Skip to content
Crow CI
Codeberg

Helm

Deploy Crow CI on Kubernetes using the official Helm chart.

  1. Add the Helm repository:

    Terminal window
    helm repo add crowci https://codeberg.org/api/packages/crowci/helm
  2. Install the chart:

    Terminal window
    helm install crow crowci/crow

Or use OCI directly:

Terminal window
helm install crow oci://codeberg.org/crowci/crow

By default, createAgentSecret: true creates a shared secret for server-agent authentication. The default agents are automatically configured.

Set CROW_BACKEND_K8S_VOLUME_SIZE for temporary workflow volumes:

server:
env:
CROW_BACKEND_K8S_VOLUME_SIZE: "2Gi"

Inject sensitive values from Kubernetes secrets:

extraSecretNamesForEnvFrom:
- my-crow-secrets

Common sensitive values:

  • CROW_DATABASE_DATASOURCE
  • CROW_FORGEJO_SECRET (OAuth)
  • CROW_AGENT_SECRET (if not using auto-generated)

To allow external agents to register, enable TLS-secured GRPC ingress:

server:
env:
CROW_GRPC_SECURE: "true"
ingress:
grpc:
enabled: true
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-dns01-prod"
kubernetes.io/ingress.class: nginx
hosts:
- host: grpc.example.com
paths:
- path: /
tls:
- hosts:
- grpc.example.com
secretName: grpc-example-com-tls

Spread agent pods across nodes:

affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- agent
topologyKey: kubernetes.io/hostname

Crow encrypts secrets using Google Tink.

  1. Generate a keyset:

    Terminal window
    tinkey create-keyset --key-template AES256_GCM --out-format json --out tink-keyset.json
  2. Create a Kubernetes secret:

    Terminal window
    kubectl create secret generic crow-encryption-keyset \
    --from-file=tink-keyset.json=./tink-keyset.json
  3. Enable in values:

    server:
    encryption:
    enabled: true
    existingSecret: crow-encryption-keyset
    keysetKey: tink-keyset.json

To decrypt existing data before disabling:

server:
encryption:
disable: true
existingSecret: crow-encryption-keyset
keysetKey: tink-keyset.json

Wait for decryption to complete (check logs), then remove the configuration.

Enable Prometheus metrics:

metrics:
enabled: true
port: 9001
prometheus:
podmonitor:
enabled: true
interval: 60s

If metrics aren’t collected, verify Prometheus namespace selectors:

podMonitorNamespaceSelector:
matchLabels: {}
podMonitorSelector:
matchLabels: {}