# Make does not offer a recursive wildcard function, so here's one: rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) SHELL := /bin/bash NAME := docker-credential-acr-env BUILD_TARGET = build MAIN_SRC_FILE=./main.go GO := GO111MODULE=on go GO_NOMOD :=GO111MODULE=off go REV := $(shell git rev-parse --short HEAD 2> /dev/null || echo 'unknown') ORG := chrismellard ORG_REPO := $(ORG)/$(NAME) RELEASE_ORG_REPO := $(ORG_REPO) ROOT_PACKAGE := github.com/$(ORG_REPO) GO_VERSION := $(shell $(GO) version | sed -e 's/^[^0-9.]*\([0-9.]*\).*/\1/') GO_DEPENDENCIES := $(call rwildcard,pkg/,*.go) $(call rwildcard,cmd/,*.go) BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2> /dev/null || echo 'unknown') BUILD_DATE := $(shell date +%Y%m%d-%H:%M:%S) CGO_ENABLED = 0 REPORTS_DIR=$(BUILD_TARGET)/reports GOTEST := $(GO) test # set dev version unless VERSION is explicitly set via environment VERSION ?= $(shell echo "$$(git for-each-ref refs/tags/ --count=1 --sort=-version:refname --format='%(refname:short)' 2>/dev/null)-dev+$(REV)" | sed 's/^v//') # Build flags for setting build-specific configuration at build time - defaults to empty #BUILD_TIME_CONFIG_FLAGS ?= "" # Full build flags used when building binaries. Not used for test compilation/execution. BUILDFLAGS := -ldflags \ " -X $(ROOT_PACKAGE)/pkg/cmd/version.Version=$(VERSION)\ -X github.com/chrismellard/docker-credential-acr-env/pkg/cmd/version.Version=$(VERSION)\ -X $(ROOT_PACKAGE)/pkg/cmd/version.Revision='$(REV)'\ -X $(ROOT_PACKAGE)/pkg/cmd/version.Branch='$(BRANCH)'\ -X $(ROOT_PACKAGE)/pkg/cmd/version.BuildDate='$(BUILD_DATE)'\ -X $(ROOT_PACKAGE)/pkg/cmd/version.GoVersion='$(GO_VERSION)'\ $(BUILD_TIME_CONFIG_FLAGS)" # Some tests expect default values for version.*, so just use the config package values there. TEST_BUILDFLAGS := -ldflags "$(BUILD_TIME_CONFIG_FLAGS)" ifdef DEBUG BUILDFLAGS := -gcflags "all=-N -l" $(BUILDFLAGS) endif ifdef PARALLEL_BUILDS BUILDFLAGS += -p $(PARALLEL_BUILDS) GOTEST += -p $(PARALLEL_BUILDS) else # -p 4 seems to work well for people GOTEST += -p 4 endif ifdef DISABLE_TEST_CACHING GOTEST += -count=1 endif TEST_PACKAGE ?= ./... COVER_OUT:=$(REPORTS_DIR)/cover.out COVERFLAGS=-coverprofile=$(COVER_OUT) --covermode=count --coverpkg=./... .PHONY: list list: ## List all make targets @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | sort .PHONY: help .DEFAULT_GOAL := help help: @grep -h -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' full: check ## Build and run the tests check: build test ## Build and run the tests get-test-deps: ## Install test dependencies $(GO_NOMOD) get github.com/axw/gocov/gocov $(GO_NOMOD) get -u gopkg.in/matm/v1/gocov-html print-version: ## Print version @echo $(VERSION) build: $(GO_DEPENDENCIES) clean ## Build binary for current OS go mod download CGO_ENABLED=$(CGO_ENABLED) GOARCH=$(GOARCH) GOOS=$(GOOS) $(GO) $(BUILD_TARGET) $(BUILDFLAGS) -o build/$(NAME) $(MAIN_SRC_FILE) build-all: $(GO_DEPENDENCIES) build make-reports-dir ## Build all files - runtime, all tests etc. CGO_ENABLED=$(CGO_ENABLED) GOARCH=$(GOARCH) GOOS=$(GOOS) $(GOTEST) -run=nope -tags=integration -failfast -short ./... $(BUILDFLAGS) tidy-deps: ## Cleans up dependencies $(GO) mod tidy # mod tidy only takes compile dependencies into account, let's make sure we capture tooling dependencies as well @$(MAKE) install-generate-deps .PHONY: make-reports-dir make-reports-dir: mkdir -p $(REPORTS_DIR) test: ## Run tests with the "unit" build tag CGO_ENABLED=$(CGO_ENABLED) $(GOTEST) --tags=unit -failfast -short ./... $(TEST_BUILDFLAGS) test-coverage : make-reports-dir ## Run tests and coverage for all tests with the "unit" build tag CGO_ENABLED=$(CGO_ENABLED) $(GOTEST) --tags=unit $(COVERFLAGS) -failfast -short ./... $(TEST_BUILDFLAGS) test-report: make-reports-dir get-test-deps test-coverage ## Create the test report @gocov convert $(COVER_OUT) | gocov report test-report-html: make-reports-dir get-test-deps test-coverage ## Create the test report in HTML format @gocov convert $(COVER_OUT) | gocov-html > $(REPORTS_DIR)/cover.html && open $(REPORTS_DIR)/cover.html install: $(GO_DEPENDENCIES) ## Install the binary GOBIN=${GOPATH}/bin $(GO) install $(BUILDFLAGS) $(MAIN_SRC_FILE) linux: ## Build for Linux CGO_ENABLED=$(CGO_ENABLED) GOOS=linux GOARCH=amd64 $(GO) $(BUILD_TARGET) $(BUILDFLAGS) -o build/linux/$(NAME) $(MAIN_SRC_FILE) chmod +x build/linux/$(NAME) arm: ## Build for ARM CGO_ENABLED=$(CGO_ENABLED) GOOS=linux GOARCH=arm $(GO) $(BUILD_TARGET) $(BUILDFLAGS) -o build/arm/$(NAME) $(MAIN_SRC_FILE) chmod +x build/arm/$(NAME) win: ## Build for Windows CGO_ENABLED=$(CGO_ENABLED) GOOS=windows GOARCH=amd64 $(GO) $(BUILD_TARGET) $(BUILDFLAGS) -o build/win/$(NAME)-windows-amd64.exe $(MAIN_SRC_FILE) darwin: ## Build for OSX CGO_ENABLED=$(CGO_ENABLED) GOOS=darwin GOARCH=amd64 $(GO) $(BUILD_TARGET) $(BUILDFLAGS) -o build/darwin/$(NAME) $(MAIN_SRC_FILE) chmod +x build/darwin/$(NAME) .PHONY: release release: clean linux test release-all: release linux win darwin promoter: cd promote && go build main.go .PHONY: goreleaser goreleaser: step-go-releaser --organisation=$(ORG) --revision=$(REV) --branch=$(BRANCH) --build-date=$(BUILD_DATE) --go-version=$(GO_VERSION) --root-package=$(ROOT_PACKAGE) --version=$(VERSION) --timeout 200m .PHONY: clean clean: ## Clean the generated artifacts rm -rf build release dist get-fmt-deps: ## Install test dependencies $(GO_NOMOD) get golang.org/x/tools/cmd/goimports .PHONY: fmt fmt: importfmt ## Format the code $(eval FORMATTED = $(shell $(GO) fmt ./...)) @if [ "$(FORMATTED)" == "" ]; \ then \ echo "All Go files properly formatted"; \ else \ echo "Fixed formatting for: $(FORMATTED)"; \ fi .PHONY: importfmt importfmt: get-fmt-deps @echo "Formatting the imports..." goimports -w $(GO_DEPENDENCIES) .PHONY: lint lint: ## Lint the code ./hack/gofmt.sh ./hack/linter.sh ./hack/generate.sh .PHONY: all all: fmt build test lint generate-refdocs install-refdocs: $(GO) get github.com/jenkins-x/gen-crd-api-reference-docs generate-refdocs: install-refdocs gen-crd-api-reference-docs -config "hack/configdocs/config.json" \ -template-dir hack/configdocs/templates \ -api-dir "./pkg/apis/gitops/v1alpha1" \ -out-file docs/config.md bin/docs: go build $(LDFLAGS) -v -o bin/docs cmd/docs/*.go .PHONY: docs docs: bin/docs generate-refdocs ## update docs @echo "Generating docs" @./bin/docs --target=./docs/cmd @./bin/docs --target=./docs/man/man1 --kind=man @rm -f ./bin/docs