|
1 | 1 | GO ?= go |
2 | 2 | GOOPTS ?= |
3 | | - |
4 | | -pkgs = ./... |
| 3 | +GOFMT ?= gofmt |
| 4 | +STATICCHECK ?= staticcheck |
| 5 | +PACKAGES ?= ./... |
| 6 | +CHANGELOG ?= CHANGELOG.md |
5 | 7 |
|
6 | 8 | BIN_DIR ?= ./bin |
7 | 9 | BUILD_DIR ?= ./build |
8 | 10 | DIST_DIR ?= ./dist |
9 | | -APPNAME ?= script_exporter |
10 | | -VERSION ?= $(shell cat ./VERSION 2> /dev/null) |
| 11 | + |
| 12 | +APPNAME ?= $(shell perl -ne 'if (/^module /) { s/^module .+\///; print; }' go.mod) |
| 13 | +VERSION ?= $(shell perl -lne 'if (/^\#\# \[\d+\.\d+\.\d+\] - [^\[A-Za-z]/) { print substr((split(/\s+/))[1], 1, -1); last; }' $(CHANGELOG)) |
11 | 14 | COMMIT ?= $(shell git rev-parse --verify HEAD) |
12 | 15 | DATE := $(shell date +%FT%T%z) |
| 16 | +TARGETS := freebsd/amd64 darwin/amd64 darwin/arm64 linux/amd64 linux/arm64 windows/amd64 |
13 | 17 |
|
14 | | -GOPATH ?= $(shell go env GOPATH) |
15 | 18 | GO_LDFLAGS += -X main.name=$(APPNAME) |
16 | 19 | GO_LDFLAGS += -X main.version=v$(VERSION) |
17 | 20 | GO_LDFLAGS += -X main.commit=$(COMMIT) |
18 | 21 | GO_LDFLAGS += -X main.date=$(DATE) |
19 | 22 | # strip debug info from binary |
20 | | -GO_LDFLAGS += -s -w |
| 23 | +GO_LDFLAGS += -s -w |
21 | 24 |
|
22 | | -GO_LDFLAGS := -ldflags="$(GO_LDFLAGS)" |
| 25 | +GO_LDFLAGS := -ldflags="$(GO_LDFLAGS)" |
23 | 26 |
|
24 | | -OS := $(if $(GOOS),$(GOOS),$(shell go env GOOS)) |
25 | | -ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH)) |
| 27 | +VERSION_NEXT ?= $(shell echo $(word 1, $(subst ., ,$(VERSION))).$$(($(word 2, $(subst ., ,$(VERSION))) + 1)).0) |
| 28 | +CHANGELOG_LINE ?= - Security: dependency and security updates |
26 | 29 |
|
27 | | -.PHONY: all |
28 | | -all: test build |
29 | | - |
30 | | -.PHONY: update-dependencies |
31 | | -update-dependencies: |
32 | | - $(GO) get -t -u ./... |
33 | | - $(GO) mod tidy |
| 30 | +ifeq (,$(shell sed -nE '/\#\# .*(upcoming|unreleased)/Ip' $(CHANGELOG))) |
| 31 | + CHANGELOG_LINES ?= \#\# \[$(VERSION_NEXT)\] - $(shell date +%F)\n$(CHANGELOG_LINE)\n\n |
| 32 | +else |
| 33 | + CHANGELOG_LINES ?= $(CHANGELOG_LINE)\n\n |
| 34 | +endif |
34 | 35 |
|
35 | | -.PHONY: update |
36 | | -update: clean update-dependencies test build |
37 | | - |
38 | | -.PHONY: build |
39 | | -build: |
40 | | - $(GO) build $(GO_LDFLAGS) -o $(BUILD_DIR)/$(APPNAME)-$(VERSION)-$(OS)-$(ARCH)/$(APPNAME) -v ./... |
| 36 | +.PHONY: version |
| 37 | +version: |
| 38 | + @echo "$(VERSION)" |
41 | 39 |
|
42 | 40 | .PHONY: test |
43 | 41 | test: |
44 | | - mkdir -p $(BUILD_DIR) |
45 | | - $(GO) test -v -race -coverprofile=$(BUILD_DIR)/test-coverage.out $(pkgs) |
| 42 | + @echo "Start test for: $(APPNAME) v$(VERSION)" |
46 | 43 |
|
47 | | -.PHONY: clean |
48 | | -clean: |
49 | | - $(GO) clean |
50 | | - rm -rf $(BUILD_DIR) $(DIST_DIR) |
| 44 | + test -z "$$($(GOFMT) -l .)" # Check Code is formatted correctly |
| 45 | + $(GO) mod verify # ensure that go.sum agrees with what's in the module cache |
| 46 | + $(GO) vet $(PACKAGES) # examines Go source code and reports suspicious constructs |
51 | 47 |
|
52 | | -.PHONY: compile |
53 | | -compile: |
54 | | - # FreeBDS |
55 | | - GOOS=freebsd GOARCH=amd64 $(GO) build $(GO_LDFLAGS) -o $(BUILD_DIR)/$(APPNAME)-$(VERSION)-freebsd-amd64/$(APPNAME) -v ./... |
56 | | - # MacOS |
57 | | - GOOS=darwin GOARCH=amd64 $(GO) build $(GO_LDFLAGS) -o $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-amd64/$(APPNAME) -v ./... |
58 | | - # MacOS M1 |
59 | | - GOOS=darwin GOARCH=arm64 $(GO) build $(GO_LDFLAGS) -o $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-arm64/$(APPNAME) -v ./... |
60 | | - # Linux |
61 | | - GOOS=linux GOARCH=amd64 $(GO) build $(GO_LDFLAGS) -o $(BUILD_DIR)/$(APPNAME)-$(VERSION)-linux-amd64/$(APPNAME) -v ./... |
62 | | - # Windows |
63 | | - GOOS=windows GOARCH=amd64 $(GO) build $(GO_LDFLAGS) -o $(BUILD_DIR)/$(APPNAME)-$(VERSION)-windows-amd64/$(APPNAME).exe -v ./... |
| 48 | +ifneq (,$(shell which $(STATICCHECK))) |
| 49 | + $(STATICCHECK) $(PACKAGES) # extensive analysis of Go code |
| 50 | +endif |
64 | 51 |
|
65 | | -.PHONY: dist |
66 | | -dist: clean compile |
67 | | - mkdir -p $(DIST_DIR) |
| 52 | + mkdir -p $(BUILD_DIR) |
| 53 | + # run unit test with coverage |
| 54 | + $(GO) test -race -coverprofile=$(BUILD_DIR)/test-coverage.out -json $(PACKAGES) > $(BUILD_DIR)/test-report-unit.json |
| 55 | + # run benchmark test once to make sure they work |
| 56 | + $(GO) test -run=- -bench=. -benchtime=1x -json $(PACKAGES) > $(BUILD_DIR)/test-report-benchmark.json |
68 | 57 |
|
69 | | - tar -C $(BUILD_DIR) -cvf $(BUILD_DIR)/$(APPNAME)-$(VERSION)-freebsd-amd64.tar $(APPNAME)-$(VERSION)-freebsd-amd64 |
70 | | - gzip $(BUILD_DIR)/$(APPNAME)-$(VERSION)-freebsd-amd64.tar |
71 | | - mv $(BUILD_DIR)/$(APPNAME)-$(VERSION)-freebsd-amd64.tar.gz $(DIST_DIR)/$(APPNAME)-$(VERSION)-freebsd-amd64.tar.gz |
| 58 | +.PHONY: build |
| 59 | +build: |
| 60 | + @echo "Start build for: $(APPNAME) v$(VERSION)" |
| 61 | + |
| 62 | + @if grep -q "package main" *.go 2>/dev/null ; then \ |
| 63 | + mkdir -p $(BUILD_DIR); \ |
| 64 | + for target in $(TARGETS); do \ |
| 65 | + os=$$(echo $$target | cut -d/ -f1); \ |
| 66 | + arch=$$(echo $$target | cut -d/ -f2); \ |
| 67 | + GOOS=$$os GOARCH=$$arch $(GO) build $(GO_LDFLAGS) -o $(BUILD_DIR)/$(VERSION)-$$os-$$arch/ $(PACKAGES); \ |
| 68 | + done; \ |
| 69 | + else \ |
| 70 | + echo "No building required, module does not contain the 'main' package."; \ |
| 71 | + fi |
| 72 | + |
| 73 | +.PHONY: dist-check |
| 74 | +dist-check: |
| 75 | +ifneq (,$(filter $(bamboo_planRepository_branchName),release/acceptance master)) |
| 76 | + @echo "Performing dist check for: $(bamboo_planRepository_branchName)" |
| 77 | + |
| 78 | + @if ! test -z "$$(sed -E -n '/(upcoming|unreleased)/I,/##/p' changelog.md | sed '1d;$$d' | sed 's/[[:space:]-]//g')"; then \ |
| 79 | + echo "Error: cannot generate dist, changelog.md must not contain unreleased lines."; \ |
| 80 | + exit 1; \ |
| 81 | + fi |
| 82 | + |
| 83 | + # Check for changes in go.mod or go.sum |
| 84 | + @mkdir -p $(BUILD_DIR) |
| 85 | + @cp go.mod $(BUILD_DIR)/go.mod.chk |
| 86 | + @cp go.sum $(BUILD_DIR)/go.sum.chk |
| 87 | + |
| 88 | + test -z $$($(GO) mod tidy) |
| 89 | + |
| 90 | + diff go.mod $(BUILD_DIR)/go.mod.chk |
| 91 | + diff go.sum $(BUILD_DIR)/go.sum.chk |
| 92 | + |
| 93 | + @rm $(BUILD_DIR)/go.mod.chk $(BUILD_DIR)/go.sum.chk |
| 94 | +else |
| 95 | + @echo "Skipping dist check." |
| 96 | +endif |
| 97 | + |
| 98 | +.PHONY: dist-create |
| 99 | +dist-create: |
| 100 | + @echo "Create dist for: $(APPNAME) v$(VERSION)" |
| 101 | + |
| 102 | + @if grep -q "package main" *.go 2>/dev/null ; then \ |
| 103 | + mkdir -p $(DIST_DIR); \ |
| 104 | + for target in $(TARGETS); do \ |
| 105 | + os=$$(echo $$target | cut -d/ -f1); \ |
| 106 | + arch=$$(echo $$target | cut -d/ -f2); \ |
| 107 | + tar -C $(BUILD_DIR) -cvzf $(DIST_DIR)/$(APPNAME)-$(VERSION)-$$os-$$arch.tar.gz $(VERSION)-$$os-$$arch; \ |
| 108 | + done; \ |
| 109 | + fi |
72 | 110 |
|
73 | | - tar -C $(BUILD_DIR) -cvf $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-amd64.tar $(APPNAME)-$(VERSION)-darwin-amd64 |
74 | | - gzip $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-amd64.tar |
75 | | - mv $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-amd64.tar.gz $(DIST_DIR)/$(APPNAME)-$(VERSION)-darwin-amd64.tar.gz |
| 111 | +.PHONY: dist |
| 112 | +dist: clean dist-check build dist-create |
| 113 | + |
| 114 | +.PHONY: update-dependencies |
| 115 | +update-dependencies: |
| 116 | + $(GO) get go@latest |
| 117 | + # Remove patch level of GO version |
| 118 | + @sed -i "" -E 's/(go [0-9]+\.[0-9]+)\.[0-9]+/\1/' go.mod |
| 119 | + $(GO) get -t -u $(PACKAGES) |
| 120 | + $(GO) mod tidy |
76 | 121 |
|
77 | | - tar -C $(BUILD_DIR) -cvf $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-arm64.tar $(APPNAME)-$(VERSION)-darwin-arm64 |
78 | | - gzip $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-arm64.tar |
79 | | - mv $(BUILD_DIR)/$(APPNAME)-$(VERSION)-darwin-arm64.tar.gz $(DIST_DIR)/$(APPNAME)-$(VERSION)-darwin-arm64.tar.gz |
| 122 | + # Adding lines to changelog |
| 123 | + @sed -i "" -e 's/\(## \[$(VERSION)\]\)/$(CHANGELOG_LINES)\1/' $(CHANGELOG) |
80 | 124 |
|
81 | | - tar -C $(BUILD_DIR) -cvf $(BUILD_DIR)/$(APPNAME)-$(VERSION)-linux-amd64.tar $(APPNAME)-$(VERSION)-linux-amd64 |
82 | | - gzip $(BUILD_DIR)/$(APPNAME)-$(VERSION)-linux-amd64.tar |
83 | | - mv $(BUILD_DIR)/$(APPNAME)-$(VERSION)-linux-amd64.tar.gz $(DIST_DIR)/$(APPNAME)-$(VERSION)-linux-amd64.tar.gz |
| 125 | +.PHONY: update |
| 126 | +update: clean update-dependencies test |
84 | 127 |
|
85 | | - tar -C $(BUILD_DIR) -cvf $(BUILD_DIR)/$(APPNAME)-$(VERSION)-windows-amd64.tar $(APPNAME)-$(VERSION)-windows-amd64 |
86 | | - gzip $(BUILD_DIR)/$(APPNAME)-$(VERSION)-windows-amd64.tar |
87 | | - mv $(BUILD_DIR)/$(APPNAME)-$(VERSION)-windows-amd64.tar.gz $(DIST_DIR)/$(APPNAME)-$(VERSION)-windows-amd64.tar.gz |
| 128 | +.PHONY: clean |
| 129 | +clean: |
| 130 | + $(GO) clean |
| 131 | + rm -rf $(BUILD_DIR) $(DIST_DIR) |
0 commit comments