Contributing¶
Development setup¶
Operator¶
Dashboard¶
CLI¶
Local docs server¶
make docs-install # pip install mkdocs-material mkdocs-minify-plugin
make docs # serves at http://localhost:8001
Or with Docker:
Running lint checks¶
This runs helm lint, go vet on all modules, and shellcheck on all shell scripts.
Running tests¶
Commit style¶
Examples:
feat: add idleTimeout to DevicePoolReconciler
fix: correct ADB permission grant for Android 14
docs: update node-requirements with Azure NVv4 info
ci: add arm64 build to build-cli workflow
Pull request checklist¶
- [ ]
make lintpasses - [ ]
make testpasses - [ ] New CRD fields have validation markers
- [ ]
docs/updated if behaviour changed - [ ] Commit messages follow the style above
Architecture decisions¶
Significant architectural decisions are documented in docs/adr/. Add a new ADR when a design choice has meaningful trade-offs worth capturing.
ADR format:
# NNN — Title
## Status
Proposed | Accepted | Deprecated
## Context
Why does this decision need to be made?
## Decision
What was decided?
## Consequences
What are the trade-offs?
Release process¶
Releases are tag-driven:
This triggers:
build-operator.yaml— builds and pushes operator imagebuild-dashboard.yaml— builds and pushes dashboard imagebuild-cuttlefish.yaml— builds Cuttlefish images for Android 13/14/15build-init.yaml— builds init container imagebuild-cli.yaml— builds CLI binaries for all platformsrelease.yaml— creates GitHub Release, attaches Helm chart + CLI binariespages.yaml— rebuilds docs site and updates Helm chart index
Adding a new CRD field¶
- Edit the type in
operator/api/v1alpha1/<type>_types.go - Add validation markers (
// +kubebuilder:validation:...) - Run
cd operator && make generate manifests - Update
manifests/crds/<type>.yamlfrom the generated output - Update
docs/crd-reference.md - Add an example to
manifests/examples/