mirror of https://github.com/tikv/pd.git
329 lines
11 KiB
Makefile
329 lines
11 KiB
Makefile
# Build pd-server, pd-ctl, pd-recover
|
|
default: build
|
|
|
|
# Development validation.
|
|
all: dev
|
|
dev: build check tools test
|
|
|
|
# Lightweight development validation.
|
|
dev-basic: build check basic-test
|
|
|
|
.PHONY: default all dev dev-basic
|
|
|
|
#### Build ####
|
|
|
|
BUILD_FLAGS ?=
|
|
BUILD_TAGS ?=
|
|
BUILD_CGO_ENABLED := 0
|
|
BUILD_TOOL_CGO_ENABLED := 0
|
|
BUILD_GOEXPERIMENT ?=
|
|
PD_EDITION ?= Community
|
|
# Ensure PD_EDITION is set to Community or Enterprise before running build process.
|
|
ifneq "$(PD_EDITION)" "Community"
|
|
ifneq "$(PD_EDITION)" "Enterprise"
|
|
$(error Please set the correct environment variable PD_EDITION before running `make`)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(SWAGGER), 1)
|
|
BUILD_TAGS += swagger_server
|
|
endif
|
|
|
|
ifeq ($(DASHBOARD), 0)
|
|
BUILD_TAGS += without_dashboard
|
|
else
|
|
BUILD_CGO_ENABLED := 1
|
|
endif
|
|
|
|
ifeq ($(FAILPOINT), 1)
|
|
BUILD_TAGS += with_fail
|
|
endif
|
|
|
|
ifeq ("$(WITH_RACE)", "1")
|
|
BUILD_FLAGS += -race
|
|
BUILD_CGO_ENABLED := 1
|
|
endif
|
|
|
|
ifeq ($(PLUGIN), 1)
|
|
BUILD_TAGS += with_plugin
|
|
endif
|
|
|
|
ifeq ($(ENABLE_FIPS), 1)
|
|
BUILD_TAGS += boringcrypto
|
|
BUILD_GOEXPERIMENT = boringcrypto
|
|
BUILD_CGO_ENABLED := 1
|
|
BUILD_TOOL_CGO_ENABLED := 1
|
|
endif
|
|
|
|
ifeq ($(NEXT_GEN), 1)
|
|
BUILD_TAGS += nextgen
|
|
BUILD_TAGS += without_dashboard
|
|
endif
|
|
|
|
RELEASE_VERSION ?= $(shell git describe --tags --dirty --always)
|
|
ifeq ($(RUN_CI), 1)
|
|
RELEASE_VERSION := None
|
|
endif
|
|
|
|
LDFLAGS += -X "$(PD_PKG)/pkg/versioninfo.PDReleaseVersion=$(RELEASE_VERSION)"
|
|
LDFLAGS += -X "$(PD_PKG)/pkg/versioninfo.PDBuildTS=$(shell date -u '+%Y-%m-%d %I:%M:%S')"
|
|
LDFLAGS += -X "$(PD_PKG)/pkg/versioninfo.PDGitHash=$(shell git rev-parse HEAD)"
|
|
LDFLAGS += -X "$(PD_PKG)/pkg/versioninfo.PDGitBranch=$(shell git rev-parse --abbrev-ref HEAD)"
|
|
LDFLAGS += -X "$(PD_PKG)/pkg/versioninfo.PDEdition=$(PD_EDITION)"
|
|
|
|
ifneq ($(DASHBOARD), 0)
|
|
# Note: LDFLAGS must be evaluated lazily for these scripts to work correctly
|
|
LDFLAGS += -X "github.com/pingcap/tidb-dashboard/pkg/utils/version.InternalVersion=$(shell scripts/describe-dashboard.sh internal-version)"
|
|
LDFLAGS += -X "github.com/pingcap/tidb-dashboard/pkg/utils/version.Standalone=No"
|
|
LDFLAGS += -X "github.com/pingcap/tidb-dashboard/pkg/utils/version.PDVersion=$(shell git describe --tags --dirty --always)"
|
|
LDFLAGS += -X "github.com/pingcap/tidb-dashboard/pkg/utils/version.BuildTime=$(shell date -u '+%Y-%m-%d %I:%M:%S')"
|
|
LDFLAGS += -X "github.com/pingcap/tidb-dashboard/pkg/utils/version.BuildGitHash=$(shell scripts/describe-dashboard.sh git-hash)"
|
|
endif
|
|
|
|
ROOT_PATH := $(shell pwd)
|
|
BUILD_BIN_PATH := $(ROOT_PATH)/bin
|
|
|
|
build: pd-server pd-ctl pd-recover
|
|
|
|
tools: pd-tso-bench pd-heartbeat-bench pd-region-bench regions-dump stores-dump pd-api-bench pd-ut
|
|
|
|
PD_SERVER_DEP :=
|
|
ifeq ($(SWAGGER), 1)
|
|
PD_SERVER_DEP += swagger-spec
|
|
endif
|
|
ifneq ($(DASHBOARD_DISTRIBUTION_DIR),)
|
|
BUILD_TAGS += dashboard_distro
|
|
PD_SERVER_DEP += dashboard-replace-distro-info
|
|
endif
|
|
PD_SERVER_DEP += dashboard-ui
|
|
|
|
pre-build: ${PD_SERVER_DEP}
|
|
|
|
pd-server: pre-build
|
|
GOEXPERIMENT=$(BUILD_GOEXPERIMENT) CGO_ENABLED=$(BUILD_CGO_ENABLED) go build $(BUILD_FLAGS) -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -tags "$(BUILD_TAGS)" -o $(BUILD_BIN_PATH)/pd-server cmd/pd-server/main.go
|
|
|
|
pd-server-failpoint:
|
|
@$(FAILPOINT_ENABLE)
|
|
FAILPOINT=1 $(MAKE) pd-server || { $(FAILPOINT_DISABLE); exit 1; }
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
pd-server-basic:
|
|
SWAGGER=0 DASHBOARD=0 $(MAKE) pd-server
|
|
|
|
.PHONY: pre-build build tools pd-server pd-server-basic
|
|
|
|
# Tools
|
|
pd-ctl:
|
|
cd tools && GOEXPERIMENT=$(BUILD_GOEXPERIMENT) CGO_ENABLED=$(BUILD_TOOL_CGO_ENABLED) go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/pd-ctl pd-ctl/main.go
|
|
pd-tso-bench:
|
|
cd tools && CGO_ENABLED=0 go build -o $(BUILD_BIN_PATH)/pd-tso-bench pd-tso-bench/main.go
|
|
pd-api-bench:
|
|
cd tools && CGO_ENABLED=0 go build -o $(BUILD_BIN_PATH)/pd-api-bench pd-api-bench/main.go
|
|
pd-region-bench:
|
|
cd tools && CGO_ENABLED=0 go build -o $(BUILD_BIN_PATH)/pd-region-bench pd-region-bench/main.go
|
|
pd-recover:
|
|
cd tools && GOEXPERIMENT=$(BUILD_GOEXPERIMENT) CGO_ENABLED=$(BUILD_TOOL_CGO_ENABLED) go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/pd-recover pd-recover/main.go
|
|
pd-analysis:
|
|
cd tools && CGO_ENABLED=0 go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/pd-analysis pd-analysis/main.go
|
|
pd-heartbeat-bench:
|
|
cd tools && CGO_ENABLED=0 go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/pd-heartbeat-bench pd-heartbeat-bench/main.go
|
|
simulator:
|
|
cd tools && GOEXPERIMENT=$(BUILD_GOEXPERIMENT) CGO_ENABLED=$(BUILD_CGO_ENABLED) go build $(BUILD_FLAGS) -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/pd-simulator pd-simulator/main.go
|
|
regions-dump:
|
|
cd tools && CGO_ENABLED=0 go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/regions-dump regions-dump/main.go
|
|
stores-dump:
|
|
cd tools && CGO_ENABLED=0 go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/stores-dump stores-dump/main.go
|
|
pd-ut: pd-xprog
|
|
cd tools && GOEXPERIMENT=$(BUILD_GOEXPERIMENT) CGO_ENABLED=$(BUILD_TOOL_CGO_ENABLED) go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/pd-ut pd-ut/ut.go pd-ut/coverProfile.go
|
|
pd-xprog:
|
|
cd tools && GOEXPERIMENT=$(BUILD_GOEXPERIMENT) CGO_ENABLED=$(BUILD_TOOL_CGO_ENABLED) go build -tags xprog -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o $(BUILD_BIN_PATH)/xprog pd-ut/xprog.go
|
|
|
|
.PHONY: pd-ctl pd-tso-bench pd-recover pd-analysis pd-heartbeat-bench simulator regions-dump stores-dump pd-api-bench pd-ut
|
|
|
|
#### Docker image ####
|
|
|
|
docker-image:
|
|
$(eval DOCKER_PS_EXIT_CODE=$(shell docker ps > /dev/null 2>&1 ; echo $$?))
|
|
@if [ $(DOCKER_PS_EXIT_CODE) -ne 0 ]; then \
|
|
echo "Encountered problem while invoking docker cli. Is the docker daemon running?"; \
|
|
fi
|
|
docker build --no-cache -t tikv/pd .
|
|
|
|
.PHONY: docker-image
|
|
|
|
#### Build utils ###
|
|
|
|
swagger-spec: install-tools
|
|
swag init --parseDependency --parseInternal --parseDepth 1 --dir server --generalInfo api/router.go --output docs/swagger
|
|
swag fmt --dir server
|
|
|
|
dashboard-ui:
|
|
./scripts/embed-dashboard-ui.sh
|
|
|
|
dashboard-replace-distro-info:
|
|
rm -f pkg/dashboard/distro/distro_info.go
|
|
cp $(DASHBOARD_DISTRIBUTION_DIR)/distro_info.go pkg/dashboard/distro/distro_info.go
|
|
|
|
.PHONY: swagger-spec dashboard-ui dashboard-replace-distro-info
|
|
|
|
#### Static tools ####
|
|
|
|
PD_PKG := github.com/tikv/pd
|
|
PACKAGES := $(shell go list ./...)
|
|
|
|
GO_TOOLS_BIN_PATH := $(ROOT_PATH)/.tools/bin
|
|
PATH := $(GO_TOOLS_BIN_PATH):$(PATH)
|
|
SHELL := env PATH='$(PATH)' GOBIN='$(GO_TOOLS_BIN_PATH)' $(shell which bash)
|
|
|
|
install-tools:
|
|
@mkdir -p $(GO_TOOLS_BIN_PATH)
|
|
@which golangci-lint >/dev/null 2>&1 || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GO_TOOLS_BIN_PATH) v2.1.2
|
|
@grep '_' tools.go | sed 's/"//g' | awk '{print $$2}' | xargs go install
|
|
|
|
.PHONY: install-tools
|
|
|
|
#### Static checks ####
|
|
|
|
check: tidy static generate-errdoc
|
|
|
|
static: install-tools pre-build
|
|
@ echo "gofmt ..."
|
|
@ gofmt -s -l -d $(PACKAGE_DIRECTORIES) 2>&1 | awk '{ print } END { if (NR > 0) { exit 1 } }'
|
|
@ echo "golangci-lint ..."
|
|
@ golangci-lint run --verbose $(PACKAGE_DIRECTORIES) --allow-parallel-runners
|
|
@ for mod in $(SUBMODULES); do cd $$mod && $(MAKE) static && cd $(ROOT_PATH) > /dev/null; done
|
|
@ echo "leakcheck ..."
|
|
@ leakcheck -exclude-files="tests/server/join/join_test.go" $(PACKAGES)
|
|
|
|
|
|
# Because CI downloads the dashboard code and runs gofmt, we can't add this check into static now.
|
|
fmt:
|
|
@ echo "gofmt ..."
|
|
@ gofmt -s -l -w -r 'interface{} -> any' -d $(PACKAGE_DIRECTORIES) 2>&1 | awk '{ print } END { if (NR > 0) { exit 1 } }'
|
|
|
|
tidy:
|
|
@ go mod tidy
|
|
git diff go.mod go.sum | cat
|
|
git diff --quiet go.mod go.sum
|
|
|
|
@ for mod in $(SUBMODULES); do cd $$mod && $(MAKE) tidy && cd $(ROOT_PATH) > /dev/null; done
|
|
|
|
generate-errdoc: install-tools
|
|
@echo "generating errors.toml..."
|
|
./scripts/generate-errdoc.sh
|
|
|
|
check-plugin:
|
|
@echo "checking plugin..."
|
|
cd ./plugin/scheduler_example && $(MAKE) evictLeaderPlugin.so && rm evictLeaderPlugin.so
|
|
|
|
.PHONY: check static tidy generate-errdoc check-plugin
|
|
|
|
#### Test utils ####
|
|
|
|
FAILPOINT_ENABLE := $$(find $$PWD/ -type d | grep -vE "\.git" | xargs failpoint-ctl enable)
|
|
FAILPOINT_DISABLE := $$(find $$PWD/ -type d | grep -vE "\.git" | xargs failpoint-ctl disable)
|
|
|
|
failpoint-enable: install-tools
|
|
# Converting failpoints...
|
|
@$(FAILPOINT_ENABLE)
|
|
|
|
failpoint-disable: install-tools
|
|
# Restoring failpoints...
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
.PHONY: failpoint-enable failpoint-disable
|
|
|
|
#### Test ####
|
|
|
|
ut: pd-ut
|
|
@$(FAILPOINT_ENABLE)
|
|
# only run unit tests
|
|
./bin/pd-ut run --ignore tests --race --junitfile ./junitfile
|
|
@$(CLEAN_UT_BINARY)
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
PACKAGE_DIRECTORIES := $(subst $(PD_PKG)/,,$(PACKAGES))
|
|
TEST_PKGS := $(filter $(shell find . -iname "*_test.go" -exec dirname {} \; | \
|
|
sort -u | sed -e "s/^\./github.com\/tikv\/pd/"),$(PACKAGES))
|
|
BASIC_TEST_PKGS := $(filter-out $(PD_PKG)/tests%,$(TEST_PKGS))
|
|
|
|
SUBMODULES := $(filter $(shell find . -iname "go.mod" -exec dirname {} \;),\
|
|
$(filter-out .,$(shell find . -iname "Makefile" -exec dirname {} \;)))
|
|
|
|
test: install-tools
|
|
# testing all pkgs...
|
|
@$(FAILPOINT_ENABLE)
|
|
CGO_ENABLED=1 go test -tags deadlock -timeout 20m -race -cover $(TEST_PKGS) || { $(FAILPOINT_DISABLE); exit 1; }
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
basic-test: install-tools
|
|
# testing basic pkgs...
|
|
@$(FAILPOINT_ENABLE)
|
|
go test $(BASIC_TEST_PKGS) || { $(FAILPOINT_DISABLE); exit 1; }
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
ci-test-job: install-tools dashboard-ui pd-ut
|
|
@$(FAILPOINT_ENABLE)
|
|
./scripts/ci-subtask.sh $(JOB_INDEX) || { $(FAILPOINT_DISABLE); exit 1; }
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
TSO_FUNCTION_TEST_PKGS := $(PD_PKG)/tests/server/tso
|
|
|
|
test-tso-function: install-tools
|
|
# testing TSO function...
|
|
@$(FAILPOINT_ENABLE)
|
|
CGO_ENABLED=1 go test -race -tags without_dashboard,deadlock $(TSO_FUNCTION_TEST_PKGS) || { $(FAILPOINT_DISABLE); exit 1; }
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
REAL_CLUSTER_TEST_PATH := $(ROOT_PATH)/tests/integrations/realcluster
|
|
|
|
test-real-cluster:
|
|
@ rm -rf ~/.tiup/data/pd_real_cluster_test
|
|
# testing with the real cluster...
|
|
cd $(REAL_CLUSTER_TEST_PATH) && $(MAKE) check
|
|
|
|
.PHONY: test basic-test test-with-cover test-tso test-tso-function test-tso-consistency test-real-cluster
|
|
|
|
#### Daily CI coverage analyze ####
|
|
|
|
TASK_COUNT=1
|
|
TASK_ID=1
|
|
|
|
# The command should be used in daily CI, it will split some tasks to run parallel.
|
|
# It should retain report.xml,coverage,coverage.xml and package.list to analyze.
|
|
test-with-cover-parallel: install-tools dashboard-ui split
|
|
@$(FAILPOINT_ENABLE)
|
|
set -euo pipefail;\
|
|
CGO_ENABLED=1 GO111MODULE=on gotestsum --junitfile report.xml -- -v --race -covermode=atomic -coverprofile=coverage $(shell cat package.list) 2>&1 || { $(FAILPOINT_DISABLE); }; \
|
|
gocov convert coverage | gocov-xml >> coverage.xml;\
|
|
@$(FAILPOINT_DISABLE)
|
|
|
|
split:
|
|
# todo: it will remove server/api,/tests and tso packages after daily CI integrate all verify CI.
|
|
go list ./... | grep -v -E "github.com/tikv/pd/server/api|github.com/tikv/pd/tests/client|$(TSO_FUNCTION_TEST_PKGS)" > packages.list;\
|
|
split packages.list -n r/${TASK_COUNT} packages_unit_ -a 1 --numeric-suffixes=1;\
|
|
cat packages_unit_${TASK_ID} |tr "\n" " " >package.list;\
|
|
rm packages*;
|
|
|
|
#### Clean up ####
|
|
|
|
clean: failpoint-disable clean-test clean-build
|
|
|
|
CLEAN_UT_BINARY := find . -name '*.test.bin'| xargs rm -f
|
|
|
|
clean-test:
|
|
# Cleaning test tmp...
|
|
rm -rf /tmp/pd_tests*
|
|
rm -f $(REAL_CLUSTER_TEST_PATH)/playground.log
|
|
go clean -testcache
|
|
@$(CLEAN_UT_BINARY)
|
|
|
|
clean-build:
|
|
# Cleaning building files...
|
|
rm -rf .dashboard_download_cache/
|
|
rm -rf .dashboard_build_temp/
|
|
rm -rf $(BUILD_BIN_PATH)
|
|
rm -rf $(GO_TOOLS_BIN_PATH)
|
|
|
|
.PHONY: clean clean-test clean-build
|