From 147fe6c8e95466436a7c026481b53fcf6d06aabe Mon Sep 17 00:00:00 2001 From: Oleksii Kurinnyi Date: Thu, 25 Jun 2026 16:44:02 +0300 Subject: [PATCH] feat: add Makefile targets for project-clone and project-backup images Add multi-arch build and push targets for project-clone and project-backup images, matching the existing controller image pattern. Previously these images required manual docker/podman build commands that produced single-arch images only. New targets: - docker-project-clone: build and push project-clone - docker-project-backup: build and push project-backup - docker-all: build and push all three images All targets support Docker (with buildx) and Podman, and produce multi-arch (amd64 + arm64) images with proper manifest lists. Assisted-by: Claude Code Signed-off-by: Oleksii Kurinnyi --- Makefile | 159 +++++++++++++++++++++++++++++++++++++++++ docs/release/README.md | 19 ++--- 2 files changed, 169 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 6e057aab4..43b360745 100644 --- a/Makefile +++ b/Makefile @@ -332,6 +332,149 @@ else $(DOCKER) manifest push ${DWO_IMG} endif +### docker-project-clone: Builds and pushes project-clone image +docker-project-clone: _print_vars docker-build-project-clone docker-push-project-clone + +### docker-build-project-clone: Builds the multi-arch project-clone image (supports both amd64 and arm64) +docker-build-project-clone: + @echo "Building multi-arch image ${PROJECT_CLONE_IMG} for linux/amd64,linux/arm64 using $(CONTAINER_TOOL)" +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for multi-arch builds. Please update Docker or enable buildx) + endif + @echo "Using Docker buildx to build multi-arch images" + $(MAKE) _docker-build-project-clone-amd64 _docker-build-project-clone-arm64 + @echo "✅ Built multi-arch images locally:" + @echo " ${PROJECT_CLONE_IMG}-amd64" + @echo " ${PROJECT_CLONE_IMG}-arm64" + @echo "Note: Manifest list will be created during push to registry" +else + @echo "Using Podman to build multi-arch image" + $(MAKE) _docker-build-project-clone-amd64 _docker-build-project-clone-arm64 + @echo "Creating manifest list for ${PROJECT_CLONE_IMG} using Podman" + @echo "Cleaning up any existing images/manifests with the same name" + @$(DOCKER) manifest rm ${PROJECT_CLONE_IMG} 2>/dev/null || echo " (manifest not found, continuing)" + @$(DOCKER) rmi ${PROJECT_CLONE_IMG} 2>/dev/null || echo " (image not found, continuing)" + $(DOCKER) manifest create ${PROJECT_CLONE_IMG} ${PROJECT_CLONE_IMG}-amd64 ${PROJECT_CLONE_IMG}-arm64 +endif + +### _docker-build-project-clone-amd64: Builds the amd64 project-clone image +_docker-build-project-clone-amd64: +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for platform-specific builds. Please update Docker or enable buildx) + endif + $(DOCKER) buildx build . --platform linux/amd64 --load -t ${PROJECT_CLONE_IMG}-amd64 -f project-clone/Dockerfile +else + $(DOCKER) build . --platform linux/amd64 -t ${PROJECT_CLONE_IMG}-amd64 -f project-clone/Dockerfile +endif + +### _docker-build-project-clone-arm64: Builds the arm64 project-clone image +_docker-build-project-clone-arm64: +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for platform-specific builds. Please update Docker or enable buildx) + endif + $(DOCKER) buildx build . --platform linux/arm64 --load -t ${PROJECT_CLONE_IMG}-arm64 -f project-clone/Dockerfile +else + $(DOCKER) build . --platform linux/arm64 -t ${PROJECT_CLONE_IMG}-arm64 -f project-clone/Dockerfile +endif + +### docker-push-project-clone: Pushes the multi-arch project-clone image to the registry +docker-push-project-clone: _docker-check-push-project-clone + @echo "Pushing multi-arch image ${PROJECT_CLONE_IMG} using $(CONTAINER_TOOL)" +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for multi-arch pushes. Please update Docker or enable buildx) + endif + @echo "Using Docker buildx to push multi-arch image" + $(DOCKER) push ${PROJECT_CLONE_IMG}-amd64 + $(DOCKER) push ${PROJECT_CLONE_IMG}-arm64 + @echo "Creating and pushing manifest list using Docker buildx" + $(DOCKER) buildx imagetools create -t ${PROJECT_CLONE_IMG} ${PROJECT_CLONE_IMG}-amd64 ${PROJECT_CLONE_IMG}-arm64 +else + @echo "Using Podman to push multi-arch image" + $(DOCKER) push ${PROJECT_CLONE_IMG}-amd64 + $(DOCKER) push ${PROJECT_CLONE_IMG}-arm64 + @echo "Cleaning up any existing manifests before recreating" + @$(DOCKER) manifest rm ${PROJECT_CLONE_IMG} 2>/dev/null || echo " (manifest not found, continuing)" + $(DOCKER) manifest create ${PROJECT_CLONE_IMG} ${PROJECT_CLONE_IMG}-amd64 ${PROJECT_CLONE_IMG}-arm64 + $(DOCKER) manifest push ${PROJECT_CLONE_IMG} +endif + +### docker-project-backup: Builds and pushes project-backup image +docker-project-backup: _print_vars docker-build-project-backup docker-push-project-backup + +### docker-build-project-backup: Builds the multi-arch project-backup image (supports both amd64 and arm64) +docker-build-project-backup: + @echo "Building multi-arch image ${PROJECT_BACKUP_IMG} for linux/amd64,linux/arm64 using $(CONTAINER_TOOL)" +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for multi-arch builds. Please update Docker or enable buildx) + endif + @echo "Using Docker buildx to build multi-arch images" + $(MAKE) _docker-build-project-backup-amd64 _docker-build-project-backup-arm64 + @echo "✅ Built multi-arch images locally:" + @echo " ${PROJECT_BACKUP_IMG}-amd64" + @echo " ${PROJECT_BACKUP_IMG}-arm64" + @echo "Note: Manifest list will be created during push to registry" +else + @echo "Using Podman to build multi-arch image" + $(MAKE) _docker-build-project-backup-amd64 _docker-build-project-backup-arm64 + @echo "Creating manifest list for ${PROJECT_BACKUP_IMG} using Podman" + @echo "Cleaning up any existing images/manifests with the same name" + @$(DOCKER) manifest rm ${PROJECT_BACKUP_IMG} 2>/dev/null || echo " (manifest not found, continuing)" + @$(DOCKER) rmi ${PROJECT_BACKUP_IMG} 2>/dev/null || echo " (image not found, continuing)" + $(DOCKER) manifest create ${PROJECT_BACKUP_IMG} ${PROJECT_BACKUP_IMG}-amd64 ${PROJECT_BACKUP_IMG}-arm64 +endif + +### _docker-build-project-backup-amd64: Builds the amd64 project-backup image +_docker-build-project-backup-amd64: +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for platform-specific builds. Please update Docker or enable buildx) + endif + $(DOCKER) buildx build ./project-backup/ --platform linux/amd64 --load -t ${PROJECT_BACKUP_IMG}-amd64 -f project-backup/Containerfile +else + $(DOCKER) build ./project-backup/ --platform linux/amd64 -t ${PROJECT_BACKUP_IMG}-amd64 -f project-backup/Containerfile +endif + +### _docker-build-project-backup-arm64: Builds the arm64 project-backup image +_docker-build-project-backup-arm64: +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for platform-specific builds. Please update Docker or enable buildx) + endif + $(DOCKER) buildx build ./project-backup/ --platform linux/arm64 --load -t ${PROJECT_BACKUP_IMG}-arm64 -f project-backup/Containerfile +else + $(DOCKER) build ./project-backup/ --platform linux/arm64 -t ${PROJECT_BACKUP_IMG}-arm64 -f project-backup/Containerfile +endif + +### docker-push-project-backup: Pushes the multi-arch project-backup image to the registry +docker-push-project-backup: _docker-check-push-project-backup + @echo "Pushing multi-arch image ${PROJECT_BACKUP_IMG} using $(CONTAINER_TOOL)" +ifeq ($(CONTAINER_TOOL),docker) + ifeq ($(BUILDX_AVAILABLE),false) + $(error Docker buildx is required for multi-arch pushes. Please update Docker or enable buildx) + endif + @echo "Using Docker buildx to push multi-arch image" + $(DOCKER) push ${PROJECT_BACKUP_IMG}-amd64 + $(DOCKER) push ${PROJECT_BACKUP_IMG}-arm64 + @echo "Creating and pushing manifest list using Docker buildx" + $(DOCKER) buildx imagetools create -t ${PROJECT_BACKUP_IMG} ${PROJECT_BACKUP_IMG}-amd64 ${PROJECT_BACKUP_IMG}-arm64 +else + @echo "Using Podman to push multi-arch image" + $(DOCKER) push ${PROJECT_BACKUP_IMG}-amd64 + $(DOCKER) push ${PROJECT_BACKUP_IMG}-arm64 + @echo "Cleaning up any existing manifests before recreating" + @$(DOCKER) manifest rm ${PROJECT_BACKUP_IMG} 2>/dev/null || echo " (manifest not found, continuing)" + $(DOCKER) manifest create ${PROJECT_BACKUP_IMG} ${PROJECT_BACKUP_IMG}-amd64 ${PROJECT_BACKUP_IMG}-arm64 + $(DOCKER) manifest push ${PROJECT_BACKUP_IMG} +endif + +### docker-all: Builds and pushes all images (controller, project-clone, project-backup) +docker-all: docker docker-project-clone docker-project-backup + ### _docker-check-push: Asks for confirmation before pushing the image, unless running in CI _docker-check-push: ifneq ($(INITIATOR),CI) @@ -340,6 +483,22 @@ _docker-check-push: endif endif +### _docker-check-push-project-clone: Asks for confirmation before pushing project-clone, unless running in CI +_docker-check-push-project-clone: + ifneq ($(INITIATOR),CI) + ifeq ($(PROJECT_CLONE_IMG),quay.io/devfile/project-clone:next) + @echo -n "Are you sure you want to push $(PROJECT_CLONE_IMG)? [y/N] " && read ans && [ $${ans:-N} = y ] + endif + endif + +### _docker-check-push-project-backup: Asks for confirmation before pushing project-backup, unless running in CI +_docker-check-push-project-backup: + ifneq ($(INITIATOR),CI) + ifeq ($(PROJECT_BACKUP_IMG),quay.io/devfile/project-backup:next) + @echo -n "Are you sure you want to push $(PROJECT_BACKUP_IMG)? [y/N] " && read ans && [ $${ans:-N} = y ] + endif + endif + ### compile-devworkspace-controller: Compiles the devworkspace-controller binary .PHONY: compile-devworkspace-controller compile-devworkspace-controller: diff --git a/docs/release/README.md b/docs/release/README.md index c3d95b487..3fa3331d3 100644 --- a/docs/release/README.md +++ b/docs/release/README.md @@ -41,19 +41,20 @@ This means that to test commits in a release branch before running the release j export DWO_IMG=quay.io/yourrepo/devworkspace-controller:prerelease export PROJECT_CLONE_IMG=quay.io/yourrepo/project-clone:prerelease export PROJECT_BACKUP_IMG=quay.io/yourrepo/project-backup:prerelease -# build and push project clone image -podman build -t "$PROJECT_CLONE_IMG" -f ./project-clone/Dockerfile . -podman push "$PROJECT_CLONE_IMG" -# build and push project backup image -podman build -t "$PROJECT_BACKUP_IMG" -f ./project-backup/Containerfile ./project-backup/ -podman push "$PROJECT_BACKUP_IMG" -# build and push DevWorkspace Operator image -export DOCKER=podman # optional -make docker +# build and push all images (controller, project-clone, project-backup) +make docker-all # deploy DevWorkspace Operator using these images make install ``` +The `docker-all` target builds multi-arch (amd64 and arm64) images for all three components. It auto-detects Docker or Podman. You can also build images individually: + +```bash +make docker # controller only +make docker-project-clone # project-clone only +make docker-project-backup # project-backup only +``` + ### Releasing a new version > :warning: If necessary, cherry-pick any additional fixes to the release branch.