# Copyright 2016 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. # The binary to build (just the basename). BIN := myapp # This repo's root import path (under GOPATH). PKG := github.com/thockin/go-build-template # Where to push the docker image. REGISTRY ?= thockin # Which architecture to build - see $(ALL_ARCH) for options. ARCH ?= amd64 ### ### These variables should not need tweaking. ### SRC_DIRS := cmd pkg # directories which hold app source (not vendored) ALL_ARCH := amd64 arm arm64 ppc64le # TODO: base image for non-x86 archs? IMAGE := $(REGISTRY)/$(BIN)-$(ARCH) BUILD_IMAGE ?= golang:1.7-alpine VERSION := TAG := $(shell git describe --abbrev=0 --tags HEAD 2>/dev/null) COMMIT := $(shell git rev-parse HEAD) ifeq ($(TAG),) VERSION := unknown-$(COMMIT) else ifeq ($(COMMIT), $(shell git rev-list -n1 $(TAG))) VERSION := $(TAG) else VERSION := $(TAG)-$(COMMIT) endif endif DIRTY := $(shell test -z "$$(git diff --shortstat 2>/dev/null)" || echo -dirty) VERSION := $(VERSION)$(DIRTY) # If you want to build all binaries, see the 'all-build' rule. # If you want to build all containers, see the 'all-container' rule. # If you want to build AND push all containers, see the 'all-push' rule. all: build build-%: @$(MAKE) --no-print-directory ARCH=$* build container-%: @$(MAKE) --no-print-directory ARCH=$* container push-%: @$(MAKE) --no-print-directory ARCH=$* push all-build: $(addprefix build-, $(ALL_ARCH)) all-container: $(addprefix container-, $(ALL_ARCH)) all-push: $(addprefix push-, $(ALL_ARCH)) build: bin/$(ARCH)/$(BIN) bin/$(ARCH)/$(BIN): build-dirs @echo "building: $@" @docker run \ -ti \ -u $$(id -u):$$(id -g) \ -v $$(pwd)/.go:/go \ -v $$(pwd):/go/src/$(PKG) \ -v $$(pwd)/bin/$(ARCH):/go/bin \ -v $$(pwd)/.go/std/$(ARCH):/usr/local/go/pkg/linux_$(ARCH)_static \ -w /go/src/$(PKG) \ $(BUILD_IMAGE) \ /bin/sh -c " \ ARCH=$(ARCH) \ VERSION=$(VERSION) \ PKG=$(PKG) \ ./build/build.sh \ " DOTFILE_IMAGE = $(subst /,_,$(IMAGE))-$(VERSION) container: .container-$(DOTFILE_IMAGE) container-name .container-$(DOTFILE_IMAGE): bin/$(ARCH)/$(BIN) Dockerfile @docker build -t $(IMAGE):$(VERSION) --build-arg ARCH=$(ARCH) . @docker images -q $(IMAGE):$(VERSION) > $@ container-name: @echo "container: $(IMAGE):$(VERSION)" push: .push-$(DOTFILE_IMAGE) push-name .push-$(DOTFILE_IMAGE): .container-$(DOTFILE_IMAGE) @gcloud docker push $(IMAGE):$(VERSION) @docker images -q $(IMAGE):$(VERSION) > $@ push-name: @echo "pushed: $(IMAGE):$(VERSION)" version: @echo $(VERSION) test: build-dirs @docker run \ -ti \ -u $$(id -u):$$(id -g) \ -v $$(pwd)/.go:/go \ -v $$(pwd):/go/src/$(PKG) \ -v $$(pwd)/bin/$(ARCH):/go/bin \ -v $$(pwd)/.go/std/$(ARCH):/usr/local/go/pkg/linux_$(ARCH)_static \ -w /go/src/$(PKG) \ $(BUILD_IMAGE) \ /bin/sh -c " \ ./build/test.sh $(SRC_DIRS) \ " build-dirs: @mkdir -p bin/$(ARCH) @mkdir -p .go/src/$(PKG) .go/pkg .go/bin .go/std/$(ARCH) clean: container-clean bin-clean container-clean: rm -rf .container-* .push-* bin-clean: rm -rf .go bin