...

Text file src/github.com/prometheus/common/Makefile.common

Documentation: github.com/prometheus/common

     1# Copyright 2018 The Prometheus Authors
     2# Licensed under the Apache License, Version 2.0 (the "License");
     3# you may not use this file except in compliance with the License.
     4# You may obtain a copy of the License at
     5#
     6# http://www.apache.org/licenses/LICENSE-2.0
     7#
     8# Unless required by applicable law or agreed to in writing, software
     9# distributed under the License is distributed on an "AS IS" BASIS,
    10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11# See the License for the specific language governing permissions and
    12# limitations under the License.
    13
    14
    15# A common Makefile that includes rules to be reused in different prometheus projects.
    16# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository!
    17
    18# Example usage :
    19# Create the main Makefile in the root project directory.
    20# include Makefile.common
    21# customTarget:
    22# 	@echo ">> Running customTarget"
    23#
    24
    25# Ensure GOBIN is not set during build so that promu is installed to the correct path
    26unexport GOBIN
    27
    28GO           ?= go
    29GOFMT        ?= $(GO)fmt
    30FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH)))
    31GOOPTS       ?=
    32GOHOSTOS     ?= $(shell $(GO) env GOHOSTOS)
    33GOHOSTARCH   ?= $(shell $(GO) env GOHOSTARCH)
    34
    35GO_VERSION        ?= $(shell $(GO) version)
    36GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION))
    37PRE_GO_111        ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.')
    38
    39PROMU        := $(FIRST_GOPATH)/bin/promu
    40pkgs          = ./...
    41
    42ifeq (arm, $(GOHOSTARCH))
    43	GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM)
    44	GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM)
    45else
    46	GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)
    47endif
    48
    49GOTEST := $(GO) test
    50GOTEST_DIR :=
    51ifneq ($(CIRCLE_JOB),)
    52ifneq ($(shell command -v gotestsum 2> /dev/null),)
    53	GOTEST_DIR := test-results
    54	GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml --
    55endif
    56endif
    57
    58PROMU_VERSION ?= 0.15.0
    59PROMU_URL     := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
    60
    61SKIP_GOLANGCI_LINT :=
    62GOLANGCI_LINT :=
    63GOLANGCI_LINT_OPTS ?=
    64GOLANGCI_LINT_VERSION ?= v1.56.2
    65# golangci-lint only supports linux, darwin and windows platforms on i386/amd64/arm64.
    66# windows isn't included here because of the path separator being different.
    67ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
    68	ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386 arm64))
    69		# If we're in CI and there is an Actions file, that means the linter
    70		# is being run in Actions, so we don't need to run it here.
    71		ifneq (,$(SKIP_GOLANGCI_LINT))
    72			GOLANGCI_LINT :=
    73		else ifeq (,$(CIRCLE_JOB))
    74			GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
    75		else ifeq (,$(wildcard .github/workflows/golangci-lint.yml))
    76			GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
    77		endif
    78	endif
    79endif
    80
    81PREFIX                  ?= $(shell pwd)
    82BIN_DIR                 ?= $(shell pwd)
    83DOCKER_IMAGE_TAG        ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD))
    84DOCKERFILE_PATH         ?= ./Dockerfile
    85DOCKERBUILD_CONTEXT     ?= ./
    86DOCKER_REPO             ?= prom
    87
    88DOCKER_ARCHS            ?= amd64
    89
    90BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS))
    91PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS))
    92TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS))
    93
    94SANITIZED_DOCKER_IMAGE_TAG := $(subst +,-,$(DOCKER_IMAGE_TAG))
    95
    96ifeq ($(GOHOSTARCH),amd64)
    97        ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows))
    98                # Only supported on amd64
    99                test-flags := -race
   100        endif
   101endif
   102
   103# This rule is used to forward a target like "build" to "common-build".  This
   104# allows a new "build" target to be defined in a Makefile which includes this
   105# one and override "common-build" without override warnings.
   106%: common-% ;
   107
   108.PHONY: common-all
   109common-all: precheck style check_license lint yamllint unused build test
   110
   111.PHONY: common-style
   112common-style:
   113	@echo ">> checking code style"
   114	@fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \
   115	if [ -n "$${fmtRes}" ]; then \
   116		echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \
   117		echo "Please ensure you are using $$($(GO) version) for formatting code."; \
   118		exit 1; \
   119	fi
   120
   121.PHONY: common-check_license
   122common-check_license:
   123	@echo ">> checking license header"
   124	@licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \
   125               awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \
   126       done); \
   127       if [ -n "$${licRes}" ]; then \
   128               echo "license header checking failed:"; echo "$${licRes}"; \
   129               exit 1; \
   130       fi
   131
   132.PHONY: common-deps
   133common-deps:
   134	@echo ">> getting dependencies"
   135	$(GO) mod download
   136
   137.PHONY: update-go-deps
   138update-go-deps:
   139	@echo ">> updating Go dependencies"
   140	@for m in $$($(GO) list -mod=readonly -m -f '{{ if and (not .Indirect) (not .Main)}}{{.Path}}{{end}}' all); do \
   141		$(GO) get -d $$m; \
   142	done
   143	$(GO) mod tidy
   144
   145.PHONY: common-test-short
   146common-test-short: $(GOTEST_DIR)
   147	@echo ">> running short tests"
   148	$(GOTEST) -short $(GOOPTS) $(pkgs)
   149
   150.PHONY: common-test
   151common-test: $(GOTEST_DIR)
   152	@echo ">> running all tests"
   153	$(GOTEST) $(test-flags) $(GOOPTS) $(pkgs)
   154
   155$(GOTEST_DIR):
   156	@mkdir -p $@
   157
   158.PHONY: common-format
   159common-format:
   160	@echo ">> formatting code"
   161	$(GO) fmt $(pkgs)
   162
   163.PHONY: common-vet
   164common-vet:
   165	@echo ">> vetting code"
   166	$(GO) vet $(GOOPTS) $(pkgs)
   167
   168.PHONY: common-lint
   169common-lint: $(GOLANGCI_LINT)
   170ifdef GOLANGCI_LINT
   171	@echo ">> running golangci-lint"
   172	$(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
   173endif
   174
   175.PHONY: common-lint-fix
   176common-lint-fix: $(GOLANGCI_LINT)
   177ifdef GOLANGCI_LINT
   178	@echo ">> running golangci-lint fix"
   179	$(GOLANGCI_LINT) run --fix $(GOLANGCI_LINT_OPTS) $(pkgs)
   180endif
   181
   182.PHONY: common-yamllint
   183common-yamllint:
   184	@echo ">> running yamllint on all YAML files in the repository"
   185ifeq (, $(shell command -v yamllint 2> /dev/null))
   186	@echo "yamllint not installed so skipping"
   187else
   188	yamllint .
   189endif
   190
   191# For backward-compatibility.
   192.PHONY: common-staticcheck
   193common-staticcheck: lint
   194
   195.PHONY: common-unused
   196common-unused:
   197	@echo ">> running check for unused/missing packages in go.mod"
   198	$(GO) mod tidy
   199	@git diff --exit-code -- go.sum go.mod
   200
   201.PHONY: common-build
   202common-build: promu
   203	@echo ">> building binaries"
   204	$(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES)
   205
   206.PHONY: common-tarball
   207common-tarball: promu
   208	@echo ">> building release tarball"
   209	$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR)
   210
   211.PHONY: common-docker-repo-name
   212common-docker-repo-name:
   213	@echo "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)"
   214
   215.PHONY: common-docker $(BUILD_DOCKER_ARCHS)
   216common-docker: $(BUILD_DOCKER_ARCHS)
   217$(BUILD_DOCKER_ARCHS): common-docker-%:
   218	docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" \
   219		-f $(DOCKERFILE_PATH) \
   220		--build-arg ARCH="$*" \
   221		--build-arg OS="linux" \
   222		$(DOCKERBUILD_CONTEXT)
   223
   224.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS)
   225common-docker-publish: $(PUBLISH_DOCKER_ARCHS)
   226$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%:
   227	docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)"
   228
   229DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION)))
   230.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS)
   231common-docker-tag-latest: $(TAG_DOCKER_ARCHS)
   232$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%:
   233	docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest"
   234	docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)"
   235
   236.PHONY: common-docker-manifest
   237common-docker-manifest:
   238	DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG))
   239	DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)"
   240
   241.PHONY: promu
   242promu: $(PROMU)
   243
   244$(PROMU):
   245	$(eval PROMU_TMP := $(shell mktemp -d))
   246	curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP)
   247	mkdir -p $(FIRST_GOPATH)/bin
   248	cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu
   249	rm -r $(PROMU_TMP)
   250
   251.PHONY: proto
   252proto:
   253	@echo ">> generating code from proto files"
   254	@./scripts/genproto.sh
   255
   256ifdef GOLANGCI_LINT
   257$(GOLANGCI_LINT):
   258	mkdir -p $(FIRST_GOPATH)/bin
   259	curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \
   260		| sed -e '/install -d/d' \
   261		| sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION)
   262endif
   263
   264.PHONY: precheck
   265precheck::
   266
   267define PRECHECK_COMMAND_template =
   268precheck:: $(1)_precheck
   269
   270PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1)))
   271.PHONY: $(1)_precheck
   272$(1)_precheck:
   273	@if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \
   274		echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \
   275		exit 1; \
   276	fi
   277endef

View as plain text