-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile.main
190 lines (161 loc) · 5.05 KB
/
Makefile.main
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
SHELL := /bin/bash
# Package configuration
PROJECT ?=
COMMANDS ?=
# Checking mandatory variables
ifndef PROJECT
$(error ERROR! The PROJECT variable cannot be empty)
endif
# Environment
BUILD_PATH := build
BIN_PATH := $(BUILD_PATH)/bin
BRANCH ?= $(or $(TRAVIS_BRANCH),$(subst refs/heads/,,$(GITHUB_REF)))
BRANCH := $(or $(BRANCH),$(shell git rev-parse --abbrev-ref HEAD))
CI_PATH ?= .ci
# GCP credentials
GOOGLE_CREDENTIALS ?=
GOOGLE_PROJECT ?=
# LD_FLAGS to be use at `go build` calls.
LD_FLAGS ?= -X main.version=$(VERSION) -X main.build=$(BUILD) -X main.commit=$(COMMIT)
# Tags to be used as `-tags` argument at `go build` and `go install`
GO_TAGS ?=
# Arguments to be used in `go` commands.
GO_GET_ARGS ?= -v -t
GO_TEST_ARGS ?= -v
GO_BUILD_ARGS ?= -ldflags "$(LD_FLAGS)"
GOPROXY ?= https://proxy.golang.org
# Environment variable to use at `go build` calls.
GO_BUILD_ENV ?=
# Go parameters
ifneq ($(GO_TAGS), )
GO_GET_ARGS += -tags "$(GO_TAGS)"
GO_TEST_ARGS += -tags "$(GO_TAGS)"
GO_BUILD_ARGS += -tags "$(GO_TAGS)"
endif
GOCMD = go
GOGET = GOPROXY=$(GOPROXY) $(GOCMD) get $(GO_GET_ARGS)
GOBUILD = GOPROXY=$(GOPROXY) $(GOCMD) build $(GO_BUILD_ARGS)
GOTEST = GOPROXY=$(GOPROXY) $(GOCMD) test $(GO_TEST_ARGS)
GOTEST_RACE = $(GOTEST) -race
GOCLEAN = $(GOCMD) clean
# Packages content
PKG_OS ?= darwin linux
PKG_ARCH = amd64
# Coverage
COVERAGE_REPORT = coverage.txt
COVERAGE_PROFILE = profile.out
COVERAGE_MODE = atomic
PACKAGES = $(shell go list ./... | grep -v '/vendor/')
# Docker OS/Arch used to match the right binaries.
# If docker is not installed, fallback to GOOS/GOARCH.
ifneq ($(shell which docker),)
DOCKER_OS ?= $(shell docker version -f "{{.Server.Os}}")
DOCKER_ARCH ?= $(shell docker version -f "{{.Server.Arch}}")
else
DOCKER_OS ?= $(shell go env GOOS)
DOCKER_ARCH ?= $(shell go env GOARCH)
endif
DOCKER_EXTRA_BUILD_FLAGS ?=
# gcloud
CLOUDSDK_INSTALL_DIR ?= ${HOME}
PATH := ${CLOUDSDK_INSTALL_DIR}/google-cloud-sdk/bin:$(PATH)
gcloud-ensure:
gcloud version || $(MAKE) gcloud-install
gcloud-install:
rm -rf ${CLOUDSDK_INSTALL_DIR}/google-cloud-sdk
curl https://sdk.cloud.google.com | CLOUDSDK_CORE_DISABLE_PROMPTS=1 bash
gcloud version
gcloud-login:
echo "$(GOOGLE_CREDENTIALS)" | base64 --decode > google-credentials.json
gcloud -q auth activate-service-account --key-file google-credentials.json
gcloud config set project "$(GOOGLE_PROJECT)"
docker-build:
docker build -t "${IMAGE}" $(DOCKER_EXTRA_BUILD_FLAGS) .
docker-push:
gcloud auth configure-docker -q
gcloud auth configure-docker -q us-east1-docker.pkg.dev
docker push "${IMAGE}"
pubsub-publish:
gcloud pubsub topics publish jenkins \
--message "{ \"token\": \"main\", \"data\": { \"branch\": \"${BRANCH}\", \"service\": \"$(SERVICE_NAME)\", \"image\": \"${IMAGE}\", \"config_b64\":\"\" } }"
deploy: docker-build gcloud-login docker-push pubsub-publish
packages: build
@cd $(BUILD_PATH); \
for os in $(PKG_OS); do \
for arch in $(PKG_ARCH); do \
TAR_VERSION=`echo $(VERSION) | tr "/" "-"`; \
tar -cvzf $(PROJECT)_$${TAR_VERSION}_$${os}_$${arch}.tar.gz $(PROJECT)_$${os}_$${arch}/; \
done; \
done
build: $(COMMANDS)
$(COMMANDS):
@if [ "$@" == "." ]; then \
BIN=`basename $(CURDIR)` ; \
else \
BIN=`basename $@` ; \
fi && \
for os in $(PKG_OS); do \
NBIN="$${BIN}" ; \
if [ "$${os}" == windows ]; then \
NBIN="$${NBIN}.exe"; \
fi && \
for arch in $(PKG_ARCH); do \
mkdir -p $(BUILD_PATH)/$(PROJECT)_$${os}_$${arch} && \
$(GO_BUILD_ENV) GOOS=$${os} GOARCH=$${arch} \
$(GOBUILD) -o "$(BUILD_PATH)/$(PROJECT)_$${os}_$${arch}/$${NBIN}" ./$@ && \
if [ "$(DOCKER_OS)" == "$${os}" ] && [ "$(DOCKER_ARCH)" == "$${arch}" ]; then \
echo "Linking matching OS/Arch binaries to "build/bin" folder" && \
mkdir -p $(BIN_PATH) && \
cp -rf $(BUILD_PATH)/$(PROJECT)_$${os}_$${arch}/$${NBIN} $(BIN_PATH); \
fi; \
done; \
done
test:
$(GOTEST) $(PACKAGES)
test-race:
if [ -z "$(TEST_RACE)" ]; then \
echo -e "\033[0;31mWARNING! Testing with race detection is disabled, please consider toggling it on setting TEST_RACE ?= true"; \
else \
$(GOTEST_RACE) $(PACKAGES); \
fi; \
test-coverage:
echo "" > $(COVERAGE_REPORT); \
for dir in $(PACKAGES); do \
$(GOTEST) $$dir -coverprofile=$(COVERAGE_PROFILE) -covermode=$(COVERAGE_MODE); \
if [ $$? != 0 ]; then \
exit 2; \
fi; \
if [ -f $(COVERAGE_PROFILE) ]; then \
cat $(COVERAGE_PROFILE) >> $(COVERAGE_REPORT); \
rm $(COVERAGE_PROFILE); \
fi; \
done || exit 1; \
codecov:
@if [ ! -f $(COVERAGE_REPORT) ]; then \
echo "Unable to find '$(COVERAGE_REPORT)', execute 'make test-coverage' first."; \
exit 1; \
fi; \
wget -q -O - https://codecov.io/bash | bash
clean:
rm -rf $(BUILD_PATH) $(BIN_PATH)
$(GOCLEAN) .
ifeq ($($strip $(COMMANDS)),)
ci-script: | test-coverage codecov test-race
@echo
else
ci-script: | test-coverage codecov test-race packages
@echo
endif
.PHONY: build $(COMMANDS) \
ci-script \
clean \
codecov \
deploy \
docker-build \
docker-push \
gcloud-ensure \
gcloud-install \
gcloud-login \
packages \
pubsub-publish \
test test-race test-coverage