-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
129 lines (107 loc) · 4.43 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
.DELETE_ON_ERROR: clean
EXECUTABLES = go
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH)))
#
APP_NAME ?= mq-to-db
APP_DEPENDENCIES := $(shell go list -m -f '{{if not (or .Indirect .Main)}}{{.Path}}{{end}}' all)
GIT_VERSION ?= $(shell git rev-parse --abbrev-ref HEAD)
GIT_REVISION ?= $(shell git rev-parse HEAD | tr -d '\040\011\012\015\n')
GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD | tr -d '\040\011\012\015\n')
GIT_USER ?= $(shell git config --get user.name | tr -d '\040\011\012\015\n')
BUILD_DATE ?= $(shell date +'%Y-%m-%dT%H:%M:%S')
BUILD_DIR := ./build
DIST_DIR := ./dist
# Golang
GO_LDFLAGS ?= -ldflags "-X github.com/christiangda/mq-to-db/internal/version.Version=$(GIT_VERSION) -X github.com/christiangda/mq-to-db/internal/version.Revision=$(GIT_REVISION) -X github.com/christiangda/mq-to-db/internal/version.Branch=$(GIT_BRANCH) -X github.com/christiangda/mq-to-db/internal/version.BuildUser=\"$(GIT_USER)\" -X github.com/christiangda/mq-to-db/internal/version.BuildDate=$(BUILD_DATE)"
GO_HOST_OS ?= $(shell $(GO) env GOHOSTOS)
GO_HOST_ARCH ?= $(shell $(GO) env GOHOSTARCH)
GO_OS ?= darwin linux windows
GO_ARCH ?= arm arm64 amd64
GO_OPTS ?= -v
GO_CGO_ENABLED ?= 0
GO_FILES := $(shell go list ./... | grep -v /mocks/)
# Container
CONTAINER_OS ?= linux
#CONTAINER_ARCH ?= arm64v8 amd64
CONTAINER_ARCH ?= amd64
CONTAINER_REPO ?= christiangda
CONTAINER_BUILD_COMMAND ?= docker build
CONTAINER_PUBLISH_COMMAND ?= docker push
CONTAINER_TAG_COMMAND ?= docker tag
CONTAINER_BUILD_FILE ?= ./Dockerfile
CONTAINER_BUILD_CONTEXT ?= ./
CONTAINER_IMAGE_ARCH ?= amd64
CONTAINER_IMAGE_OS ?= linux
CONTAINER_IMAGE_NAME ?= $(APP_NAME)
CONTAINER_IMAGE_REPO ?= christiangda
CONTAINER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD))
# Enable -race only on linux and no container
ifneq (,$(wildcard /.dockerenv))
ifeq ($(GO_HOST_ARCH),amd64)
ifeq ($(GO_HOST_OS),$(filter $(GO_HOST_OS),linux))
GO_OPTS := $(GO_OPTS) -race
GO_CGO_ENABLED := 1
endif
endif
endif
# compile all when cgo is disabled (slow)
ifeq ($(GO_CGO_ENABLED),0)
GO_OPTS := $(GO_OPTS) -a
endif
#
all: clean test build
mod-update: tidy
$(foreach dep, $(APP_DEPENDENCIES), $(shell go get -u $(dep)))
go mod tidy
tidy:
go mod tidy
fmt:
@go fmt $(GO_FILES)
vet:
go vet $(GO_FILES)
generate:
go generate $(GO_FILES)
test: generate tidy fmt vet
go test -race -covermode=atomic -coverprofile coverage.out -tags=unit $(GO_FILES)
test-coverage: test
go tool cover -html=coverage.out
build:
$(foreach proj_name, $(APP_NAME), \
$(shell CGO_ENABLED=$(GO_CGO_ENABLED) go build $(GO_LDFLAGS) $(GO_OPTS) -o ./$(BUILD_DIR)/$(proj_name) ./cmd/$(proj_name)/ ))
install:
GOOS=$(GO_HOST_OS) GOARCH=$(GO_HOST_ARCH) go install $(GO_LDFLAGS)
build-dist: build
$(foreach GOOS, $(GO_OS), \
$(foreach GOARCH, $(GO_ARCH), \
$(foreach proj_name, $(APP_NAME), \
$(shell GOOS=$(GOOS) GOARCH=$(GOARCH) CGO_ENABLED=$(GO_CGO_ENABLED) go build $(GO_LDFLAGS) $(GO_OPTS) -o ./$(DIST_DIR)/$(proj_name)-$(GOOS)-$(GOARCH) ./cmd/$(proj_name)/ ))))
clean:
go clean -n -x -i
rm -rf $(BUILD_DIR) $(DIST_DIR) ./*.out
container-build: build-dist
$(foreach OS, $(CONTAINER_OS), \
$(foreach ARCH, $(CONTAINER_ARCH), \
$(if $(findstring $(ARCH), arm64v8), $(eval BIN_ARCH = arm64),$(eval BIN_ARCH = $(ARCH)) ) \
docker build \
--build-arg ARCH=$(ARCH) \
--build-arg BIN_ARCH=$(BIN_ARCH) \
--build-arg OS=$(OS) \
-t $(CONTAINER_REPO)/$(CONTAINER_IMAGE_NAME)-$(OS)-$(ARCH):latest \
-t $(CONTAINER_REPO)/$(CONTAINER_IMAGE_NAME)-$(OS)-$(ARCH):$(GIT_VERSION) \
./.; \
))
container-publish-docker: container-build
$(foreach OS, $(CONTAINER_OS), \
$(foreach ARCH, $(CONTAINER_ARCH), \
$(if $(findstring $(ARCH), arm64v8), $(eval BIN_ARCH = arm64),$(eval BIN_ARCH = $(ARCH)) ) \
docker push "$(CONTAINER_REPO)/$(CONTAINER_IMAGE_NAME)-$(OS)-$(ARCH):latest"; \
docker push "$(CONTAINER_REPO)/$(CONTAINER_IMAGE_NAME)-$(OS)-$(ARCH):$(GIT_VERSION)"; \
))
container-publish-github: container-build
$(foreach OS, $(CONTAINER_OS), \
$(foreach ARCH, $(CONTAINER_ARCH), \
$(if $(findstring $(ARCH), arm64v8), $(eval BIN_ARCH = arm64),$(eval BIN_ARCH = $(ARCH))) \
docker push "ghcr.io/$(CONTAINER_REPO)/$(CONTAINER_IMAGE_NAME)-$(OS)-$(ARCH):latest"; \
docker push "ghcr.io/$(CONTAINER_REPO)/$(CONTAINER_IMAGE_NAME)-$(OS)-$(ARCH):$(GIT_VERSION)"; \
))