| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| GOOS ?= $(shell go env GOOS) |
| GOARCH ?= $(shell go env GOARCH) |
| |
| # Git information |
| GIT_VERSION ?= $(shell git describe --tags --always) |
| GIT_COMMIT_HASH ?= $(shell git rev-parse HEAD) |
| GIT_TREESTATE = "clean" |
| GIT_DIFF = $(shell git diff --quiet >/dev/null 2>&1; if [ $$? -eq 1 ]; then echo "1"; fi) |
| ifeq ($(GIT_DIFF), 1) |
| GIT_TREESTATE = "dirty" |
| endif |
| |
| BUILDDATE = $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') |
| |
| LDFLAGS = "-X github.com/apache/dubbo-kubernetes/pkg/version.gitTag=$(GIT_VERSION) \ |
| -X github.com/apache/dubbo-kubernetes/pkg/version.gitCommit=$(GIT_COMMIT_HASH) \ |
| -X github.com/apache/dubbo-kubernetes/pkg/version.gitTreeState=$(GIT_TREESTATE) \ |
| -X github.com/apache/dubbo-kubernetes/pkg/version.buildDate=$(BUILDDATE)" |
| |
| # Images management |
| REGISTRY ?= docker.io |
| REGISTRY_NAMESPACE ?= apache |
| REGISTRY_USER_NAME?="" |
| REGISTRY_PASSWORD?="" |
| |
| # Image URL to use all building/pushing image targets |
| DUBBO_CP_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/dubbo-cp:${GIT_VERSION}" |
| DUBBO_UI_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/dubbo-ui:${GIT_VERSION}" |
| DUBBO_DUBBOCTL_BUILDX_DIR ?= "./bin/dubboctl" |
| |
| # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) |
| ifeq (,$(shell go env GOBIN)) |
| GOBIN=$(shell go env GOPATH)/bin |
| else |
| GOBIN=$(shell go env GOBIN) |
| endif |
| |
| LOCALBIN ?= $(shell pwd)/bin |
| $(LOCALBIN): |
| mkdir -p $(LOCALBIN) |
| |
| ## Tool Binaries |
| SWAGGER ?= $(LOCALBIN)/swag |
| GOLANG_LINT ?= $(LOCALBIN)/golangci-lint |
| GOFUMPT ?= $(LOCALBIN)/gofumpt |
| |
| |
| ## Tool Versions |
| SWAGGER_VERSION ?= v1.16.1 |
| GOLANG_LINT_VERSION ?= v1.52.2 |
| GOFUMPT_VERSION ?= latest |
| NODE_VERSION ?= $(shell cat ./ui-vue3/.nvmrc | tr -cd [:digit:].) |
| ## docker buildx support platform |
| PLATFORMS ?= linux/arm64,linux/amd64 |
| |
| |
| ##@ General |
| |
| # The help target prints out all targets with their descriptions organized |
| # beneath their categories. The categories are represented by '##@' and the |
| # target descriptions by '##'. The awk commands is responsible for reading the |
| # entire set of makefiles included in this invocation, looking for lines of the |
| # file as xyz: ## something, and then pretty-format the target and help. Then, |
| # if there's a line with ##@ something, that gets pretty-printed as a category. |
| # More info on the usage of ANSI control characters for terminal formatting: |
| # https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters |
| # More info on the awk command: |
| # http://linuxcommand.org/lc3_adv_awk.php |
| |
| .PHONY: help |
| help: ## Display this help. |
| @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) |
| |
| ##@ Development |
| |
| .PHONY: swagger |
| swagger: swagger-install ## Generate dubbocp swagger docs. |
| $(SWAGGER) init --parseDependency -d app/dubbo-cp,pkg/admin -o hack/swagger |
| @rm -f hack/swagger/docs.go hack/swagger/swagger.yaml |
| |
| .PHONY: fmt |
| fmt: gofumpt-install ## Run gofumpt against code. |
| $(GOFUMPT) -l -w . |
| |
| .PHONY: vet |
| vet: ## Run go vet against code. |
| @find . -type f -name '*.go'| grep -v "/vendor/" | xargs gofmt -w -s |
| |
| # Run mod tidy against code |
| .PHONY: tidy |
| tidy: |
| @go mod tidy |
| |
| .PHONY: lint |
| lint: golangci-lint-install ## Run golang lint against code |
| GO111MODULE=on $(GOLANG_LINT) run ./... --timeout=30m -v --disable-all --enable=gofumpt --enable=govet --enable=staticcheck --enable=ineffassign --enable=misspell |
| |
| .PHONY: test |
| test: fmt vet ## Run all tests. |
| go test -coverprofile coverage.out -covermode=atomic ./... |
| |
| |
| .PHONY: test-dubboctl |
| test-dubboctl: fmt vet ## Run tests for dubboctl |
| go test -coverprofile coverage.out -covermode=atomic github.com/apache/dubbo-kubernetes/app/dubboctl/... |
| |
| .PHONY: test-dubbocp |
| test-dubbocp: fmt vet ## Run tests for dubbo control-plane |
| go test -coverprofile coverage.out -covermode=atomic github.com/apache/dubbo-kubernetes/pkg/... |
| |
| |
| .PHONY: echoLDFLAGS |
| echoLDFLAGS: |
| @echo $(LDFLAGS) |
| |
| .PHONY: build |
| build: build-dubbocp build-dubboctl ## Build binary with the dubbo control-plane and dubboctl |
| |
| .PHONY: all |
| all: test build |
| |
| .PHONY: build-dubbocp |
| build-dubbocp: ## Build binary with the dubbo control plane. |
| GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/dubbo-cp app/dubbo-cp/main.go |
| |
| .PHONY: build-dubboctl |
| build-dubboctl: ## Build binary with the dubbo dubboctl. |
| CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/dubboctl app/dubboctl/main.go |
| |
| |
| .PHONY: build-ui |
| build-ui: $(LOCALBIN)## Build the distribution of the dubbocp ui pages. |
| docker build --build-arg NODE_VERSION=${NODE_VERSION} -t ${DUBBO_UI_IMG} ./ui-vue3 |
| docker create --name dubbo-ui ${DUBBO_UI_IMG} |
| docker cp dubbo-ui:/usr/share/nginx/html/ $(LOCALBIN)/ui |
| docker rm -f dubbo-ui |
| rm -f -R ./app/dubbo-ui/dist/ |
| rm -f $(LOCALBIN)/ui/50x.html $(LOCALBIN)/ui/index.html |
| mv $(LOCALBIN)/ui/ ./app/dubbo-ui/dist/ |
| |
| .PHONY: image |
| image: image-dubbocp image-ui ## Build docker image with the dubbocp dubbo-ui |
| |
| .PHONY: image-dubbocp |
| image-dubbocp: ## Build docker image with the dubbocp. |
| docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=dubbo-cp -t ${DUBBO_CP_IMG} . |
| |
| |
| .PHONY: image-ui |
| image-ui: ## Build docker image with the dubbo ui. |
| docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=dubbo-ui -t ${DUBBO_UI_IMG} ./ui |
| |
| |
| |
| .PHONY: buildx |
| buildx: buildx-dubbocp ## Build and push docker cross-platform image for the dubbo control-plane |
| |
| |
| .PHONY: buildx-dubbocp |
| buildx-dubbocp: ## Build and push docker image with the dubbo control plane for cross-platform support |
| # copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile |
| sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile_dubbocp.cross |
| - docker buildx create --name project-dubbo-cp-builder |
| docker buildx use project-dubbo-cp-builder |
| - docker buildx build --build-arg LDFLAGS=$(LDFLAGS) --push --platform=$(PLATFORMS) --tag ${DUBBO_CP_IMG} -f Dockerfile_dubbocp.cross . |
| - docker buildx rm project-dubbo-cp-builder |
| rm Dockerfile_dubbocp.cross |
| |
| .PHONY: buildx-dubboctl |
| buildx-dubboctl: ## Build the dubboctl distribution for cross-platform support |
| @rm -f -R $(DUBBO_DUBBOCTL_BUILDX_DIR) |
| @mkdir $(DUBBO_DUBBOCTL_BUILDX_DIR) |
| CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/amd64/dubboctl app/dubboctl/main.go |
| CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/arm64/dubboctl app/dubboctl/main.go |
| CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/amd64/dubboctl app/dubboctl/main.go |
| CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/arm64/dubboctl app/dubboctl/main.go |
| CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/windows/amd64/dubboctl.exe app/dubboctl/main.go |
| |
| tar -cvzf $(DUBBO_DUBBOCTL_BUILDX_DIR)/dubboctl-${GIT_VERSION}-linux-amd64.tar.gz -C $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/amd64/ dubboctl |
| tar -cvzf $(DUBBO_DUBBOCTL_BUILDX_DIR)/dubboctl-${GIT_VERSION}-linux-arm64.tar.gz -C $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/arm64/ dubboctl |
| |
| tar -cvzf $(DUBBO_DUBBOCTL_BUILDX_DIR)/dubboctl-${GIT_VERSION}-osx-arm64.tar.gz -C $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/arm64/ dubboctl |
| tar -cvzf $(DUBBO_DUBBOCTL_BUILDX_DIR)/dubboctl-${GIT_VERSION}-osx.tar.gz -C $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/amd64/ dubboctl |
| zip $(DUBBO_DUBBOCTL_BUILDX_DIR)/dubboctl-${GIT_VERSION}-win.zip -D -j $(DUBBO_DUBBOCTL_BUILDX_DIR)/windows/amd64/dubboctl.exe |
| |
| |
| |
| .PHONY: push-images |
| push-images: push-image-dubbocp push-image-ui |
| |
| .PHONY: push-image-dubbocp |
| push-image-dubbocp: ## Push dubbocp images. |
| ifneq ($(REGISTRY_USER_NAME), "") |
| docker login -u $(REGISTRY_USER_NAME) -p $(REGISTRY_PASSWORD) ${REGISTRY} |
| endif |
| docker push ${DUBBO_CP_IMG} |
| |
| |
| .PHONY: push-image-ui |
| push-image-ui: ## Push dubbocp ui images. |
| ifneq ($(REGISTRY_USER_NAME), "") |
| docker login -u $(REGISTRY_USER_NAME) -p $(REGISTRY_PASSWORD) ${REGISTRY} |
| endif |
| docker push ${DUBBO_UI_IMG} |
| |
| |
| |
| |
| .PHONY: swagger-install |
| swagger-install: $(LOCALBIN) ## Download swagger locally if necessary. |
| test -s $(LOCALBIN)/swag || \ |
| GOBIN=$(LOCALBIN) go install github.com/swaggo/swag/cmd/swag@$(SWAGGER_VERSION) |
| |
| |
| GOLANG_LINT_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh" |
| .PHONY: golangci-lint-install |
| golangci-lint-install: $(LOCALBIN) ## Download golangci lint locally if necessary. |
| test -s $(LOCALBIN)/golangci-lint && $(LOCALBIN)/golangci-lint --version | grep -q $(GOLANG_LINT_VERSION) || \ |
| GOBIN=$(LOCALBIN) go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANG_LINT_VERSION) |
| |
| |
| .PHONY: gofumpt-install |
| gofumpt-install: $(LOCALBIN) ## Download gofumpt locally if necessary. |
| test -s $(LOCALBIN)/gofumpt || \ |
| GOBIN=$(LOCALBIN) go install mvdan.cc/gofumpt@$(GOFUMPT_VERSION) |