2021-08-11 20:48:29 +00:00
# For documentation on building consul from source, refer to:
# https://www.consul.io/docs/install#compiling-from-source
2017-04-27 18:49:43 +00:00
SHELL = bash
2022-03-29 20:18:05 +00:00
2023-06-16 20:29:50 +00:00
2023-06-05 20:08:39 +00:00
GO_MODULES := $( shell find . -name go.mod -exec dirname { } \; | grep -v "proto-gen-rpc-glue/e2e" | sort)
2022-05-23 14:37:52 +00:00
###
2022-05-23 15:50:45 +00:00
# These version variables can either be a valid string for "go install <module>@<version>"
2022-05-23 14:37:52 +00:00
# or the string @DEV to imply use what is currently installed locally.
###
2024-01-12 14:57:38 +00:00
GOLANGCI_LINT_VERSION = 'v1.55.2'
2024-02-20 20:42:31 +00:00
MOCKERY_VERSION = 'v2.41.0'
2023-08-11 15:04:44 +00:00
BUF_VERSION = 'v1.26.0'
2023-02-17 21:14:46 +00:00
2023-11-09 18:34:31 +00:00
PROTOC_GEN_GO_GRPC_VERSION = 'v1.2.0'
2024-03-04 18:24:22 +00:00
MOG_VERSION = 'v0.4.2'
2022-04-05 16:58:07 +00:00
PROTOC_GO_INJECT_TAG_VERSION = 'v1.3.0'
2023-11-09 18:34:31 +00:00
PROTOC_GEN_GO_BINARY_VERSION = 'v0.1.0'
2024-05-16 17:40:15 +00:00
DEEP_COPY_VERSION = 'e112476c0181d3d69067bac191f9b6bcda2ce812'
2023-09-11 17:50:52 +00:00
COPYWRITE_TOOL_VERSION = 'v0.16.4'
2023-12-06 17:11:32 +00:00
LINT_CONSUL_RETRY_VERSION = 'v1.4.0'
2023-11-09 18:34:31 +00:00
# Go imports formatter
GCI_VERSION = 'v0.11.2'
2017-06-29 12:50:47 +00:00
2022-09-30 04:17:30 +00:00
MOCKED_PB_DIRS = pbdns
2017-08-30 11:25:14 +00:00
GOTAGS ?=
2018-01-04 19:38:20 +00:00
GOPATH = $( shell go env GOPATH)
2022-08-16 20:47:39 +00:00
GOARCH ?= $( shell go env GOARCH)
2019-07-04 14:22:59 +00:00
MAIN_GOPATH = $( shell go env GOPATH | cut -d: -f1)
2017-04-18 22:03:51 +00:00
2022-04-05 16:58:07 +00:00
export PATH := $( PWD) /bin:$( GOPATH) /bin:$( PATH)
2022-02-11 16:45:37 +00:00
2017-04-18 22:03:51 +00:00
# Get the git commit
2018-06-08 14:20:54 +00:00
GIT_COMMIT ?= $( shell git rev-parse --short HEAD)
2020-01-24 15:40:14 +00:00
GIT_COMMIT_YEAR ?= $( shell git show -s --format= %cd --date= format:%Y HEAD)
2018-06-08 14:20:54 +00:00
GIT_DIRTY ?= $( shell test -n "`git status --porcelain`" && echo "+CHANGES" || true )
2017-04-18 22:03:51 +00:00
GIT_IMPORT = github.com/hashicorp/consul/version
2022-03-18 16:55:12 +00:00
DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ" # it's tricky to do an RFC3339 format in a cross platform way, so we hardcode UTC
2022-06-02 02:29:40 +00:00
GIT_DATE = $( shell $( CURDIR) /build-support/scripts/build-date.sh) # we're using this for build date because it's stable across platform builds
2022-03-18 16:55:12 +00:00
GOLDFLAGS = -X $( GIT_IMPORT) .GitCommit= $( GIT_COMMIT) $( GIT_DIRTY) -X $( GIT_IMPORT) .BuildDate= $( GIT_DATE)
2017-04-18 22:03:51 +00:00
2023-01-11 21:34:27 +00:00
GOTESTSUM_PATH ?= $( shell command -v gotestsum)
2018-06-15 01:25:59 +00:00
i f e q ( $( FORCE_REBUILD ) , 1 )
NOCACHE = --no-cache
e l s e
NOCACHE =
e n d i f
DOCKER_BUILD_QUIET ?= 1
i f e q ( $ { D O C K E R _ B U I L D _ Q U I E T } , 1 )
QUIET = -q
e l s e
QUIET =
e n d i f
2023-01-11 21:34:27 +00:00
i f e q ( "$(GOTAGS)" , "" )
2023-07-17 18:11:19 +00:00
CONSUL_COMPAT_TEST_IMAGE = hashicorp/consul
2023-01-11 21:34:27 +00:00
e l s e
CONSUL_COMPAT_TEST_IMAGE = hashicorp/consul-enterprise
e n d i f
2018-06-15 01:25:59 +00:00
CONSUL_DEV_IMAGE ?= consul-dev
2018-06-08 14:20:54 +00:00
GO_BUILD_TAG ?= consul-build-go
UI_BUILD_TAG ?= consul-build-ui
BUILD_CONTAINER_NAME ?= consul-builder
2019-04-12 19:17:13 +00:00
CONSUL_IMAGE_VERSION ?= latest
2024-01-08 22:18:41 +00:00
# When changing the method of Go version detection, also update
# version detection in CI workflows (reusable-get-go-version.yml).
GOLANG_VERSION ?= $( shell head -n 1 .go-version)
2024-07-05 19:19:23 +00:00
# Takes the highest version from the ENVOY_VERSIONS file.
ENVOY_VERSION ?= $( shell cat envoyextensions/xdscommon/ENVOY_VERSIONS | grep '^[[:digit:]]' | sort -nr | head -n 1)
2023-10-06 16:06:12 +00:00
CONSUL_DATAPLANE_IMAGE := $( or $( CONSUL_DATAPLANE_IMAGE) ,"docker.io/hashicorppreview/consul-dataplane:1.3-dev-ubi" )
2023-11-07 18:41:14 +00:00
DEPLOYER_CONSUL_DATAPLANE_IMAGE := $( or $( DEPLOYER_CONSUL_DATAPLANE_IMAGE) , "docker.io/hashicorppreview/consul-dataplane:1.3-dev" )
2018-06-08 14:20:54 +00:00
2023-06-16 20:29:50 +00:00
CONSUL_VERSION ?= $( shell cat version/VERSION)
2019-07-25 13:19:09 +00:00
2019-07-04 14:22:59 +00:00
TEST_MODCACHE ?= 1
TEST_BUILDCACHE ?= 1
# You can only use as many CPUs as you have allocated to docker
i f d e f T E S T _ D O C K E R _ C P U S
TEST_DOCKER_RESOURCE_CONSTRAINTS = --cpus $( TEST_DOCKER_CPUS)
TEST_PARALLELIZATION = -e GOMAXPROCS = $( TEST_DOCKER_CPUS)
e l s e
TEST_DOCKER_RESOURCE_CONSTRAINTS =
TEST_PARALLELIZATION =
e n d i f
i f e q ( $( TEST_MODCACHE ) , 1 )
TEST_MODCACHE_VOL = -v $( MAIN_GOPATH) /pkg/mod:/go/pkg/mod
e l s e
TEST_MODCACHE_VOL =
e n d i f
i f e q ( $( TEST_BUILDCACHE ) , 1 )
TEST_BUILDCACHE_VOL = -v $( shell go env GOCACHE) :/root/.caches/go-build
e l s e
TEST_BUILDCACHE_VOL =
e n d i f
2018-06-12 20:55:52 +00:00
DIST_TAG ?= 1
DIST_BUILD ?= 1
DIST_SIGN ?= 1
2018-06-15 01:25:59 +00:00
i f d e f D I S T _ V E R S I O N
2018-06-18 18:36:24 +00:00
DIST_VERSION_ARG = -v " $( DIST_VERSION) "
2018-06-15 01:25:59 +00:00
e l s e
DIST_VERSION_ARG =
e n d i f
i f d e f D I S T _ R E L E A S E _ D A T E
2018-06-18 18:36:24 +00:00
DIST_DATE_ARG = -d " $( DIST_RELEASE_DATE) "
2018-06-15 01:25:59 +00:00
e l s e
DIST_DATE_ARG =
e n d i f
2018-06-18 21:01:20 +00:00
i f d e f D I S T _ P R E R E L E A S E
DIST_REL_ARG = -r " $( DIST_PRERELEASE) "
e l s e
DIST_REL_ARG =
e n d i f
2018-06-15 19:23:26 +00:00
PUB_GIT ?= 1
PUB_WEBSITE ?= 1
i f e q ( $( PUB_GIT ) , 1 )
PUB_GIT_ARG = -g
e l s e
PUB_GIT_ARG =
e n d i f
i f e q ( $( PUB_WEBSITE ) , 1 )
2018-06-26 18:08:10 +00:00
PUB_WEBSITE_ARG = -w
2018-06-15 19:23:26 +00:00
e l s e
PUB_WEBSITE_ARG =
e n d i f
2018-06-26 18:26:23 +00:00
2018-06-08 14:20:54 +00:00
export GO_BUILD_TAG
export UI_BUILD_TAG
export BUILD_CONTAINER_NAME
export GIT_COMMIT
2020-01-24 15:40:14 +00:00
export GIT_COMMIT_YEAR
2018-06-08 14:20:54 +00:00
export GIT_DIRTY
export GOTAGS
2017-04-18 22:03:51 +00:00
export GOLDFLAGS
2013-12-06 23:43:07 +00:00
2019-04-29 16:27:57 +00:00
# Allow skipping docker build during integration tests in CI since we already
# have a built binary
2022-08-29 23:13:49 +00:00
ENVOY_INTEG_DEPS ?= docker-envoy-integ
2019-04-29 16:27:57 +00:00
i f d e f S K I P _ D O C K E R _ B U I L D
ENVOY_INTEG_DEPS = noop
e n d i f
2018-06-26 18:26:23 +00:00
2023-07-17 19:27:24 +00:00
##@ Build
.PHONY : all
all : dev -build ## Command running by default
2016-10-25 20:49:57 +00:00
2019-04-29 16:27:57 +00:00
# used to make integration dependencies conditional
noop : ;
2023-07-17 19:27:24 +00:00
.PHONY : dev
dev : dev -build ## Dev creates binaries for testing locally - these are put into ./bin
2017-07-18 07:22:49 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : dev -build
dev-build : ## Same as dev
2021-09-08 23:50:42 +00:00
mkdir -p bin
2022-02-11 16:45:37 +00:00
CGO_ENABLED = 0 go install -ldflags " $( GOLDFLAGS) " -tags " $( GOTAGS) "
2022-10-21 18:10:11 +00:00
# rm needed due to signature caching (https://apple.stackexchange.com/a/428388)
rm -f ./bin/consul
cp ${ MAIN_GOPATH } /bin/consul ./bin/consul
2018-06-15 01:25:59 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : dev -docker -dbg
dev-docker-dbg : dev -docker ## Build containers for debug mode
2023-04-18 13:49:53 +00:00
@echo " Pulling consul container image - $( CONSUL_IMAGE_VERSION) "
2023-06-27 23:17:20 +00:00
@docker pull hashicorp/consul:$( CONSUL_IMAGE_VERSION) >/dev/null
2023-04-18 13:49:53 +00:00
@echo " Building Consul Development container - $( CONSUL_DEV_IMAGE) "
@# 'consul-dbg:local' tag is needed to run the integration tests
@# 'consul-dev:latest' is needed by older workflows
2023-05-24 16:14:26 +00:00
@docker buildx use default && docker buildx build -t $( CONSUL_COMPAT_TEST_IMAGE) -dbg:local \
2023-04-18 13:49:53 +00:00
--platform linux/$( GOARCH) \
--build-arg CONSUL_IMAGE_VERSION = $( CONSUL_IMAGE_VERSION) \
--load \
-f $( CURDIR) /build-support/docker/Consul-Dev-Dbg.dockerfile $( CURDIR) /pkg/bin/
2023-07-17 19:27:24 +00:00
.PHONY : dev -docker
dev-docker : linux dev -build ## Build and tag docker images in dev env
2019-04-12 19:17:13 +00:00
@echo " Pulling consul container image - $( CONSUL_IMAGE_VERSION) "
2023-06-27 23:17:20 +00:00
@docker pull hashicorp/consul:$( CONSUL_IMAGE_VERSION) >/dev/null
2019-04-12 19:17:13 +00:00
@echo " Building Consul Development container - $( CONSUL_DEV_IMAGE) "
2022-10-28 15:27:24 +00:00
@# 'consul:local' tag is needed to run the integration tests
@# 'consul-dev:latest' is needed by older workflows
@docker buildx use default && docker buildx build -t 'consul:local' -t '$(CONSUL_DEV_IMAGE)' \
2022-08-16 20:47:39 +00:00
--platform linux/$( GOARCH) \
--build-arg CONSUL_IMAGE_VERSION = $( CONSUL_IMAGE_VERSION) \
2023-06-16 20:29:50 +00:00
--label org.opencontainers.image.version= $( CONSUL_VERSION) \
--label version = $( CONSUL_VERSION) \
2022-08-16 20:47:39 +00:00
--load \
-f $( CURDIR) /build-support/docker/Consul-Dev-Multiarch.dockerfile $( CURDIR) /pkg/bin/
2023-06-22 17:50:46 +00:00
docker tag 'consul:local' '$(CONSUL_COMPAT_TEST_IMAGE):local'
2022-08-16 20:47:39 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : check -remote -dev -image -env
check-remote-dev-image-env : ## Check remote dev image env
2022-08-16 20:47:39 +00:00
i f n d e f R E M O T E _ D E V _ I M A G E
$( error REMOTE_DEV_IMAGE is undefined: set this image to <your_docker_repo>/<your_docker_image>:<image_tag>, e.g. hashicorp/consul-k8s-dev:latest)
e n d i f
2023-07-17 19:27:24 +00:00
.PHONY : remote -docker
remote-docker : check -remote -dev -image -env ## Remote docker
2022-08-16 20:47:39 +00:00
$( MAKE) GOARCH = amd64 linux
$( MAKE) GOARCH = arm64 linux
@echo " Pulling consul container image - $( CONSUL_IMAGE_VERSION) "
2023-06-27 23:17:20 +00:00
@docker pull hashicorp/consul:$( CONSUL_IMAGE_VERSION) >/dev/null
2022-08-16 20:47:39 +00:00
@echo " Building and Pushing Consul Development container - $( REMOTE_DEV_IMAGE) "
2022-12-22 20:44:18 +00:00
@if ! docker buildx inspect consul-builder; then \
docker buildx create --name consul-builder --driver docker-container --bootstrap; \
fi ;
@docker buildx use consul-builder && docker buildx build -t '$(REMOTE_DEV_IMAGE)' \
2022-08-16 20:47:39 +00:00
--platform linux/amd64,linux/arm64 \
--build-arg CONSUL_IMAGE_VERSION = $( CONSUL_IMAGE_VERSION) \
2023-06-16 20:29:50 +00:00
--label org.opencontainers.image.version= $( CONSUL_VERSION) \
--label version = $( CONSUL_VERSION) \
2022-08-16 20:47:39 +00:00
--push \
-f $( CURDIR) /build-support/docker/Consul-Dev-Multiarch.dockerfile $( CURDIR) /pkg/bin/
2015-10-22 18:16:01 +00:00
2023-07-17 19:27:24 +00:00
linux : ## Linux builds a linux binary compatible with the source platform
2022-08-16 20:47:39 +00:00
@mkdir -p ./pkg/bin/linux_$( GOARCH)
CGO_ENABLED = 0 GOOS = linux GOARCH = $( GOARCH) go build -o ./pkg/bin/linux_$( GOARCH) -ldflags " $( GOLDFLAGS) " -tags " $( GOTAGS) "
2017-05-04 11:31:56 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : go -mod -tidy
go-mod-tidy : $( foreach mod ,$ ( GO_MODULES ) ,go -mod -tidy /$ ( mod ) ) ## Run go mod tidy in every module
.PHONY : mod -tidy /%
go-mod-tidy/% :
@echo " --> Running go mod tidy ( $* ) "
@cd $* && go mod tidy
2024-02-21 16:11:15 +00:00
.PHONY : go -mod -get
go-mod-get : $( foreach mod ,$ ( GO_MODULES ) ,go -mod -get /$ ( mod ) ) ## Run go get and go mod tidy in every module for the given dependency
.PHONY : go -mod -get /%
go-mod-get/% :
i f n d e f D E P _ V E R S I O N
$( error DEP_VERSION is undefined: set this to <dependency>@<version>, e.g. github.com/hashicorp/go-hclog@v1.5.0)
e n d i f
@echo " --> Running go get ${ DEP_VERSION } ( $* ) "
@cd $* && go get $( DEP_VERSION)
@echo " --> Running go mod tidy ( $* ) "
@cd $* && go mod tidy
2023-07-17 19:27:24 +00:00
##@ Checks
.PHONY : fmt
fmt : $( foreach mod ,$ ( GO_MODULES ) ,fmt /$ ( mod ) ) ## Format go modules
.PHONY : fmt /%
fmt/% :
@echo " --> Running go fmt ( $* ) "
@cd $* && gofmt -s -l -w .
.PHONY : lint
lint : $( foreach mod ,$ ( GO_MODULES ) ,lint /$ ( mod ) ) lint -container -test -deps ## Lint go modules and test deps
.PHONY : lint /%
lint/% :
@echo " --> Running golangci-lint ( $* ) "
@cd $* && GOWORK = off golangci-lint run --build-tags '$(GOTAGS)'
@echo " --> Running lint-consul-retry ( $* ) "
@cd $* && GOWORK = off lint-consul-retry
@echo " --> Running enumcover ( $* ) "
@cd $* && GOWORK = off enumcover ./...
2023-12-06 17:11:32 +00:00
.PHONY : lint -consul -retry
lint-consul-retry : $( foreach mod ,$ ( GO_MODULES ) ,lint -consul -retry /$ ( mod ) )
.PHONY : lint -consul -retry /%
lint-consul-retry/% : lint -tools
@echo " --> Running lint-consul-retry ( $* ) "
@cd $* && GOWORK = off lint-consul-retry
2023-07-17 19:27:24 +00:00
# check that the test-container module only imports allowlisted packages
# from the root consul module. Generally we don't want to allow these imports.
# In a few specific instances though it is okay to import test definitions and
# helpers from some of the packages in the root module.
.PHONY : lint -container -test -deps
lint-container-test-deps : ## Check that the test-container module only imports allowlisted packages from the root consul module.
@echo "--> Checking container tests for bad dependencies"
@cd test/integration/consul-container && \
$( CURDIR) /build-support/scripts/check-allowed-imports.sh \
github.com/hashicorp/consul \
2023-09-26 20:21:47 +00:00
"internal/resource/resourcetest"
2023-07-17 19:27:24 +00:00
##@ Testing
2018-06-26 16:08:33 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : cover
cover : cov ## Run tests and generate coverage report
.PHONY : cov
2020-02-12 16:15:24 +00:00
cov : other -consul dev -build
go test -tags '$(GOTAGS)' ./... -coverprofile= coverage.out
cd sdk && go test -tags '$(GOTAGS)' ./... -coverprofile= ../coverage.sdk.part
cd api && go test -tags '$(GOTAGS)' ./... -coverprofile= ../coverage.api.part
grep -h -v "mode: set" coverage.{ sdk,api} .part >> coverage.out
rm -f coverage.{ sdk,api} .part
2019-04-09 20:05:52 +00:00
go tool cover -html= coverage.out
2013-12-06 23:43:07 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : test
2020-03-24 20:14:12 +00:00
test : other -consul dev -build lint test -internal
2018-07-24 14:12:48 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : test -internal
test-internal : ## Test internal
2017-09-25 18:40:42 +00:00
@echo "--> Running go test"
@rm -f test.log exit-code
2018-02-20 15:32:44 +00:00
@# Dump verbose output to test.log so we can surface test names on failure but
@# hide it from travis as it exceeds their log limits and causes job to be
@# terminated ( over 4MB and over 10k lines in the UI) . We need to output
@# _something_ to stop them terminating us due to inactivity...
2020-02-12 16:15:24 +00:00
@echo "===================== submodule: sdk =====================" | tee -a test.log
cd sdk && { go test -v $( GOTEST_FLAGS) -tags '$(GOTAGS)' ./... 2>& 1 ; echo $$ ? >> ../exit-code ; } | tee -a ../test.log | egrep '^(ok|FAIL|panic:|--- FAIL|--- PASS)'
@echo "===================== submodule: api =====================" | tee -a test.log
cd api && { go test -v $( GOTEST_FLAGS) -tags '$(GOTAGS)' ./... 2>& 1 ; echo $$ ? >> ../exit-code ; } | tee -a ../test.log | egrep '^(ok|FAIL|panic:|--- FAIL|--- PASS)'
@echo "===================== submodule: root =====================" | tee -a test.log
{ go test -v $( GOTEST_FLAGS) -tags '$(GOTAGS)' ./... 2>& 1 ; echo $$ ? >> exit-code ; } | tee -a test.log | egrep '^(ok|FAIL|panic:|--- FAIL|--- PASS)'
@# if everything worked fine then all 3 zeroes will be collapsed to a single zero here
@exit_codes= " $$ (sort -u exit-code) " ; echo " $$ exit_codes " > exit-code
2018-07-24 14:12:48 +00:00
@echo " Exit code: $$ (cat exit-code) "
2018-04-19 12:01:20 +00:00
@# This prints all the race report between = = = = = = lines
@awk '/^WARNING: DATA RACE/ {do_print=1; print "=================="} do_print==1 {print} /^={10,}/ {do_print=0}' test.log || true
2018-04-20 13:24:24 +00:00
@grep -A10 'panic: ' test.log || true
2018-04-19 12:01:20 +00:00
@# Prints all the failure output until the next non-indented line - testify
2018-04-20 13:24:24 +00:00
@# helpers often output multiple lines for readability but useless if we can' t
@# see them. Un-intuitive order of matches is necessary. No || true because
@# awk always returns true even if there is no match and it breaks non-bash
@# shells locally.
@awk '/^[^[:space:]]/ {do_print=0} /--- SKIP/ {do_print=1} do_print==1 {print}' test.log
@awk '/^[^[:space:]]/ {do_print=0} /--- FAIL/ {do_print=1} do_print==1 {print}' test.log
2017-06-29 12:50:47 +00:00
@grep '^FAIL' test.log || true
2017-09-25 18:40:42 +00:00
@if [ " $$ (cat exit-code) " = = "0" ] ; then echo "PASS" ; exit 0 ; else exit 1 ; fi
2017-06-29 12:50:47 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : test -all
test-all : other -consul dev -build lint $( foreach mod ,$ ( GO_MODULES ) ,test -module /$ ( mod ) ) ## Test all
2023-06-05 20:08:39 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : test -module /%
2023-06-05 20:08:39 +00:00
test-module/% :
@echo " --> Running go test ( $* ) "
cd $* && go test $( GOTEST_FLAGS) -tags '$(GOTAGS)' ./...
2023-07-17 19:27:24 +00:00
.PHONY : test -race
test-race : ## Test race
2017-06-29 12:50:47 +00:00
$( MAKE) GOTEST_FLAGS = -race
2017-05-22 19:24:38 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : other -consul
other-consul : ## Checking for other consul instances
2017-09-25 18:40:42 +00:00
@echo "--> Checking for other consul instances"
@if ps -ef | grep 'consul agent' | grep -v grep ; then \
echo "Found other running consul agents. This may affect your tests." ; \
exit 1 ; \
fi
2023-06-05 20:08:39 +00:00
2023-07-17 19:27:24 +00:00
# Use GO_TEST_FLAGS to run specific tests:
# make test-envoy-integ GO_TEST_FLAGS="-run TestEnvoy/case-basic"
# NOTE: Always uses amd64 images, even when running on M1 macs, to match CI/CD environment.
2023-08-30 17:31:40 +00:00
# You can also specify the envoy version (example: 1.27.0) setting the environment variable: ENVOY_VERSION=1.27.0
2023-07-17 19:27:24 +00:00
.PHONY : test -envoy -integ
2023-11-07 18:41:14 +00:00
test-envoy-integ : $( ENVOY_INTEG_DEPS ) ## Run envoy integration tests.
2023-07-17 19:27:24 +00:00
@go test -v -timeout= 30m -tags integration $( GO_TEST_FLAGS) ./test/integration/connect/envoy
2023-06-05 20:08:39 +00:00
2023-07-17 19:27:24 +00:00
# NOTE: Use DOCKER_BUILDKIT=0, if docker build fails to resolve consul:local base image
.PHONY : test -compat -integ -setup
2023-11-07 18:41:14 +00:00
test-compat-integ-setup : test -deployer -setup
2023-07-17 19:27:24 +00:00
@# 'consul-envoy:target-version' is needed by compatibility integ test
@docker build -t consul-envoy:target-version --build-arg CONSUL_IMAGE = $( CONSUL_COMPAT_TEST_IMAGE) :local --build-arg ENVOY_VERSION = ${ ENVOY_VERSION } -f ./test/integration/consul-container/assets/Dockerfile-consul-envoy ./test/integration/consul-container/assets
2023-10-06 16:06:12 +00:00
@docker build -t consul-dataplane:local --build-arg CONSUL_IMAGE = $( CONSUL_COMPAT_TEST_IMAGE) :local --build-arg CONSUL_DATAPLANE_IMAGE = ${ CONSUL_DATAPLANE_IMAGE } -f ./test/integration/consul-container/assets/Dockerfile-consul-dataplane ./test/integration/consul-container/assets
2023-06-05 20:08:39 +00:00
2023-11-07 18:41:14 +00:00
# NOTE: Use DOCKER_BUILDKIT=0, if docker build fails to resolve consul:local base image
.PHONY : test -deployer -setup
test-deployer-setup : dev -docker
@docker tag consul-dev:latest $( CONSUL_COMPAT_TEST_IMAGE) :local
@docker run --rm -t $( CONSUL_COMPAT_TEST_IMAGE) :local consul version
.PHONY : test -deployer
test-deployer : test -deployer -setup ## Run deployer-based integration tests (skipping peering_commontopo).
@cd ./test-integ && \
NOLOGBUFFER = 1 \
TEST_LOG_LEVEL = debug \
DEPLOYER_CONSUL_DATAPLANE_IMAGE = $( DEPLOYER_CONSUL_DATAPLANE_IMAGE) \
gotestsum \
--raw-command \
--format= standard-verbose \
--debug \
-- \
go test \
-tags " $( GOTAGS) " \
-timeout= 20m \
-json \
$( shell sh -c " cd test-integ ; go list -tags \" $( GOTAGS) \" ./... | grep -v peering_commontopo " ) \
--target-image $( CONSUL_COMPAT_TEST_IMAGE) \
--target-version local \
--latest-image $( CONSUL_COMPAT_TEST_IMAGE) \
--latest-version latest
.PHONY : test -deployer -peering
test-deployer-peering : test -deployer -setup ## Run deployer-based integration tests (just peering_commontopo).
@cd ./test-integ/peering_commontopo && \
NOLOGBUFFER = 1 \
TEST_LOG_LEVEL = debug \
DEPLOYER_CONSUL_DATAPLANE_IMAGE = $( DEPLOYER_CONSUL_DATAPLANE_IMAGE) \
gotestsum \
--raw-command \
--format= standard-verbose \
--debug \
-- \
go test \
-tags " $( GOTAGS) " \
-timeout= 20m \
-json \
. \
--target-image $( CONSUL_COMPAT_TEST_IMAGE) \
--target-version local \
--latest-image $( CONSUL_COMPAT_TEST_IMAGE) \
--latest-version latest
2023-07-17 19:27:24 +00:00
.PHONY : test -compat -integ
2023-11-07 18:41:14 +00:00
test-compat-integ : test -compat -integ -setup ## Run consul-container based integration tests.
2023-07-17 19:27:24 +00:00
i f e q ( "$(GOTESTSUM_PATH)" , "" )
@cd ./test/integration/consul-container && \
go test \
-v \
-timeout= 30m \
./... \
--tags $( GOTAGS) \
--target-image $( CONSUL_COMPAT_TEST_IMAGE) \
--target-version local \
--latest-image $( CONSUL_COMPAT_TEST_IMAGE) \
--latest-version latest
e l s e
@cd ./test/integration/consul-container && \
gotestsum \
--format= short-verbose \
--debug \
--rerun-fails= 3 \
--packages= "./..." \
-- \
--tags $( GOTAGS) \
-timeout= 30m \
./... \
--target-image $( CONSUL_COMPAT_TEST_IMAGE) \
--target-version local \
--latest-image $( CONSUL_COMPAT_TEST_IMAGE) \
--latest-version latest
e n d i f
Makefile: add vet target
Add a vet target in order to catch suspicious constructs
reported by go vet.
Vet has successfully detected problems in the past,
for example, see
c9333b1b9b472feb5cad80e2c8276d41b64bde88
Some vet flags are noisy. In particular, the following flags
reports a large amount of generally unharmful constructs:
```
-assign: check for useless assignments
-composites: check that composite literals used field-keyed
elements
-shadow: check for shadowed variables
-shadowstrict: whether to be strict about shadowing
-unreachable: check for unreachable code
```
In order to skip running the flags mentioned above, vet is
invoked on a directory basis with `go tool vet .` since package-
level type-checking with `go vet` doesn't accept flags.
Hence, each file is vetted in isolation, which is weaker than
package-level type-checking. But nevertheless, it might catch
suspicious constructs that pose a real issue.
The vet target runs the following flags on the entire repo:
```
-asmdecl: check assembly against Go declarations
-atomic: check for common mistaken usages of the
sync/atomic package
-bool: check for mistakes involving boolean operators
-buildtags: check that +build tags are valid
-copylocks: check that locks are not passed by value
-methods: check that canonically named methods are canonically
defined
-nilfunc: check for comparisons between functions and nil
-printf: check printf-like invocations
-rangeloops: check that range loop variables are used correctly
-shift: check for useless shifts
-structtags: check that struct field tags have canonical format
and apply to exported fields as needed
-unsafeptr: check for misuse of unsafe.Pointer
```
Now and then, it might make sense to check the output of the
disabled flags manually.
For example, `VETARGS=-unreachable make vet` can detect several
lines of dead code that can be deleted, etc.
2015-01-17 06:44:10 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : test -metrics -integ
test-metrics-integ : test -compat -integ -setup ## Test metrics integ
@cd ./test/integration/consul-container && \
go test -v -timeout= 7m ./test/metrics \
--target-image $( CONSUL_COMPAT_TEST_IMAGE) \
--target-version local \
--latest-image $( CONSUL_COMPAT_TEST_IMAGE) \
--latest-version latest
2023-01-20 20:45:13 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : test -connect -ca -providers
test-connect-ca-providers : ## Running /agent/connect/ca tests in verbose mode
@echo "Running /agent/connect/ca tests in verbose mode"
@go test -v ./agent/connect/ca
@go test -v ./agent/consul -run Vault
@go test -v ./agent -run Vault
##@ UI
.PHONY : ui
ui : ui -docker ## Build the static web ui inside a Docker container. For local testing only; do not commit these assets.
2015-11-30 19:24:08 +00:00
2022-05-31 19:33:56 +00:00
.PHONY : ui -regen
2023-07-17 19:27:24 +00:00
ui-regen : ## Build the static web ui with yarn. This is the version to commit.
2022-05-31 19:33:56 +00:00
cd $( CURDIR) /ui && make && cd ..
rm -rf $( CURDIR) /agent/uiserver/dist
mv $( CURDIR) /ui/packages/consul-ui/dist $( CURDIR) /agent/uiserver/
2018-06-15 12:00:12 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : ui -build -image
ui-build-image : ## Building UI build container
@echo "Building UI build container"
@docker build $( NOCACHE) $( QUIET) -t $( UI_BUILD_TAG) - < build-support/docker/Build-UI.dockerfile
.PHONY : ui -docker
ui-docker : ui -build -image ## Builds ui within docker container and copy all the relevant artifacts out of the containers back to the source
@$( SHELL) $( CURDIR) /build-support/scripts/build-docker.sh ui
##@ Tools
.PHONY : tools
tools : ## Installs various supporting Go tools.
2022-05-23 15:50:45 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/devtools.sh
.PHONY : lint -tools
2023-07-17 19:27:24 +00:00
lint-tools : ## Install tools for linting
2022-05-23 15:50:45 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/devtools.sh -lint
2016-02-13 01:09:18 +00:00
2022-10-14 09:26:42 +00:00
.PHONY : codegen -tools
2023-07-17 19:27:24 +00:00
codegen-tools : ## Install tools for codegen
2022-10-14 09:26:42 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/devtools.sh -codegen
2023-09-11 17:50:52 +00:00
.PHONY : codegen
codegen : codegen -tools ## Deep copy
2022-10-14 09:26:42 +00:00
@$( SHELL) $( CURDIR) /agent/structs/deep-copy.sh
@$( SHELL) $( CURDIR) /agent/proxycfg/deep-copy.sh
2023-05-26 17:42:05 +00:00
@$( SHELL) $( CURDIR) /agent/consul/state/deep-copy.sh
2023-09-07 23:47:31 +00:00
@$( SHELL) $( CURDIR) /agent/config/deep-copy.sh
2023-09-11 17:50:52 +00:00
copywrite headers
2023-10-16 15:53:31 +00:00
# Special case for MPL headers in /api and /sdk
cd api && $( CURDIR) /build-support/scripts/copywrite-exceptions.sh
cd sdk && $( CURDIR) /build-support/scripts/copywrite-exceptions.sh
2022-10-14 09:26:42 +00:00
2023-07-17 19:27:24 +00:00
print-% : ; @echo $( $ *) ## utility to echo a makefile variable (i.e. 'make print-GOPATH')
.PHONY : module -versions
module-versions : ## Print a list of modules which can be updated. Columns are: module current_version date_of_current_version latest_version
@go list -m -u -f '{{if .Update}} {{printf "%-50v %-40s" .Path .Version}} {{with .Time}} {{ .Format "2006-01-02" -}} {{else}} {{printf "%9s" ""}} {{end}} {{ .Update.Version}} {{end}}' all
.PHONY : docs
docs : ## Point your web browser to http://localhost:3000/consul to live render docs from ./website/
make -C website
##@ Release
.PHONY : version
version : ## Current Consul version
2018-06-13 19:10:02 +00:00
@echo -n "Version: "
2018-06-15 01:25:59 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/version.sh
2018-06-13 19:10:02 +00:00
@echo -n "Version + release: "
2018-06-15 01:25:59 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/version.sh -r
2018-06-13 19:10:02 +00:00
@echo -n "Version + git: "
2018-06-15 01:25:59 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/version.sh -g
2018-06-13 19:10:02 +00:00
@echo -n "Version + release + git: "
2018-06-15 12:00:12 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/version.sh -r -g
2018-10-19 16:04:07 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : docker -images
2019-04-12 15:02:27 +00:00
docker-images : go -build -image ui -build -image
2018-06-08 14:20:54 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : go -build -image
go-build-image : ## Building Golang build container
2024-01-08 22:18:41 +00:00
@echo " Building Golang $( GOLANG_VERSION) build container "
@docker build $( NOCACHE) $( QUIET) -t $( GO_BUILD_TAG) --build-arg GOLANG_VERSION = $( GOLANG_VERSION) - < build-support/docker/Build-Go.dockerfile
2018-10-19 16:04:07 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : consul -docker
consul-docker : go -build -image ## Builds consul in a docker container and then dumps executable into ./pkg/bin/...
2018-06-15 01:25:59 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/build-docker.sh consul
2018-10-19 16:04:07 +00:00
2023-07-17 19:27:24 +00:00
.PHONY : docker -envoy -integ
docker-envoy-integ : ## Build image used to run integration tests locally.
2022-08-29 23:13:49 +00:00
$( MAKE) GOARCH = amd64 linux
docker build \
--platform linux/amd64 $( NOCACHE) $( QUIET) \
-t 'consul:local' \
--build-arg CONSUL_IMAGE_VERSION = $( CONSUL_IMAGE_VERSION) \
$( CURDIR) /pkg/bin/linux_amd64 \
-f $( CURDIR) /build-support/docker/Consul-Dev.dockerfile
2023-07-17 19:27:24 +00:00
##@ Proto
2019-12-17 21:22:32 +00:00
2022-03-31 18:49:42 +00:00
.PHONY : proto
2023-07-17 19:27:24 +00:00
proto : proto -tools proto -gen proto -mocks ## Protobuf setup command
.PHONY : proto -tools
proto-tools : ## Install tools for protobuf
@$( SHELL) $( CURDIR) /build-support/scripts/devtools.sh -protobuf
2022-09-30 04:17:30 +00:00
.PHONY : proto -gen
2023-07-17 19:27:24 +00:00
proto-gen : proto -tools ## Regenerates all Go files from protobuf definitions
2022-05-23 15:50:45 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/protobuf.sh
2022-09-30 04:17:30 +00:00
.PHONY : proto -mocks
2023-07-17 19:27:24 +00:00
proto-mocks : ## Proto mocks
2023-12-13 15:06:39 +00:00
@rm -rf grpcmocks/*
@mockery --config .grpcmocks.yaml
2022-09-30 04:17:30 +00:00
2022-05-23 14:37:52 +00:00
.PHONY : proto -format
2023-07-17 19:27:24 +00:00
proto-format : proto -tools ## Proto format
2022-05-23 14:37:52 +00:00
@buf format -w
2022-05-23 15:50:45 +00:00
2022-05-23 14:37:52 +00:00
.PHONY : proto -lint
2023-07-17 19:27:24 +00:00
proto-lint : proto -tools ## Proto lint
2023-02-17 21:14:46 +00:00
@buf lint
2022-07-13 16:03:27 +00:00
@for fn in $$ ( find proto -name '*.proto' ) ; do \
2023-02-17 21:14:46 +00:00
if [ [ " $$ fn " = "proto/private/pbsubscribe/subscribe.proto" ] ] ; then \
2022-07-13 16:03:27 +00:00
continue ; \
2023-02-17 21:14:46 +00:00
elif [ [ " $$ fn " = "proto/private/pbpartition/partition.proto" ] ] ; then \
2022-07-13 16:03:27 +00:00
continue ; \
fi ; \
pkg = $$ ( grep "^package " " $$ fn " | sed 's/^package \(.*\);/\1/' ) ; \
if [ [ " $$ pkg " != hashicorp.consul.internal.* ] ] ; then \
echo " ERROR: $$ fn: is missing 'hashicorp.consul.internal' package prefix: $$ pkg " >& 2; \
exit 1; \
fi \
done
2019-09-20 18:37:22 +00:00
2023-07-17 19:27:24 +00:00
##@ Envoy
2020-07-23 20:13:20 +00:00
2021-04-29 19:58:26 +00:00
.PHONY : envoy -library
2023-07-17 19:27:24 +00:00
envoy-library : ## Ensures that all of the protobuf packages present in the github.com/envoyproxy/go-control-plane library are referenced in the consul codebase
2021-04-29 19:58:26 +00:00
@$( SHELL) $( CURDIR) /build-support/scripts/envoy-library-references.sh
2018-10-19 16:04:07 +00:00
2021-04-30 16:27:12 +00:00
.PHONY : envoy -regen
2023-07-17 19:27:24 +00:00
envoy-regen : ## Regenerating envoy golden files
2021-04-30 16:27:12 +00:00
$( info regenerating envoy golden files)
@for d in endpoints listeners routes clusters rbac; do \
if [ [ -d " agent/xds/testdata/ $$ {d} " ] ] ; then \
find " agent/xds/testdata/ $$ {d} " -name '*.golden' -delete ; \
fi \
done
@go test -tags '$(GOTAGS)' ./agent/xds -update
@find "command/connect/envoy/testdata" -name '*.golden' -delete
@go test -tags '$(GOTAGS)' ./command/connect/envoy -update
2023-07-17 19:27:24 +00:00
##@ Help
# 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
2022-06-01 19:16:17 +00:00
.PHONY : help
2023-07-17 19:27:24 +00:00
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)