go.mod still declared `module github.com/hanzoai/deploy` after the repo was
renamed. A Go module path is not cosmetic — it is the resolvable location. So
`go get github.com/hanzoai/cd` could not work, and anything importing this
module had to spell a name that no longer exists at that address. The build log
of v3.6.0 is where it surfaced: the compiler was still emitting
github.com/hanzoai/deploy/cmd/cd/commands.
3541 import paths across 690 .go, 19 .proto, 4 .yaml, 3 .sh, 2 .mod, Procfile
and Makefile. Plus the 62 ghcr.io/hanzoai/deploy image references, moved to
ghcr.io/hanzoai/cd to match hanzo.yml's build target — a distinct string from
the module path, replaced separately so neither could clobber the other.
go mod tidy clean, CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ./... clean.
Co-authored-by: Hanzo Dev <[email protected]>
Two corrections on top of the naming pass, both found by checking the live
cluster rather than the source.
The rename had silently changed the user-facing annotation key from
argocd.argoproj.io/sync-wave to cd.argoproj.io/sync-wave — 63 live
Applications carry the old key, so deploying that would have ignored every
sync-wave and broken fleet deploy ordering. The key is now cd.hanzo.ai/*,
and universe 575650286 moves the ApplicationSet template that stamps it, so
the controller regenerates all 63 consistently.
The API group in code said argoproj.io/v1alpha1 in 157 places while the
cluster has served apps.hanzo.ai/v1alpha1 since 2026-07-23 (the CRDs are
applications.apps.hanzo.ai). Code now matches what is actually served.
The legacy applications.argoproj.io/app-name label had ZERO live users, so it
went with the rest. foo.argoproj.io test fixtures became foo.example.com —
arbitrary test domains should not carry a vendor name.
go build ./... exit 0.
Co-authored-by: Hanzo Dev <[email protected]>
* feat(api): hard-fork CRD API group argoproj.io -> deploy.hanzo.ai
Hanzo CD hard-fork, phase 1.1. Single source of truth is
pkg/apis/application/register.go's Group constant (Application/AppProject/
ApplicationSet all derive their FullName from it); every other Go call-site
that hardcoded the literal group string is updated to match: the 3 generated
informer GVRs, the app-of-apps nested-Application detector in types.go, the
resource-tree Application-kind cache populator, the 3 NotFound error
constructors in server/application, and the applicationset-controller's
leader-election Lease name/ID (kept in lockstep across Go source + RBAC
resourceNames, or leader election would get RBAC-denied on startup).
CRD YAMLs (application/appproject/applicationset) and every RBAC apiGroups
rule that actually governs our 3 CRDs are repointed to deploy.hanzo.ai, across
both manifests/base/* (namespaced Roles) and manifests/cluster-rbac/* (cluster
scope). Two adjacent things that share the "argoproj.io" string but are NOT
ours are deliberately left untouched: gitops-engine's health-check dispatch
for Argo Workflows' `Workflow` kind, and argocd-server-clusterrole's second
apiGroups block granting read on Argo Workflows' `workflows` resource — both
belong to a separate, unrelated Argoproj-family project we are not forking.
Also untouched, per explicit scope: annotation/label keys (argocd.argoproj.io/*)
and finalizers (*.argoproj.io) that track already-applied live resources, and
argocd-cm.yaml's resource.customizations.ignoreResourceUpdates keys (a narrow
app-of-apps diffing nicety, not build- or RBAC-relevant).
CGO_ENABLED=0 go build ./... verified green.
* ci: wire canonical hanzo.yml + cicd.yml (Hanzo CD image build)
Phase 1.3. Follows the same one-way pattern every hanzo/lux/zoo repo uses:
hanzo.yml declares the image (root Dockerfile -> ghcr.io/hanzoai/deploy) and a
fast go-build sanity test (the multi-stage Dockerfile build is the slow, real
gate); cicd.yml is the ~10-line trigger shim importing hanzoai/ci's reusable
build workflow on the arc pool, secrets from KMS only.
No `deploy:` block yet, matching the hanzoai/cms build-only-first-cutover
pattern: this repo's own live hanzo-cd namespace runs the whole Hanzo fleet's
GitOps, so the prod image/CRD swap is a deliberate separate action (see the
[HELD] universe PR), never an automatic rollout on merge. Every PR/push still
builds and pushes an immutable ghcr.io/hanzoai/deploy:sha-<7>-amd64 image.
* feat(ui): rebrand Argo CD -> Hanzo CD (title, favicon, logo, sidebar)
Phase 1.2. User-facing "Argo CD"/"ArgoCD" text replaced with "Hanzo CD"
across the login page, help modal, settings screens, version-info panel,
sync-options warning, fullscreen-logs title, app.tsx page titles, and
index.html's <title>/noscript text (dropped the now-wrong upstream CLI
doc link rather than invent a hanzo.ai URL that doesn't exist).
Logo/favicon assets replaced with the canonical Hanzo mark (never
hand-drawn, copied from ~/work/hanzo/logo/dist): the two real usages of
Argo's logo collapse onto one Hanzo glyph (mono + white variants) at the
same 5 call sites (login icon + footer, login.scss $logoPath/
$logoNegativePath, sidebar text-logo), preserving the existing CSS
invert() filters so both the light login panel and dark sidebar still
render correctly. Old argologo.svg/argo_o.svg/argo.png deleted (no
longer referenced). favicon-{16x16,32x32}.png added at
ui/src/assets/favicon/ (index.html's links to that path were previously
dead - the directory didn't exist in this checkout). package.json name
argo-cd-ui -> hanzo-cd-ui.
Left alone, deliberately: the two Kubernetes resource-kind icon sets
under ui/src/assets/images/resources/ (unrelated to branding), and
upstream doc/project links (argoproj.io, argo-cd.readthedocs.io) since
we have no equivalent hanzo.ai docs to point to yet - except the login
footer logo's outbound link, which now points to hanzo.ai instead of
argoproj.io (a Hanzo-branded mark linking to the upstream project it
was forked from read as an obvious leftover).
* feat(module): rename Go module github.com/argoproj/argo-cd/v3 -> github.com/hanzoai/deploy
Phase 2. No version suffix on the new path (org policy: never publish our
own Go modules above v1.x.x / with a v2+ suffix) — this fork starts a fresh
v0/v1 module identity rather than carrying the v3 the upstream fork point
had reached.
Mechanical, symmetric rewrite: 704 .go files (import statements only; two
disjoint substitutions applied specific-first so the nested gitops-engine
module path never double-matches), plus go.mod (module line, the
gitops-engine require+replace pair, version reset to v0.0.0-... since a
suffix-less path can't carry a v3 semver), gitops-engine/go.mod, Makefile
(ldflags PACKAGE + 2 TEST_MODULE filters), .golangci.yaml, .goreleaser.yaml,
.mockery.yaml (+ gitops-engine's), Procfile, the codegen/proto generation
scripts (hack/generate-proto.sh, update-codegen.sh, update-openapi.sh), and
20 .proto files' go_package options. Also one OpenTelemetry tracer name
string in gitops-engine/pkg/sync/sync_context.go (a cosmestic label, not an
import, but worth keeping consistent).
CGO_ENABLED=0 go build ./... verified green for both the root module and
the nested gitops-engine module; go vet clean on both; go mod tidy run
(network available) to reconcile go.sum, dependency set unchanged.
Left alone, deliberately: doc-only mentions (docs/snyk/*.html scan reports,
gitops-engine/README.md), a comment-only reference in
.github/workflows/release.yaml, and one Renovate bot config line — none are
build- or codegen-load-bearing. Also left alone: comments citing upstream
GitHub issue URLs (github.com/argoproj/argo-cd/issues/NNNNN) and a handful
of test fixtures using "https://github.com/argoproj/argo-cd.git" as a
representative example repo URL — both are accurate historical/test-data
references, not stale self-references.
---------
Co-authored-by: Hanzo Dev <[email protected]>
* fix(health): only consider non-empty health checks
For wildcard health checks, only consider wildcards with a non-empty
health check. Fixes#16905 (at least partially).
Signed-off-by: Blake Pettersson <[email protected]>
* test: renaming test case for clarity
Signed-off-by: Blake Pettersson <[email protected]>
* refactor: add clarity as to what the function is supposed to do
Signed-off-by: Blake Pettersson <[email protected]>
* Update docs/operator-manual/health.md
Co-authored-by: Michael Crenshaw <[email protected]>
Signed-off-by: Blake Pettersson <[email protected]>
* test: add test case for `*/*` override with empty healthcheck
Signed-off-by: Blake Pettersson <[email protected]>
---------
Signed-off-by: Blake Pettersson <[email protected]>
Co-authored-by: Michael Crenshaw <[email protected]>
* Kind wildcard support in health customizations
Signed-off-by: reggie <[email protected]>
* Updated health customizations docs to using the correct field with a /
Signed-off-by: reggie <[email protected]>
* Updated health customizations docs to using the correct field with a /
Signed-off-by: reggie <[email protected]>
* Document resource kind wildcard for custom health check
Signed-off-by: reggie <[email protected]>
* Implemented wildcard * support in API Group and Resource Kind and updated docs
Signed-off-by: reggie <[email protected]>
* Implemented wildcard * support in API Group and Resource Kind and updated docs
Signed-off-by: reggie <[email protected]>
* Implemented wildcard * support in API Group and Resource Kind and updated docs
Signed-off-by: reggie <[email protected]>
* Added a custom create-from CronJob action
Signed-off-by: reggie <[email protected]>
* in progress
Signed-off-by: reggie <[email protected]>
* in progress
Signed-off-by: reggie <[email protected]>
* in progress
Signed-off-by: reggie <[email protected]>
* in progress
Signed-off-by: reggie <[email protected]>
* added a ns in the action.lua and fixed tests
Signed-off-by: reggie <[email protected]>
* create-job
Signed-off-by: reggie <[email protected]>
* in progress
Signed-off-by: reggie <[email protected]>
* more changes
Signed-off-by: reggie <[email protected]>
* full unit tests and action returning an array
Signed-off-by: reggie <[email protected]>
* cleanup
Signed-off-by: reggie <[email protected]>
* fix the custom tests
Signed-off-by: reggie <[email protected]>
* e2e tests
Signed-off-by: reggie <[email protected]>
* json marshaling annotations ImpactedResource, e2e tests and docs
Signed-off-by: reggie <[email protected]>
* more docs and tests
Signed-off-by: reggie <[email protected]>
* upstream sync
Signed-off-by: reggie <[email protected]>
* fix wrong return upon going over the impacted resources + docs + fixing e2e tests
Signed-off-by: reggie <[email protected]>
* docs
Signed-off-by: reggie <[email protected]>
* better error handling
Signed-off-by: reggie <[email protected]>
* K8SOperation as an enum
Signed-off-by: reggie <[email protected]>
* added dry-run for create operation
Signed-off-by: reggie <[email protected]>
* small changes
Signed-off-by: Michael Crenshaw <[email protected]>
* ref to my gitops-engine fork out
Signed-off-by: reggie <[email protected]>
* ref to my gitops-engine fork out
Signed-off-by: reggie <[email protected]>
* ref to my gitops-engine fork out
Signed-off-by: reggie <[email protected]>
* ref to my gitops-engine fork out
Signed-off-by: reggie <[email protected]>
* ref to my gitops-engine fork out
Signed-off-by: reggie <[email protected]>
* gitops engine dependency and test fixes
Signed-off-by: reggie <[email protected]>
* add workflows action
Signed-off-by: Michael Crenshaw <[email protected]>
* cronworkflow and workflowtemplate actions
Signed-off-by: Michael Crenshaw <[email protected]>
* update gitops-engine
Signed-off-by: Michael Crenshaw <[email protected]>
---------
Signed-off-by: reggie <[email protected]>
Signed-off-by: Michael Crenshaw <[email protected]>
Co-authored-by: Michael Crenshaw <[email protected]>
At the time of making this commit, the package `github.com/ghodss/yaml`
is no longer actively maintained.
`sigs.k8s.io/yaml` is a permanent fork of `ghodss/yaml` and is actively
maintained by Kubernetes SIG.
Signed-off-by: Eng Zer Jun <[email protected]>
* Kind wildcard support in health customizations
Signed-off-by: reggie <[email protected]>
* Updated health customizations docs to using the correct field with a /
Signed-off-by: reggie <[email protected]>
* Updated health customizations docs to using the correct field with a /
Signed-off-by: reggie <[email protected]>
* Document resource kind wildcard for custom health check
Signed-off-by: reggie <[email protected]>
* Implemented wildcard * support in API Group and Resource Kind and updated docs
Signed-off-by: reggie <[email protected]>
* Implemented wildcard * support in API Group and Resource Kind and updated docs
Signed-off-by: reggie <[email protected]>
* Implemented wildcard * support in API Group and Resource Kind and updated docs
Signed-off-by: reggie <[email protected]>
* Removed code duplication and returned an empty string instead of an error
Signed-off-by: reggie <[email protected]>
Signed-off-by: reggie <[email protected]>
Co-authored-by: Michael Crenshaw <[email protected]>
Currently, the usage of standard lua library is always disabled, making it difficult to implement complex health check scripts.
This feat allow admins to control the usage of standard library by setting "health.lua.useOpenLibs" (merged-keys convention)/"resource.customizations.useOpenLibs.<group_kind>"
(split-keys convention) field in argocd-cm ConfigMap.
Signed-off-by: Chetan Banavikalmutt <[email protected]>
* Move utils packages that are required for gitops engine under engine/pkg/utils package.
Following changes were implemented:
* util/health package is split into two parts: resource health assessement & resource health assessement and moved into engine/pkg/utils
* utils packages moved: Closer and Close method of util package moved into engine/pkg/utils/io package
* packages diff, errors, exec, json, kube and tracing moved into engine/pkg/utils
* Move single cluster caching into engine/kube/cache package
* move sync functionality to engine/kube/sync package
* remove dependency on metrics package from engine/pkg/utils/kube/cache
* move annotation label definitions into engine/pkg/utils/kube/sync
* make sure engine/pkg has no dependencies on other argo-cd packages
* allow importing engine as a go module
* implement a high-level interface that might be consumed by flux
* fix deadlock caused by cluster cache event handler
* ClusterCache should return error if requested group kind not found
* remove obsolete tests
* apply reviewer notes