190 lines
6.7 KiB
Makefile
190 lines
6.7 KiB
Makefile
# 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
|