From ac827968b6c93eecc80807f4fd2916b4d5d48b06 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 25 Sep 2018 12:40:34 -0400 Subject: [PATCH] update Signed-off-by: Jess Frazelle --- .gitignore | 2 + .travis.yml | 43 ++++-------- Makefile | 88 ++++--------------------- VERSION.txt | 1 + basic.mk | 185 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 214 insertions(+), 105 deletions(-) create mode 100644 VERSION.txt create mode 100644 basic.mk diff --git a/.gitignore b/.gitignore index 5361d30..7266ace 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,8 @@ cross/ coverage.txt profile.out +!go.mod + rootfs config.json .ip diff --git a/.travis.yml b/.travis.yml index d47eaa2..5b945d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,32 +1,13 @@ ---- - language: go - sudo: required - services: +language: go +sudo: required +services: - docker - notifications: - email: true - go: - - 1.x - - tip - env: - global: - - GO15VENDOREXPERIMENT=1 - matrix: - allow_failures: - - go: tip - fast_finish: true - install: - - go get github.com/golang/lint/golint - - go get honnef.co/go/tools/cmd/staticcheck - - echo "deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/backports.list - - sudo apt update && sudo apt install -y -t trusty-backports libapparmor-dev libseccomp-dev - script: - - make - - go vet $(go list ./... | grep -v vendor) - - staticcheck $(go list ./... | grep -v vendor) - - test -z "$(golint ./... | grep -v vendor | tee /dev/stderr)" - - test -z "$(gofmt -s -l . | grep -v vendor | grep -v bindata.go | tee /dev/stderr)" - - go test $(go list ./... | grep -v vendor) - - make cover - after_success: - - bash <(curl -s https://codecov.io/bash) +go: + - 1.10.x +before_install: + - go get github.com/golang/lint/golint + - go get honnef.co/go/tools/cmd/staticcheck +jobs: + include: + - script: make everything + - stage: Run Test Coverage diff --git a/Makefile b/Makefile index 7a2d386..f7c4b5d 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,25 @@ -# Set an output prefix, which is the local directory if not specified -PREFIX?=$(shell pwd) +# Setup name variables for the package/tool +NAME := binctr +PKG := github.com/genuinetools/$(NAME) -# Set any default go build tags +CGO_ENABLED := 1 + +# Set any default go build tags. BUILDTAGS := seccomp apparmor -GO_LDFLAGS_STATIC=-ldflags "-w -extldflags -static" +.PHONY: everything +everything: clean fmt lint test staticcheck vet alpine busybox cl-k8s ## Builds a static executable or package. -all: clean build fmt lint test staticcheck vet ## Runs a clean, build, fmt, lint, test, staticcheck, and vet +include basic.mk -.PHONY: build -build: alpine busybox cl-k8s ## Builds a static executable or package +.PHONY: prebuild +prebuild: .PHONY: alpine alpine: @echo "+ $@" go generate ./examples/$@/... - CGO_ENABLED=1 go build \ + CGO_ENABLED=$(CGO_ENABLED) $(GO) build \ -tags "$(BUILDTAGS) static_build" \ ${GO_LDFLAGS_STATIC} -o $@ ./examples/$@/... @echo "Static container for $@ created at: ./$@" @@ -24,7 +28,7 @@ alpine: busybox: @echo "+ $@" go generate ./examples/$@/... - CGO_ENABLED=1 go build \ + CGO_ENABLED=$(CGO_ENABLED) $(GO) build \ -tags "$(BUILDTAGS) static_build" \ ${GO_LDFLAGS_STATIC} -o $@ ./examples/$@/... @echo "Static container for $@ created at: ./$@" @@ -33,71 +37,7 @@ busybox: cl-k8s: @echo "+ $@" go generate ./examples/$@/... - CGO_ENABLED=1 go build \ + CGO_ENABLED=$(CGO_ENABLED) $(GO) build \ -tags "$(BUILDTAGS) static_build" \ ${GO_LDFLAGS_STATIC} -o $@ ./examples/$@/... @echo "Static container for $@ created at: ./$@" - -.PHONY: fmt -fmt: ## Verifies all files have been `gofmt`ed - @echo "+ $@" - @gofmt -s -l . | grep -v '.pb.go:' | grep -v vendor | grep -v bindata.go | tee /dev/stderr - -.PHONY: lint -lint: ## Verifies `golint` passes - @echo "+ $@" - @golint ./... | grep -v '.pb.go:' | grep -v vendor | tee /dev/stderr - -.PHONY: test -test: ## Runs the go tests - @echo "+ $@" - @go test -v -tags "$(BUILDTAGS) cgo" $(shell go list ./... | grep -v vendor) - -.PHONY: vet -vet: ## Verifies `go vet` passes - @echo "+ $@" - @go vet $(shell go list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr - -.PHONY: staticcheck -staticcheck: ## Verifies `staticcheck` passes - @echo "+ $@" - @staticcheck $(shell go list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr - -.PHONY: cover -cover: ## Runs go test with coverage - @echo "" > coverage.txt - @for d in $(shell go list ./... | grep -v vendor); do \ - go test -race -coverprofile=profile.out -covermode=atomic "$$d"; \ - if [ -f profile.out ]; then \ - cat profile.out >> coverage.txt; \ - rm profile.out; \ - fi; \ - done; - -.PHONY: bump-version -BUMP := patch -bump-version: ## Bump the version in the version file. Set BUMP to [ patch | major | minor ] - @go get -u github.com/jessfraz/junk/sembump # update sembump tool - $(eval NEW_VERSION = $(shell sembump --kind $(BUMP) $(VERSION))) - @echo "Bumping VERSION.txt from $(VERSION) to $(NEW_VERSION)" - echo $(NEW_VERSION) > VERSION.txt - @echo "Updating links to download binaries in README.md" - sed -i s/$(VERSION)/$(NEW_VERSION)/g README.md - git add VERSION.txt README.md - git commit -vsam "Bump version to $(NEW_VERSION)" - @echo "Run make tag to create and push the tag for new version $(NEW_VERSION)" - -.PHONY: tag -tag: ## Create a new git tag to prepare to build a release - git tag -sa $(VERSION) -m "$(VERSION)" - @echo "Run git push origin $(VERSION) to push your new tag to GitHub and trigger a travis build." - -.PHONY: clean -clean: ## Cleanup any build binaries or packages - @echo "+ $@" - $(RM) alpine busybox cl-k8s - @sudo $(RM) -r rootfs - -.PHONY: help -help: - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/VERSION.txt b/VERSION.txt new file mode 100644 index 0000000..ae39fab --- /dev/null +++ b/VERSION.txt @@ -0,0 +1 @@ +v0.0.0 diff --git a/basic.mk b/basic.mk new file mode 100644 index 0000000..96192f8 --- /dev/null +++ b/basic.mk @@ -0,0 +1,185 @@ +# Set an output prefix, which is the local directory if not specified +PREFIX?=$(shell pwd) + +# Set the build dir, where built cross-compiled binaries will be output +BUILDDIR := ${PREFIX}/cross + +# Populate version variables +# Add to compile time flags +VERSION := $(shell cat VERSION.txt) +GITCOMMIT := $(shell git rev-parse --short HEAD) +GITUNTRACKEDCHANGES := $(shell git status --porcelain --untracked-files=no) +ifneq ($(GITUNTRACKEDCHANGES),) + GITCOMMIT := $(GITCOMMIT)-dirty +endif +ifeq ($(GITCOMMIT),) + GITCOMMIT := ${GITHUB_SHA} +endif +CTIMEVAR=-X $(PKG)/version.GITCOMMIT=$(GITCOMMIT) -X $(PKG)/version.VERSION=$(VERSION) +GO_LDFLAGS=-ldflags "-w $(CTIMEVAR)" +GO_LDFLAGS_STATIC=-ldflags "-w $(CTIMEVAR) -extldflags -static" + +# Set our default go compiler +GO := go + +# List the GOOS and GOARCH to build +GOOSARCHES = $(shell cat .goosarch) + +# Set the graph driver as the current graphdriver if not set. +DOCKER_GRAPHDRIVER := $(if $(DOCKER_GRAPHDRIVER),$(DOCKER_GRAPHDRIVER),$(shell docker info 2>&1 | grep "Storage Driver" | sed 's/.*: //')) +export DOCKER_GRAPHDRIVER + +# If this session isn't interactive, then we don't want to allocate a +# TTY, which would fail, but if it is interactive, we do want to attach +# so that the user can send e.g. ^C through. +INTERACTIVE := $(shell [ -t 0 ] && echo 1 || echo 0) +ifeq ($(INTERACTIVE), 1) + DOCKER_FLAGS += -t +endif + +.PHONY: build +build: prebuild $(NAME) ## Builds a dynamic executable or package. + +$(NAME): $(wildcard *.go) $(wildcard */*.go) VERSION.txt + @echo "+ $@" + $(GO) build -tags "$(BUILDTAGS)" ${GO_LDFLAGS} -o $(NAME) . + +.PHONY: static +static: prebuild ## Builds a static executable. + @echo "+ $@" + CGO_ENABLED=$(CGO_ENABLED) $(GO) build \ + -tags "$(BUILDTAGS) static_build" \ + ${GO_LDFLAGS_STATIC} -o $(NAME) . + +all: clean build fmt lint test staticcheck vet install ## Runs a clean, build, fmt, lint, test, staticcheck, vet and install. + +.PHONY: fmt +fmt: ## Verifies all files have been `gofmt`ed. + @echo "+ $@" + @gofmt -s -l . | grep -v '.pb.go:' | grep -v vendor | tee /dev/stderr + +.PHONY: lint +lint: ## Verifies `golint` passes. + @echo "+ $@" + @golint ./... | grep -v '.pb.go:' | grep -v vendor | tee /dev/stderr + +.PHONY: test +test: prebuild ## Runs the go tests. + @echo "+ $@" + @$(GO) test -v -tags "$(BUILDTAGS) cgo" $(shell $(GO) list ./... | grep -v vendor) + +.PHONY: vet +vet: ## Verifies `go vet` passes. + @echo "+ $@" + @$(GO) vet $(shell $(GO) list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr + +.PHONY: staticcheck +staticcheck: ## Verifies `staticcheck` passes. + @echo "+ $@" + @staticcheck $(shell $(GO) list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr + +.PHONY: cover +cover: prebuild ## Runs go test with coverage. + @echo "" > coverage.txt + @for d in $(shell $(GO) list ./... | grep -v vendor); do \ + $(GO) test -race -coverprofile=profile.out -covermode=atomic "$$d"; \ + if [ -f profile.out ]; then \ + cat profile.out >> coverage.txt; \ + rm profile.out; \ + fi; \ + done; + +.PHONY: install +install: prebuild ## Installs the executable or package. + @echo "+ $@" + $(GO) install -a -tags "$(BUILDTAGS)" ${GO_LDFLAGS} . + +define buildpretty +mkdir -p $(BUILDDIR)/$(1)/$(2); +GOOS=$(1) GOARCH=$(2) CGO_ENABLED=$(CGO_ENABLED) $(GO) build \ + -o $(BUILDDIR)/$(1)/$(2)/$(NAME) \ + -a -tags "$(BUILDTAGS) static_build netgo" \ + -installsuffix netgo ${GO_LDFLAGS_STATIC} .; +md5sum $(BUILDDIR)/$(1)/$(2)/$(NAME) > $(BUILDDIR)/$(1)/$(2)/$(NAME).md5; +sha256sum $(BUILDDIR)/$(1)/$(2)/$(NAME) > $(BUILDDIR)/$(1)/$(2)/$(NAME).sha256; +endef + +.PHONY: cross +cross: *.go VERSION.txt prebuild ## Builds the cross-compiled binaries, creating a clean directory structure (eg. GOOS/GOARCH/binary). + @echo "+ $@" + $(foreach GOOSARCH,$(GOOSARCHES), $(call buildpretty,$(subst /,,$(dir $(GOOSARCH))),$(notdir $(GOOSARCH)))) + +define buildrelease +GOOS=$(1) GOARCH=$(2) CGO_ENABLED=$(CGO_ENABLED) $(GO) build \ + -o $(BUILDDIR)/$(NAME)-$(1)-$(2) \ + -a -tags "$(BUILDTAGS) static_build netgo" \ + -installsuffix netgo ${GO_LDFLAGS_STATIC} .; +md5sum $(BUILDDIR)/$(NAME)-$(1)-$(2) > $(BUILDDIR)/$(NAME)-$(1)-$(2).md5; +sha256sum $(BUILDDIR)/$(NAME)-$(1)-$(2) > $(BUILDDIR)/$(NAME)-$(1)-$(2).sha256; +endef + +.PHONY: release +release: *.go VERSION.txt prebuild ## Builds the cross-compiled binaries, naming them in such a way for release (eg. binary-GOOS-GOARCH). + @echo "+ $@" + $(foreach GOOSARCH,$(GOOSARCHES), $(call buildrelease,$(subst /,,$(dir $(GOOSARCH))),$(notdir $(GOOSARCH)))) + +.PHONY: bump-version +BUMP := patch +bump-version: ## Bump the version in the version file. Set BUMP to [ patch | major | minor ]. + @$(GO) get -u github.com/jessfraz/junk/sembump # update sembump tool + $(eval NEW_VERSION = $(shell sembump --kind $(BUMP) $(VERSION))) + @echo "Bumping VERSION.txt from $(VERSION) to $(NEW_VERSION)" + echo $(NEW_VERSION) > VERSION.txt + @echo "Updating links to download binaries in README.md" + sed -i s/$(VERSION)/$(NEW_VERSION)/g README.md + git add VERSION.txt README.md + git commit -vsam "Bump version to $(NEW_VERSION)" + @echo "Run make tag to create and push the tag for new version $(NEW_VERSION)" + +.PHONY: tag +tag: ## Create a new git tag to prepare to build a release. + git tag -sa $(VERSION) -m "$(VERSION)" + @echo "Run git push origin $(VERSION) to push your new tag to GitHub and trigger a travis build." + +REGISTRY := r.j3ss.co +.PHONY: image +image: ## Create the docker image from the Dockerfile. + @docker build --rm --force-rm -t $(REGISTRY)/$(NAME) . + +.PHONY: image-dev +image-dev: + @docker build --rm --force-rm -f Dockerfile.dev -t $(REGISTRY)/$(NAME):dev . + +.PHONY: AUTHORS +AUTHORS: + @$(file >$@,# This file lists all individuals having contributed content to the repository.) + @$(file >>$@,# For how it is generated, see `make AUTHORS`.) + @echo "$(shell git log --format='\n%aN <%aE>' | LC_ALL=C.UTF-8 sort -uf)" >> $@ + +.PHONY: vendor +vendor: ## Updates the vendoring directory. + @$(RM) go.sum + @$(RM) -r vendor + GO111MODULE=on $(GO) mod init || true + GO111MODULE=on $(GO) mod tidy + GO111MODULE=on $(GO) mod vendor + @$(RM) Gopkg.toml Gopkg.lock + +.PHONY: clean +clean: ## Cleanup any build binaries or packages. + @echo "+ $@" + $(RM) $(NAME) + $(RM) -r $(BUILDDIR) + +.PHONY: help +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | sed 's/^[^:]*://g' | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +check_defined = \ + $(strip $(foreach 1,$1, \ + $(call __check_defined,$1,$(strip $(value 2))))) + +__check_defined = \ + $(if $(value $1),, \ + $(error Undefined $1$(if $2, ($2))$(if $(value @), \ + required by target `$@')))