SHELL=/bin/bash DEFAULT_VERSION=$(shell awk '/const defaultVersion/{print $$NF}' main.go | tr -d '"') TARGET_ARCH_386=x86 TARGET_ARCH_amd64=x86_64 TARGET_ARCH_arm64=arm64 PLATFORMS ?= darwin/amd64 linux/386 linux/amd64 linux/arm64 windows/386 windows/amd64 ifeq ($(SNAPSHOT),true) VERSION=${DEFAULT_VERSION}-SNAPSHOT else VERSION=${DEFAULT_VERSION} endif PLATFORM_TARGETS=$(addprefix release-, $(PLATFORMS)) LDFLAGS=-w -s -X main.Version=${VERSION} CMD_COLOR_ON=\033[32m\xE2\x9c\x93 CMD_COLOR_OFF=\033[0m .PHONY: help help: ## - Show help message @printf "${CMD_COLOR_ON} usage: make [target]\n\n${CMD_COLOR_OFF}" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | sed -e "s/^Makefile://" | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' .PHONY: local local: ## - Build local binary for local environment (bin/fleet-server) @printf "${CMD_COLOR_ON} Build binaries using local go installation\n${CMD_COLOR_OFF}" go build -ldflags="${LDFLAGS}" -o ./bin/fleet-server . @printf "${CMD_COLOR_ON} Binaries in ./bin/\n${CMD_COLOR_OFF}" .PHONY: clean clean: ## - Clean up build artifacts @printf "${CMD_COLOR_ON} Clean up build artifacts\n${CMD_COLOR_OFF}" rm -rf ./bin/ ./build/ .PHONY: generate generate: ## - Generate schema models @printf "${CMD_COLOR_ON} Installing module for go generate\n${CMD_COLOR_OFF}" go install github.com/aleksmaus/generate/... @printf "${CMD_COLOR_ON} Running go generate\n${CMD_COLOR_OFF}" go generate ./... .PHONY: check check: ## - Run all checks @$(MAKE) generate @$(MAKE) check-headers @$(MAKE) check-go @$(MAKE) notice @$(MAKE) check-no-changes .PHONY: check-headers check-headers: ## - Check copyright headers @go install github.com/elastic/go-licenser @go-licenser -license Elastic .PHONY: check-go check-go: ## - Run go fmt, go vet, go mod tidy @go fmt ./... @go vet ./... @go mod tidy .PHONY: notice notice: ## - Generates the NOTICE.txt file. @echo "Generating NOTICE.txt" @go mod tidy @go mod download go list -m -json all | go run go.elastic.co/go-licence-detector \ -includeIndirect \ -rules dev-tools/notice/rules.json \ -overrides dev-tools/notice/overrides.json \ -noticeTemplate dev-tools/notice/NOTICE.txt.tmpl \ -noticeOut NOTICE.txt \ -depsOut "" .PHONY: check-no-changes check-no-changes: @git diff | cat @git update-index --refresh @git diff-index --exit-code HEAD -- .PHONY: test test: prepare-test-context ## - Run all tests @$(MAKE) test-unit @$(MAKE) test-int @$(MAKE) junit-report .PHONY: test-unit test-unit: prepare-test-context ## - Run unit tests only set -o pipefail; go test -v -race ./... | tee build/test-unit.out .PHONY: prepare-test-context prepare-test-context: ## - Prepare the test context folders @mkdir -p build .PHONY: junit-report junit-report: ## - Run the junit-report generation for all the out files generated @go get -v -u github.com/jstemmer/go-junit-report $(foreach file, $(wildcard build/*.out), go-junit-report > "${file}.xml" < ${file};) ################################################## # Release building targets ################################################## build/distributions: @mkdir -p build/distributions .PHONY: $(PLATFORM_TARGETS) $(PLATFORM_TARGETS): release-%: $(eval $@_OS := $(firstword $(subst /, ,$(lastword $(subst release-, ,$@))))) $(eval $@_GO_ARCH := $(lastword $(subst /, ,$(lastword $(subst release-, ,$@))))) $(eval $@_ARCH := $(TARGET_ARCH_$($@_GO_ARCH))) GOOS=$($@_OS) GOARCH=$($@_GO_ARCH) go build -ldflags="${LDFLAGS}" -o build/binaries/fleet-server-$(VERSION)-$($@_OS)-$($@_ARCH)/fleet-server . @$(MAKE) OS=$($@_OS) ARCH=$($@_ARCH) package-target .PHONY: package-target package-target: build/distributions ifeq ($(OS),windows) @cd build/binaries && zip -q -r ../distributions/fleet-server-$(VERSION)-$(OS)-$(ARCH).zip fleet-server-$(VERSION)-$(OS)-$(ARCH) @cd build/distributions && shasum -a 512 fleet-server-$(VERSION)-$(OS)-$(ARCH).zip > fleet-server-$(VERSION)-$(OS)-$(ARCH).zip.sha512 else @tar -C build/binaries -zcf build/distributions/fleet-server-$(VERSION)-$(OS)-$(ARCH).tar.gz fleet-server-$(VERSION)-$(OS)-$(ARCH) @cd build/distributions && shasum -a 512 fleet-server-$(VERSION)-$(OS)-$(ARCH).tar.gz > fleet-server-$(VERSION)-$(OS)-$(ARCH).tar.gz.sha512 endif .PHONY: release release: $(PLATFORM_TARGETS) ## - Builds a release. Specify exact platform with PLATFORMS env. .PHONY: release-manager-snapshot release-manager-snapshot: ## - Builds a snapshot release. The Go version defined in .go-version will be installed and used for the build. @$(MAKE) SNAPSHOT=true release-manager-release .PHONY: release-manager-release release-manager-release: ## - Builds a snapshot release. The Go version defined in .go-version will be installed and used for the build. ./dev-tools/run_with_go_ver $(MAKE) release ################################################## # Integration testing targets ################################################## # Load environment (ES version and creds) include ./dev-tools/integration/.env export $(shell sed 's/=.*//' ./dev-tools/integration/.env) # Start ES with docker without waiting .PHONY: int-docker-start-async int-docker-start-async: @docker-compose -f ./dev-tools/integration/docker-compose.yml --env-file ./dev-tools/integration/.env up -d --remove-orphans elasticsearch # Wait for ES to be ready .PHONY: int-docker-wait int-docker-wait: @./dev-tools/integration/wait-for-elasticsearch.sh ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD}@${TEST_ELASTICSEARCH_HOSTS} # Start integration docker setup with wait for when the ES is ready .PHONY: int-docker-start int-docker-start: ## - Start docker envronment for integration tests and wait until it's ready @$(MAKE) int-docker-start-async @$(MAKE) int-docker-wait # Stop integration docker setup .PHONY: int-docker-stop int-docker-stop: ## - Stop docker environment for integration tests @docker-compose -f ./dev-tools/integration/docker-compose.yml --env-file ./dev-tools/integration/.env down # Run integration tests with starting/stopping docker .PHONY: test-int test-int: prepare-test-context ## - Run integration tests with full setup (slow!) @$(MAKE) int-docker-start @set -o pipefail; $(MAKE) test-int-set | tee build/test-init.out @$(MAKE) int-docker-stop # Run integration tests without starting/stopping docker # Useful for development where you: # 1. Start integration environment # 2. Develop/test/repeat # 3 Stop integration environment when done .PHONY: test-int-set test-int-set: ## - Run integration tests without setup # Initialize indices one before running all the tests ELASTICSEARCH_HOSTS=${TEST_ELASTICSEARCH_HOSTS} go run ./dev-tools/integration/main.go ELASTICSEARCH_HOSTS=${TEST_ELASTICSEARCH_HOSTS} go test -v -tags=integration -count=1 -race ./...