- Development branch:
develop - Release branch:
main(only receives merges fromdevelopvia auto-PR) - Always branch from
origin/develop, never frommain - PRs target
develop(--base develop) - Branch naming:
feat/<topic>orfix/<topic>
git fetch origin develop
git checkout -b feat/my-feature origin/develop
# ... work ...
gh pr create --base develop- Feature/fix PRs into
develop: Use standard merge by default. Use squash only when the branch has many noisy commits that logically belong together (e.g. lots of trial-and-error or CI fix-ups). developintomain: Always rebase, so thatdevelopandmainstay identical after merge.
Follow Conventional Commits. Semantic-release on main uses these to determine version bumps.
feat: add NetworkPolicy support for Server and Database
fix: use FQDN for Database status.URL
docs: update README for CNPG setup
ci: add openvox-db to test images workflow
chore: update dependencies
refactor: simplify reconcile loop
test: add unit tests for helpers
- Lowercase subject, no trailing period
feat:triggers a minor version bumpfix:triggers a patch version bump- Append
BREAKING CHANGE:in the body for major bumps
- Title follows conventional commit format
- Keep the title short (under 72 chars)
- Body should include a
## Summarywith bullet points and a## Test plan - Reference related issues with
Closes #<number> - PRs always target
develop, notmain
make generate manifests # regenerate deepcopy + CRD YAML + Helm CRDs
go build ./...
go vet ./...
go test ./internal/controller/ -v
make ci # full CI: lint + test + helm-lint + check-manifestsAlways run make generate manifests after modifying api/v1alpha1/*_types.go.
Always run make check-manifests before committing to verify generated files are up to date.
api/v1alpha1/ CRD type definitions (Go structs)
internal/controller/ Reconcilers, deployment builders, rendering, tests
config/crd/bases/ Generated CRD YAML
charts/openvox-operator/ Helm chart (CRDs copied from config/crd/bases/)
charts/openvox-stack/ Example stack chart
images/ Containerfiles (openvox-server, openvox-db, openvox-operator)
tests/e2e/ Chainsaw E2E tests
cmd/ Entrypoints (operator, ENC, autosign, report, mock)
docs/ Documentation
- Shared API types (e.g.
PDBSpec,NetworkPolicySpec,ImageSpec,CodeSpec) live inapi/v1alpha1/server_types.go - Controller tests use the builder pattern from
testutil_test.go(newServer(),newDatabase()with option funcs likewithPDBEnabled(),withReplicas()) - Follow existing patterns when adding sub-resources to a controller:
- Add RBAC marker comment (
+kubebuilder:rbac:...) - Add
Owns(&<type>{})inSetupWithManager - Add event reason constants (
EventReasonFooCreated, etc.) - Call
r.reconcileFoo()inReconcile() - Implement
reconcileFoo(delete if disabled, create if not found, update if exists) - Implement
buildFoo(construct the desired object, set controller reference) - Add tests for creation, deletion, and any special behavior
- Add RBAC marker comment (
- No Unicode em-dashes, smart quotes, or other non-ASCII punctuation. Use plain ASCII (
-,--,',"). - CI runs a unicode-lint check that rejects zero-width characters, soft hyphens, word joiners, and similar invisible characters (potential AI watermarks).
- When in doubt, stick to plain ASCII in all files (code, docs, comments, commit messages).
README.mdis the primary user-facing doc - update when adding user-visible featuresCONTRIBUTING.mdcovers developer setup and workflowdocs/contains design docs and architecture diagrams- No CHANGELOG - release notes are auto-generated from commit messages by semantic-release
The canonical feature list lives in docs/_snippets/features.md.
docs/index.mdincludes it automatically viapymdownx.snippets(--8<-- "docs/_snippets/features.md")README.mdcontains a copy between<!-- features -->and<!-- /features -->HTML comment markers
When updating features:
- Edit
docs/_snippets/features.md(single source of truth) - Copy the same content into the
<!-- features -->block inREADME.md