Import first rev of project template
parent
869a91ef59
commit
43e119bda6
|
@ -0,0 +1,4 @@
|
||||||
|
/bin
|
||||||
|
/.go
|
||||||
|
/.push-*
|
||||||
|
/.container-*
|
|
@ -0,0 +1,24 @@
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
FROM alpine:3.4
|
||||||
|
|
||||||
|
MAINTAINER Tim Hockin <thockin@google.com>
|
||||||
|
|
||||||
|
ARG ARCH
|
||||||
|
|
||||||
|
ADD bin/${ARCH}/myapp /myapp
|
||||||
|
|
||||||
|
USER nobody:nobody
|
||||||
|
ENTRYPOINT ["/myapp"]
|
|
@ -0,0 +1,139 @@
|
||||||
|
# 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
|
|
@ -0,0 +1,34 @@
|
||||||
|
# Go app template build environment
|
||||||
|
|
||||||
|
This is a skeleton project for a Go application, which captures the best build
|
||||||
|
techniques I have learned to date. It uses a Makefile to drive the build (the
|
||||||
|
universal API to software projects) and a Dockerfile to build a docker image.
|
||||||
|
|
||||||
|
This has only been tested on Linux, and depends on Docker to build.
|
||||||
|
|
||||||
|
## Customizing it
|
||||||
|
|
||||||
|
To use this, simply copy these files and make the following changes:
|
||||||
|
|
||||||
|
Makefile:
|
||||||
|
- change `BIN` to your binary name
|
||||||
|
- change `PKG` to the Go import path of this repo
|
||||||
|
- change `REGISTRY` to the Docker registry you want to use
|
||||||
|
- maybe change `SRC_DIRS` if youuse some other layout
|
||||||
|
|
||||||
|
Dockerfile:
|
||||||
|
- change all `myapp` to your binary name
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Run `make` or `make build` to compile your app. This will use a Docker image
|
||||||
|
to build your app, with the current directory volume-mounted into place. This
|
||||||
|
will store incremental state for the fastest possible build.
|
||||||
|
|
||||||
|
Run `make container` to build the container image. It will calculate the image
|
||||||
|
tag based on the most recent git tag, and whether the repo is "dirty" since
|
||||||
|
that tag (see `make version`).
|
||||||
|
|
||||||
|
Run `make push` to push the container image to `REGISTRY`.
|
||||||
|
|
||||||
|
Run `make clean` to clean up.
|
|
@ -0,0 +1,40 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
if [ -z "${PKG}" ]; then
|
||||||
|
echo "PKG must be set"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ -z "${ARCH}" ]; then
|
||||||
|
echo "ARCH must be set"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ -z "${VERSION}" ]; then
|
||||||
|
echo "VERSION must be set"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
export CGO_ENABLED=0
|
||||||
|
export GOARCH="${ARCH}"
|
||||||
|
|
||||||
|
go install \
|
||||||
|
-installsuffix "static" \
|
||||||
|
-ldflags "-X ${PKG}/pkg/version.VERSION=${VERSION}" \
|
||||||
|
./...
|
|
@ -0,0 +1,52 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
export CGO_ENABLED=0
|
||||||
|
|
||||||
|
TARGETS=$(for d in "$@"; do echo ./$d/...; done)
|
||||||
|
|
||||||
|
echo "Running tests:"
|
||||||
|
go test -i -installsuffix "static" ${TARGETS}
|
||||||
|
go test -installsuffix "static" ${TARGETS}
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo -n "Checking gofmt: "
|
||||||
|
ERRS=$(find "$@" -type f -name \*.go | xargs gofmt -l 2>&1 || true)
|
||||||
|
if [ -n "${ERRS}" ]; then
|
||||||
|
echo "FAIL - the following files need to be gofmt'ed:"
|
||||||
|
for e in ${ERRS}; do
|
||||||
|
echo " $e"
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "PASS"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo -n "Checking go vet: "
|
||||||
|
ERRS=$(go vet ${TARGETS} 2>&1 || true)
|
||||||
|
if [ -n "${ERRS}" ]; then
|
||||||
|
echo "FAIL"
|
||||||
|
echo "${ERRS}"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "PASS"
|
||||||
|
echo
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.Printf("hello, world!")
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package version
|
||||||
|
|
||||||
|
var VERSION = "UNKNOWN"
|
Loading…
Reference in New Issue