forked from GoogleCloudPlatform/prometheus-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
118 lines (103 loc) · 5.04 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
GOCMDS := $(notdir $(patsubst %/,%,$(dir $(shell find cmd -name 'main.go'))))
CLOUDSDK_CONFIG?=${HOME}/.config/gcloud
PROJECT_ID?=$(shell gcloud config get-value core/project)
GMP_CLUSTER?=gmp-test-cluster
GMP_LOCATION?=us-central1-c
API_DIR=pkg/operator/apis
# For now assume the docker daemon is mounted through a unix socket.
# TODO(pintohutch): will this work if using a remote docker over tcp?
DOCKER_HOST?=unix:///var/run/docker.sock
DOCKER_VOLUME:=$(DOCKER_HOST:unix://%=%)
IMAGE_REGISTRY?=gcr.io/$(PROJECT_ID)/prometheus-engine
TAG_NAME?=$(shell date "+gmp-%Y%d%m_%H%M")
define docker_build
DOCKER_BUILDKIT=1 docker build $(1)
endef
# Install QEMU packages required to build ARM images
# Create a multi-arch builder if one doesn't already exist (default builder doesn't support multi-arch).
define start_buildx
if ! docker buildx inspect multi-arch-builder; then \
docker run --rm --privileged multiarch/qemu-user-static --reset --credential yes --persistent yes; \
docker buildx create --name multi-arch-builder --use; \
fi
docker buildx use multi-arch-builder
endef
help: ## Show this help.
##
@fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//'
clean: ## Clean build time resources, primarily docker resources.
##
for i in `docker images | grep -E '^gmp/|.*/prometheus-engine/.*' | awk '{print $$3}' | uniq`; do docker image rm -f $$i; done
lint: ## Lint code.
##
@echo ">> linting code"
DOCKER_BUILDKIT=1 docker run --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.43.0 golangci-lint run -v --timeout=5m
cloudbuild: ## Build images on Google Cloud Build.
##
@echo ">> building GMP images on Cloud Build with tag: $(TAG_NAME)"
gcloud builds submit --config build.yaml --timeout=30m --substitutions=TAG_NAME="$(TAG_NAME)"
$(GOCMDS): ## Build go binary from cmd/ (e.g. 'operator').
## Set NO_DOCKER=1 to build natively without Docker.
## Set DOCKER_PUSH=1 to tag image with TAG_NAME and push to IMAGE_REGISTRY.
## By default, IMAGE_REGISTRY=gcr.io/PROJECT_ID/prometheus-engine.
##
@echo ">> building binaries"
ifeq ($(NO_DOCKER), 1)
if [ "$@" = "frontend" ]; then pkg/ui/build.sh; fi
CGO_ENABLED=0 go build -tags builtinassets -mod=vendor -o ./build/bin/$@ ./cmd/$@/*.go
else
# Build a local image.
$(call start_buildx)
docker buildx build --load --tag gmp/$@ -f ./cmd/$@/Dockerfile .
# If pushing, build and tag multi-arch image to GCR.
ifeq ($(DOCKER_PUSH), 1)
docker buildx build --tag gcr.io/${PROJECT_ID}/prometheus-engine/$@:${TAG_NAME} -f ./cmd/$@/Dockerfile . --platform linux/amd64,linux/arm64 --push
# TODO(pintohutch): this is a bit hacky, but can be useful when testing.
# Ultimately this should be replaced with go templating.
@echo ">> updating manifests with pushed images"
find manifests examples cmd/operator/deploy -type f -name "*.yaml" -exec sed -i "s#image: .*/$@:.*#image: ${IMAGE_REGISTRY}/$@:${TAG_NAME}#g" {} \;
endif
endif
bin: ## Build all go binaries from cmd/.
## All env vars from $(GOCMDS) work here as well.
##
bin: $(GOCMDS)
regen: ## Refresh autogenerated files and reformat code.
## Use DRY_RUN=1 to only validate without generating changes.
##
regen:
ifeq ($(DRY_RUN), 1)
$(call docker_build, -f ./hack/Dockerfile --target hermetic -t gmp/hermetic \
--build-arg RUNCMD='./hack/presubmit.sh all diff' .)
else
$(call docker_build, -f ./hack/Dockerfile --target sync -o . -t gmp/sync \
--build-arg RUNCMD='./hack/presubmit.sh' .)
rm -rf vendor && mv vendor.tmp vendor
endif
test: ## Run all tests. Setting NO_DOCKER=1 writes real data to GCM API under PROJECT_ID environment variable.
## Use GMP_CLUSTER, GMP_LOCATION to specify timeseries labels.
##
@echo ">> running tests"
ifeq ($(NO_DOCKER), 1)
kubectl apply -f manifests/setup.yaml
kubectl apply -f cmd/operator/deploy/operator/01-priority-class.yaml
kubectl apply -f cmd/operator/deploy/operator/03-role.yaml
go test `go list ./... | grep -v operator/e2e | grep -v export/bench`
go test `go list ./... | grep operator/e2e` -args -project-id=${PROJECT_ID} -cluster=${GMP_CLUSTER} -location=${GMP_LOCATION}
else
$(call docker_build, -f ./hack/Dockerfile --target sync -o . -t gmp/hermetic \
--build-arg RUNCMD='./hack/presubmit.sh test' .)
rm -rf vendor.tmp
endif
kindtest: ## Run e2e test suite against fresh kind k8s cluster.
##
@echo ">> building image"
$(call docker_build, -f hack/Dockerfile --target kindtest -t gmp/kindtest .)
@echo ">> running container"
# We lose some isolation by sharing the host network with the kind containers.
# However, we avoid a gcloud-shell "Dockerception" and save on build times.
docker run --network host --rm -v $(DOCKER_VOLUME):/var/run/docker.sock gmp/kindtest ./hack/kind-test.sh
presubmit: ## Run all checks and tests before submitting a change
## Use DRY_RUN=1 to only validate without regenerating changes.
##
presubmit: regen bin test kindtest