diff --git a/workspaces/frontend/.gitignore b/workspaces/frontend/.gitignore index 574a1040..f059546c 100644 --- a/workspaces/frontend/.gitignore +++ b/workspaces/frontend/.gitignore @@ -7,3 +7,5 @@ coverage .idea .vscode/* !.vscode/settings.json +bin/* +Dockerfile.cross diff --git a/workspaces/frontend/Makefile b/workspaces/frontend/Makefile new file mode 100755 index 00000000..a7758ae5 --- /dev/null +++ b/workspaces/frontend/Makefile @@ -0,0 +1,102 @@ +# Image URL to use for building/pushing the frontend image +IMG ?= nbv2-frontend:latest + +# CONTAINER_TOOL defines the container tool to be used for building images. +# Tested with Docker by default. You may replace with podman. +CONTAINER_TOOL ?= docker + +# Setting SHELL to bash allows bash commands to be executed by recipes. +# Options are set to exit when a recipe line exits non-zero or a piped command fails. +SHELL = /usr/bin/env bash -o pipefail +.SHELLFLAGS = -ec + +.PHONY: all +all: help + +##@ General + +# The help target prints all targets with descriptions organized beneath categories. +.PHONY: help +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-18s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +##@ Clean + +.PHONY: clean +clean: ## Remove local test/build artifacts. + rm -rf ./bin ./Dockerfile.cross + +##@ Build + +# If you wish to build the image targeting other platforms you can use the --platform flag. +# (i.e. docker build --platform linux/arm64). Requires Docker BuildKit. +.PHONY: docker-build +docker-build: ## Build docker image for the frontend. + $(CONTAINER_TOOL) build -t ${IMG} . + +.PHONY: docker-push +docker-push: ## Push docker image for the frontend. + $(CONTAINER_TOOL) push ${IMG} + +# PLATFORMS defines the target platforms for cross-platform support. +PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le + +.PHONY: docker-buildx +docker-buildx: ## Build and push docker image for cross-platform support. + # copy existing Dockerfile and insert --platform=$${BUILDPLATFORM} into Dockerfile.cross, preserving the original + sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross + - $(CONTAINER_TOOL) buildx create --name project-v3-builder + $(CONTAINER_TOOL) buildx use project-v3-builder + - $(CONTAINER_TOOL) buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile.cross . + - $(CONTAINER_TOOL) buildx rm project-v3-builder + rm Dockerfile.cross + +##@ Deployment + +# KUSTOMIZE_DIR point at a directory containing kustomization.yaml for the frontend deployment. +# Optionally set KUSTOMIZE_IMAGE_NAME (defaults to "frontend") to the image name key used in that kustomization. + +.PHONY: deploy +deploy: kustomize ## Deploy frontend to the K8s cluster specified in ~/.kube/config. + cd manifests/kustomize/overlays/istio && $(KUSTOMIZE) edit set image workspaces-frontend=${IMG} + $(KUBECTL) apply -k manifests/kustomize/overlays/istio + +.PHONY: undeploy +undeploy: kustomize ## Undeploy frontend from the K8s cluster specified in ~/.kube/config. + $(KUBECTL) delete -k manifests/kustomize/overlays/istio --ignore-not-found=true + + +##@ Dependencies + +# Location to install dependencies to +LOCALBIN ?= $(shell pwd)/bin +$(LOCALBIN): + mkdir -p $(LOCALBIN) + +# Tool Binaries +KUBECTL ?= kubectl +KUSTOMIZE ?= $(LOCALBIN)/kustomize + +# Tool Versions +KUSTOMIZE_VERSION ?= v5.5.0 + +.PHONY: kustomize +kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. +$(KUSTOMIZE): $(LOCALBIN) + $(call go-install-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/v5,$(KUSTOMIZE_VERSION)) + +# go-install-tool will 'go install' any package with custom target and name of binary, if it doesn't exist +# $1 - target path with name of binary +# $2 - package url which can be installed +# $3 - specific version of package +define go-install-tool +@[ -f "$(1)-$(3)" ] || { \ +set -e; \ +package=$(2)@$(3) ;\ +echo "Downloading $${package}" ;\ +rm -f $(1) || true ;\ +GOBIN=$(LOCALBIN) go install $${package} ;\ +mv $(1) $(1)-$(3) ;\ +} ;\ +ln -sf $(1)-$(3) $(1) +endef