CI/CD Pipelines
How CI/CD works on CompactHive
CompactHive uses Woodpecker CI for continuous integration and delivery. It runs inside your Kubernetes namespace using the Kubernetes backend — each pipeline step executes as its own pod.
- Woodpecker Server — receives webhooks from your Git provider (Forgejo, or GitHub in beta) and stores pipeline state.
- Woodpecker Agent — picks up jobs and creates pipeline pods in your namespace.
- Kaniko — builds your container image without a Docker daemon (runs as a regular pod).
- Your private registry — stores the images Kaniko builds.
Setting up your pipeline
- Registry secrets (automatic).
registry_url,registry_user, andregistry_passwordare auto-injected into Woodpecker during provisioning — no manual setup needed. You can verify they exist in Woodpecker under Settings → Secrets (they appear as global secrets). - Pipeline file. Add a
.woodpecker.yamlto your repository root. The portal's Developer Guide generates a ready-to-use template, pre-filled with your tenant's registry path. - Push. Woodpecker picks up the push via webhook, creates a pipeline pod, builds with Kaniko, and pushes to your registry.
Pipeline template
This is the general shape of a CompactHive .woodpecker.yaml. Your portal's Developer Guide shows the exact version with your registry project path already filled in.
# Registry secrets are auto-injected — no manual setup needed.
steps:
- name: build
image: ghcr.io/osscontainertools/kaniko:v1.28.1-debug
commands:
- mkdir -p /kaniko/.docker
- |
cat > /kaniko/.docker/config.json << DOCKEREOF
{
"auths": {
"$${REGISTRY_URL}": {
"username": "$${REGISTRY_USER}",
"password": "$${REGISTRY_PASSWORD}"
}
}
}
DOCKEREOF
- /kaniko/executor
--context=$CI_WORKSPACE
--dockerfile=Dockerfile
--destination=$${REGISTRY_URL}/YOUR_PROJECT/$CI_REPO_NAME:$CI_COMMIT_SHA
--destination=$${REGISTRY_URL}/YOUR_PROJECT/$CI_REPO_NAME:latest
--cache=true
--insecure
environment:
REGISTRY_URL: { from_secret: registry_url }
REGISTRY_USER: { from_secret: registry_user }
REGISTRY_PASSWORD: { from_secret: registry_password }
Notes:
YOUR_PROJECTis your registry project name (shown on the portal Connect page).- Two tags per build — the commit SHA (for rollback) and
:latest(for convenience). --insecureis required because, inside the cluster, the registry is reached over plain HTTP (TLS is terminated at the edge, in front of the registry's public hostname).--cache=trueenables Kaniko layer caching for faster rebuilds.
Customization
Only build on your main branch:
steps:
- name: build
image: ghcr.io/osscontainertools/kaniko:v1.28.1-debug
when:
- branch: main
Add a test step before the build:
steps:
- name: test
image: node:20-alpine
commands:
- npm ci
- npm test
- name: build
image: ghcr.io/osscontainertools/kaniko:v1.28.1-debug
depends_on: [test]
Useful Woodpecker built-in variables
| Variable | Example | Description |
|---|---|---|
CI_REPO_NAME |
my-app |
Repository name |
CI_COMMIT_SHA |
a1b2c3d |
Full commit hash |
CI_COMMIT_BRANCH |
main |
Branch name |
CI_WORKSPACE |
/woodpecker/src/... |
Workspace path (source code) |
CI_PIPELINE_EVENT |
push |
Event type (push, pull_request, tag) |
See Woodpecker's own documentation for advanced features (matrix builds, cron, services, volumes) not covered here.
Troubleshooting
| Problem | Solution |
|---|---|
| Pipeline not triggering | Make sure the repo is activated in the Woodpecker UI. For GitHub (beta), check webhook delivery in your GitHub repo settings. |
| Kaniko auth error | Verify the 3 registry secrets exist and are correct — check for typos if you ever set them manually. |
| Build timeout | Lower tiers have less CI CPU/memory headroom. Multi-stage Dockerfiles that shrink the build context usually help. |
| Image not found on deploy | Check that the image tag on the Apps page matches what the pipeline pushed — the Registry page in the portal shows what's actually there. |
No comments to display
No comments to display