From b1c6e33516df1baf58778fe40fb4b7a6a37c6fbc Mon Sep 17 00:00:00 2001 From: Ross Golder Date: Thu, 30 Oct 2025 13:55:46 +0700 Subject: [PATCH 1/3] Update makelib/xpkg.mk Signed-off-by: Ross Golder --- makelib/xpkg.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makelib/xpkg.mk b/makelib/xpkg.mk index 192fb02..11c5c0c 100644 --- a/makelib/xpkg.mk +++ b/makelib/xpkg.mk @@ -66,7 +66,7 @@ endif # 1: xpkg define xpkg.build.targets -xpkg.build.$(1): +xpkg.build.$(1): $(CROSSPLANE_CLI) ifeq ($(XPKG_CLEANUP_EXAMPLES_ENABLED),true) @rm -rf $(WORK_DIR)/xpkg-cleaned-examples @GOOS=$(HOSTOS) GOARCH=$(TARGETARCH) go run github.com/upbound/uptest/cmd/cleanupexamples@$(XPKG_CLEANUP_EXAMPLES_VERSION) $(XPKG_EXAMPLES_DIR) $(XPKG_PROCESSED_EXAMPLES_DIR) || $(FAIL) @@ -90,7 +90,7 @@ $(foreach x,$(XPKGS),$(eval $(call xpkg.build.targets,$(x)))) # 1: registry/org 2: repo define xpkg.release.targets -xpkg.release.publish.$(1).$(2): +xpkg.release.publish.$(1).$(2): $(CROSSPLANE_CLI) @$(INFO) Pushing package $(1)/$(2):$(VERSION) @$(CROSSPLANE_CLI) xpkg push \ $(foreach p,$(XPKG_LINUX_PLATFORMS),--package-files $(XPKG_OUTPUT_DIR)/$(p)/$(2)-$(VERSION).xpkg ) \ From effecff50b90f3a5d7262e7b5cd474c3b9471c37 Mon Sep 17 00:00:00 2001 From: Ross Golder Date: Thu, 30 Oct 2025 16:46:09 +0700 Subject: [PATCH 2/3] Fix Make targets with registry orgs containing slashes Replace '/' with '-' in registry names for Make target names to avoid invalid targets like img.release.publish.ghcr.io/rossigee.provider-gitea where '/' is treated as a path separator. The IMAGE variable remains unchanged for Docker operations. Signed-off-by: Ross Golder --- makelib/imagelight.mk | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/makelib/imagelight.mk b/makelib/imagelight.mk index 5c0a182..701998c 100644 --- a/makelib/imagelight.mk +++ b/makelib/imagelight.mk @@ -90,20 +90,21 @@ img.done: # 1: registry 2: image define repo.targets -img.release.publish.$(1).$(2): +REGISTRY_SANITIZED := $(subst /,-,$(1)) +img.release.publish.$(REGISTRY_SANITIZED).$(2): @$(MAKE) -C $(IMAGE_DIR)/$(2) IMAGE_PLATFORMS=$(IMAGE_PLATFORMS) IMAGE=$(1)/$(2):$(VERSION) img.publish -img.release.publish: img.release.publish.$(1).$(2) +img.release.publish: img.release.publish.$(REGISTRY_SANITIZED).$(2) -img.release.promote.$(1).$(2): +img.release.promote.$(REGISTRY_SANITIZED).$(2): @$(MAKE) -C $(IMAGE_DIR)/$(2) TO_IMAGE=$(1)/$(2):$(CHANNEL) FROM_IMAGE=$(1)/$(2):$(VERSION) img.promote @[ "$(CHANNEL)" = "master" ] || $(MAKE) -C $(IMAGE_DIR)/$(2) TO_IMAGE=$(1)/$(2):$(VERSION)-$(CHANNEL) FROM_IMAGE=$(1)/$(2):$(VERSION) img.promote -img.release.promote: img.release.promote.$(1).$(2) +img.release.promote: img.release.promote.$(REGISTRY_SANITIZED).$(2) -img.release.clean.$(1).$(2): +img.release.clean.$(REGISTRY_SANITIZED).$(2): @[ -z "$$$$(docker images -q $(1)/$(2):$(VERSION))" ] || docker rmi $(1)/$(2):$(VERSION) @[ -z "$$$$(docker images -q $(1)/$(2):$(VERSION)-$(CHANNEL))" ] || docker rmi $(1)/$(2):$(VERSION)-$(CHANNEL) @[ -z "$$$$(docker images -q $(1)/$(2):$(CHANNEL))" ] || docker rmi $(1)/$(2):$(CHANNEL) -img.release.clean: img.release.clean.$(1).$(2) +img.release.clean: img.release.clean.$(REGISTRY_SANITIZED).$(2) endef $(foreach r,$(REGISTRY_ORGS), $(foreach i,$(IMAGES),$(eval $(call repo.targets,$(r),$(i))))) @@ -127,7 +128,7 @@ clean: img.clean img.release.clean # only publish images for main / master and release branches by default RELEASE_BRANCH_FILTER ?= main master release-% ifneq ($(filter $(RELEASE_BRANCH_FILTER),$(BRANCH_NAME)),) -publish.artifacts: $(foreach r,$(REGISTRY_ORGS), $(foreach i,$(IMAGES),img.release.publish.$(r).$(i))) +publish.artifacts: $(foreach r,$(REGISTRY_ORGS), $(foreach i,$(IMAGES),img.release.publish.$(subst /,-,$(r)).$(i))) endif -promote.artifacts: $(foreach r,$(REGISTRY_ORGS), $(foreach i,$(IMAGES),img.release.promote.$(r).$(i))) +promote.artifacts: $(foreach r,$(REGISTRY_ORGS), $(foreach i,$(IMAGES),img.release.promote.$(subst /,-,$(r)).$(i))) From a0e46d07aead4837a2c6b6c54bea8e52852e30e8 Mon Sep 17 00:00:00 2001 From: Carl Henrik Lunde Date: Mon, 16 Feb 2026 21:38:14 +0100 Subject: [PATCH 3/3] local.xpkg.sync: Add support for crossplane 2.2 cache key with digest format crossplane 2.2 has a new cache key and we need digest format to bypass DNS lookups/API calls. The code works with crossplane 2.1.4 and 2.2.0-rc.1. Related upstream change: https://github.com/crossplane/crossplane/pull/6981 Fixes https://github.com/crossplane/crossplane/issues/7147 Signed-off-by: Carl Henrik Lunde Signed-off-by: Ross Golder --- makelib/local.xpkg.mk | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/makelib/local.xpkg.mk b/makelib/local.xpkg.mk index a07bf46..fcf09a3 100644 --- a/makelib/local.xpkg.mk +++ b/makelib/local.xpkg.mk @@ -25,13 +25,23 @@ local.xpkg.init: $(KUBECTL) fi @$(OK) patching Crossplane with dev sidecar +LOCAL_XPKG_DIGEST ?= sha256:0000000000000000000000000000000000000000000000000000000000000000 + local.xpkg.sync: local.xpkg.init $(CROSSPLANE_CLI) @$(INFO) copying local xpkg cache to Crossplane pod @mkdir -p $(XPKG_OUTPUT_DIR)/cache/xpkg.crossplane.internal/dev - @# given "project-name-v0.17.0-3.gb4eee9f.dirty.xpkg" regex returns "project-name:v0.17.0-3.gb4eee9f.dirty.gz" + @# Extract each .xpkg and place it under two cache keys so that both + @# Crossplane <=2.1 and >=2.2 find the package with pullPolicy: Never. + @# - @.gz — Crossplane <=2.1 uses GetSource() as cache key + @# - .gz — Crossplane >=2.2 uses FriendlyID() as cache key + @# FriendlyID is ToDNSLabel(truncate(source,50) + "-" + truncate(digest,12)), + @# where ToDNSLabel maps non-alphanumeric chars to "-" and caps at 63 chars. + @# See https://github.com/crossplane/crossplane/blob/v2.2.0-rc.1/internal/xpkg/name.go @for pkg in $(XPKG_OUTPUT_DIR)/linux_*/*; do \ - extractedname=$$(basename $$pkg | sed 's/-v\(\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\).*\)\.xpkg/:v\1.gz/'); \ - $(CROSSPLANE_CLI) xpkg extract --from-xpkg $$pkg -o $(XPKG_OUTPUT_DIR)/cache/xpkg.crossplane.internal/dev/$$extractedname; \ + pkgname=$$(basename $$pkg | sed 's/-v\([0-9]*\.[0-9]*\.[0-9]*.*\)\.xpkg//'); \ + $(CROSSPLANE_CLI) xpkg extract --from-xpkg $$pkg -o "$(XPKG_OUTPUT_DIR)/cache/xpkg.crossplane.internal/dev/$$pkgname@$(LOCAL_XPKG_DIGEST).gz"; \ + friendlyid=$$(printf '%.50s-%.12s' "xpkg.crossplane.internal/dev/$$pkgname" "$(LOCAL_XPKG_DIGEST)" | sed 's/[^a-z0-9]/-/g' | cut -c1-63 | sed 's/-*$$//'); \ + cp "$(XPKG_OUTPUT_DIR)/cache/xpkg.crossplane.internal/dev/$$pkgname@$(LOCAL_XPKG_DIGEST).gz" $(XPKG_OUTPUT_DIR)/cache/$$friendlyid.gz; \ done @XPPOD=$$($(KUBECTL) -n $(CROSSPLANE_NAMESPACE) get pod -l app=crossplane,patched=true -o jsonpath="{.items[0].metadata.name}"); \ $(KUBECTL) -n $(CROSSPLANE_NAMESPACE) cp $(XPKG_OUTPUT_DIR)/cache -c dev $$XPPOD:/tmp @@ -39,7 +49,7 @@ local.xpkg.sync: local.xpkg.init $(CROSSPLANE_CLI) local.xpkg.deploy.configuration.%: local.xpkg.sync @$(INFO) deploying configuration package $* $(VERSION) - @echo '{"apiVersion":"pkg.crossplane.io/v1","kind":"Configuration","metadata":{"name":"$*"},"spec":{"package":"xpkg.crossplane.internal/dev/$*:$(VERSION).gz","packagePullPolicy":"Never"}}' | $(KUBECTL) apply -f - + @echo '{"apiVersion":"pkg.crossplane.io/v1","kind":"Configuration","metadata":{"name":"$*"},"spec":{"package":"xpkg.crossplane.internal/dev/$*@$(LOCAL_XPKG_DIGEST)","packagePullPolicy":"Never"}}' | $(KUBECTL) apply -f - @$(OK) deploying configuration package $* $(VERSION) local.xpkg.deploy.provider.%: $(KIND) local.xpkg.sync @@ -53,5 +63,5 @@ local.xpkg.deploy.provider.%: $(KIND) local.xpkg.sync else \ echo '{"apiVersion":"pkg.crossplane.io/v1beta1","kind":"DeploymentRuntimeConfig","metadata":{"name":"runtimeconfig-$*"},"spec":{"deploymentTemplate":{"spec":{"selector":{},"strategy":{},"template":{"spec":{"containers":[{"args":["--debug"],"image":"$(BUILD_REGISTRY)/$*-$(ARCH)","name":"package-runtime"}]}}}}}}' | $(KUBECTL) apply -f -; \ fi - @echo '{"apiVersion":"pkg.crossplane.io/v1","kind":"Provider","metadata":{"name":"$*"},"spec":{"package":"xpkg.crossplane.internal/dev/$*:$(VERSION).gz","skipDependencyResolution": $(XPKG_SKIP_DEP_RESOLUTION), "packagePullPolicy":"Never","runtimeConfigRef":{"name":"runtimeconfig-$*"}}}' | $(KUBECTL) apply -f - + @echo '{"apiVersion":"pkg.crossplane.io/v1","kind":"Provider","metadata":{"name":"$*"},"spec":{"package":"xpkg.crossplane.internal/dev/$*@$(LOCAL_XPKG_DIGEST)","skipDependencyResolution": $(XPKG_SKIP_DEP_RESOLUTION), "packagePullPolicy":"Never","runtimeConfigRef":{"name":"runtimeconfig-$*"}}}' | $(KUBECTL) apply -f - @$(OK) deploying provider package $* $(VERSION)