feat(ci): add Makefile and GitHub Actions configuration

And also enable printing conver's own version with `-version` option.
This commit is contained in:
2020-10-31 18:35:07 +00:00
parent b6218ed1e0
commit 14154effe0
5 changed files with 320 additions and 2 deletions

154
Makefile Normal file
View File

@@ -0,0 +1,154 @@
NAME := conver
ROOT := $(CURDIR)
SOURCES := $(shell find . -name "*.go" -or -name "go.mod" -or -name "go.sum" \
-or -name "Makefile")
# Verbose output
ifdef VERBOSE
V = -v
endif
#
# Environment
#
BINDIR := bin
TOOLDIR := tools/bin
# Global environment variables for all targets
SHELL ?= /bin/bash
SHELL := env \
GO111MODULE=on \
GOBIN=$(CURDIR)/$(TOOLDIR) \
CGO_ENABLED=1 \
PATH='$(CURDIR)/$(BINDIR):$(CURDIR)/$(TOOLDIR):$(PATH)' \
$(SHELL)
#
# Defaults
#
# Default target
.DEFAULT_GOAL := build
.PHONY: all
all: lint test build
#
# Tools
#
TOOLS += $(TOOLDIR)/gobin
gobin: $(TOOLDIR)/gobin
$(TOOLDIR)/gobin:
GO111MODULE=off go get -u github.com/myitcv/gobin
# external tool
define tool # 1: binary-name, 2: go-import-path
TOOLS += $(TOOLDIR)/$(1)
.PHONY: $(1)
$(1): $(TOOLDIR)/$(1)
$(TOOLDIR)/$(1): $(TOOLDIR)/gobin Makefile
gobin $(V) "$(2)"
endef
$(eval $(call tool,gofumports,mvdan.cc/gofumpt/gofumports))
$(eval $(call tool,golangci-lint,github.com/golangci/golangci-lint/cmd/golangci-lint@v1.31))
.PHONY: tools
tools: $(TOOLS)
#
# Build
#
BINARY=$(BINDIR)/$(NAME)
LDFLAGS := -w -s
VERSION ?= $(shell git describe --tags 2>/dev/null)
GIT_SHA ?= $(shell git rev-parse --short HEAD 2>/dev/null)
DATE ?= $(shell date +%s)
ifeq ($(trim $(VERSION)),)
VERSION = dev
endif
.PHONY: build
build: $(BINARY)
$(BINARY): $(SOURCES)
go build $(V) -a -o "$@" -ldflags "$(LDFLAGS) \
-X main.Version=$(VERSION) \
-X main.Commit=$(GIT_SHA) \
-X main.Date=$(DATE)"
#
# Development
#
.PHONY: clean
clean:
rm -rf $(BINS) $(TOOLS)
rm -f ./coverage.out ./go.mod.tidy-check ./go.sum.tidy-check
.PHONY: test
test:
go test $(V) -count=1 --race ./...
.PHONY: lint
lint: $(TOOLS)
$(info Running Go linters)
GOGC=off golangci-lint $(V) run
.PHONY: format
format: gofumports
gofumports -w .
#
# Coverage
#
.PHONY: cov
cov: coverage.out
.PHONY: cov-html
cov-html: coverage.out
go tool cover -html=coverage.out
.PHONY: cov-func
cov-func: coverage.out
go tool cover -func=coverage.out
coverage.out: $(SOURCES)
go test $(V) -covermode=count -coverprofile=coverage.out ./...
#
# Dependencies
#
.PHONY: deps
deps:
$(info Downloading dependencies)
go mod download
.PHONY: tidy
tidy:
go mod tidy $(V)
.PHONY: verify
verify:
go mod verify
.SILENT: check-tidy
.PHONY: check-tidy
check-tidy:
cp go.mod go.mod.tidy-check
cp go.sum go.sum.tidy-check
go mod tidy
-diff go.mod go.mod.tidy-check
-diff go.sum go.sum.tidy-check
-rm -f go.mod go.sum
-mv go.mod.tidy-check go.mod
-mv go.sum.tidy-check go.sum