Makefile 4.21 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Yerken's avatar
Yerken committed
15
16
# cover-html creates coverage report for whole project excluding vendor and opens result in the default browser
.PHONY: cover cover-html
17
.DEFAULT_GOAL := build
Yerken's avatar
Yerken committed
18
19
20
21
22

cover:
	go get github.com/wadey/gocovmerge
	$(eval PKGS := $(shell go list ./... | grep -v /vendor/))
	$(eval PKGS_DELIM := $(shell echo $(PKGS) | sed -e 's/ /,/g'))
23
	go list -f '{{if or (len .TestGoFiles) (len .XTestGoFiles)}}go test -test.v -test.timeout=120s -covermode=count -coverprofile={{.Name}}_{{len .Imports}}_{{len .Deps}}.coverprofile -coverpkg $(PKGS_DELIM) {{.ImportPath}}{{end}}' $(PKGS) | xargs -0 sh -c
Yerken's avatar
Yerken committed
24
25
26
27
28
29
	gocovmerge `ls *.coverprofile` > cover.out
	rm *.coverprofile

cover-html: cover
	go tool cover -html cover.out

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.PHONY: go-lint

# Run the golangci-lint tool
go-lint:
	golangci-lint run --timeout=15m ./...

.PHONY: licensecheck

# Run the licensecheck script to check for license headers
licensecheck:
	@echo ">> checking license header"
	@licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \
               awk 'NR<=5' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \
       done); \
       if [ -n "$${licRes}" ]; then \
               echo "license header checking failed:"; echo "$${licRes}"; \
               exit 1; \
       fi

njuettner's avatar
njuettner committed
49
50
51
.PHONY: lint

# Run all the linters
52
lint: licensecheck go-lint
njuettner's avatar
njuettner committed
53

Yerken's avatar
Yerken committed
54

55
# The verify target runs tasks similar to the CI tasks, but without code coverage
ideahitme's avatar
ideahitme committed
56
.PHONY: verify test
Yerken's avatar
Yerken committed
57

ideahitme's avatar
ideahitme committed
58
test:
59
	go test -race -coverprofile=profile.cov ./...
ideahitme's avatar
ideahitme committed
60

61
# The build targets allow to build the binary and docker image
62
.PHONY: build build.docker build.mini
63

64
65
BINARY        ?= external-dns
SOURCES        = $(shell find . -name '*.go')
njuettner's avatar
njuettner committed
66
67
IMAGE_STAGING  = gcr.io/k8s-staging-external-dns/$(BINARY)
IMAGE         ?= us.gcr.io/k8s-artifacts-prod/external-dns/$(BINARY)
68
69
VERSION       ?= $(shell git describe --tags --always --dirty)
BUILD_FLAGS   ?= -v
70
LDFLAGS       ?= -X sigs.k8s.io/external-dns/pkg/apis/externaldns.Version=$(VERSION) -w -s
71
72
73
ARCHS         = arm64v8 amd64
SHELL         = /bin/bash

74
75
76
77

build: build/$(BINARY)

build/$(BINARY): $(SOURCES)
78
	CGO_ENABLED=0 go build -o build/$(BINARY) $(BUILD_FLAGS) -ldflags "$(LDFLAGS)" .
79

80
81
82
83
build.push/multiarch:
	arch_specific_tags=()
	for arch in $(ARCHS); do \
		image="$(IMAGE):$(VERSION)-$${arch}" ;\
84
85
		# pre-pull due to https://github.com/kubernetes-sigs/cluster-addons/pull/84/files ;\
		docker pull $${arch}/alpine:3.12 ;\
86
87
88
89
90
91
92
93
94
95
		DOCKER_BUILDKIT=1 docker build --rm --tag $${image} --build-arg VERSION="$(VERSION)" --build-arg ARCH="$${arch}" . ;\
		docker push $${image} ;\
		arch_specific_tags+=( "--amend $${image}" ) ;\
	done ;\
	DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create "$(IMAGE):$(VERSION)" $${arch_specific_tags[@]} ;\
	for arch in $(ARCHS); do \
		DOCKER_CLI_EXPERIMENTAL=enabled docker manifest annotate --arch $${arch} "$(IMAGE):$(VERSION)" "$(IMAGE):$(VERSION)-$${arch}" ;\
	done;\
	DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(IMAGE):$(VERSION)" \

96
97
98
build.push: build.docker
	docker push "$(IMAGE):$(VERSION)"

99
100
101
102
103
104
build.arm64v8:
	CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o build/$(BINARY) $(BUILD_FLAGS) -ldflags "$(LDFLAGS)" .

build.amd64:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o build/$(BINARY) $(BUILD_FLAGS) -ldflags "$(LDFLAGS)" .

105
build.docker:
106
	docker build --rm --tag "$(IMAGE):$(VERSION)" --build-arg VERSION="$(VERSION)" --build-arg ARCH="amd64" .
107

108
build.mini:
109
	docker build --rm --tag "$(IMAGE):$(VERSION)-mini" --build-arg VERSION="$(VERSION)" -f Dockerfile.mini .
110

111
112
clean:
	@rm -rf build
njuettner's avatar
njuettner committed
113
114
115
116
117

 # Builds and push container images to the staging bucket.
.PHONY: release.staging

release.staging:
118
	IMAGE=$(IMAGE_STAGING) $(MAKE) build.push/multiarch
njuettner's avatar
njuettner committed
119
120

release.prod:
121
	$(MAKE) build.push/multiarch