From ada75e9c6c01971dbe608c1cd2de9eb72d14520a Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Fri, 9 Nov 2018 14:16:13 -0800 Subject: [PATCH] Build a manifest list Retool some of the build/test to produce a manifest-list rather than a single image. --- Dockerfile.in | 6 +- Makefile | 155 ++++++++++++++++++++++++++----------------------- build/build.sh | 11 +++- test_e2e.sh | 6 +- 4 files changed, 97 insertions(+), 81 deletions(-) diff --git a/Dockerfile.in b/Dockerfile.in index 376902d..5c2528b 100644 --- a/Dockerfile.in +++ b/Dockerfile.in @@ -12,11 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM ARG_FROM +FROM {ARG_FROM} MAINTAINER Tim Hockin -ADD bin/ARG_ARCH/ARG_BIN /ARG_BIN +ADD bin/{ARG_OS}_{ARG_ARCH}/{ARG_BIN} /{ARG_BIN} RUN apk update --no-cache && apk add \ ca-certificates \ @@ -28,4 +28,4 @@ RUN apk update --no-cache && apk add \ ENV HOME /tmp USER nobody:nobody -ENTRYPOINT ["/ARG_BIN"] +ENTRYPOINT ["/{ARG_BIN}"] diff --git a/Makefile b/Makefile index 231af08..89bc555 100644 --- a/Makefile +++ b/Makefile @@ -21,8 +21,11 @@ PKG := k8s.io/git-sync # Where to push the docker image. REGISTRY ?= staging-k8s.gcr.io -# Which architecture to build - see $(ALL_ARCH) for options. -ARCH ?= amd64 +# Which platform to build - see $(ALL_PLATFORMS) for options. +PLATFORM ?= linux/amd64 + +OS := $(firstword $(subst /, ,$(PLATFORM))) +ARCH := $(lastword $(subst /, ,$(PLATFORM))) # This version-strategy uses git tags to set the version string VERSION := $(shell git describe --tags --always --dirty) @@ -36,27 +39,29 @@ VERSION := $(shell git describe --tags --always --dirty) SRC_DIRS := cmd pkg # directories which hold app source (not vendored) -ALL_ARCH := amd64 +ALL_PLATFORMS := linux/amd64 -# TODO: get a baseimage that works for other architectures -# arm arm64 ppc64le +# TODO: get a baseimage that works for other platforms +# linux/arm linux/arm64 linux/ppc64le # Set default base image dynamically for each arch -ifeq ($(ARCH),amd64) - BASEIMAGE?=alpine:3.7 -endif -ifeq ($(ARCH),arm) - BASEIMAGE?=armel/busybox -endif -ifeq ($(ARCH),arm64) - BASEIMAGE?=aarch64/busybox -endif -ifeq ($(ARCH),ppc64le) - BASEIMAGE?=ppc64le/busybox +ifeq ($(PLATFORM),linux/amd64) + BASEIMAGE ?= alpine:3.8 +#endif +#ifeq ($(PLATFORM),linux/arm) +# BASEIMAGE ?= armel/busybox +#endif +#ifeq ($(PLATFORM),linux/arm64) +# BASEIMAGE ?= aarch64/busybox +#endif +#ifeq ($(PLATFORM),linux/ppc64le) +# BASEIMAGE ?= ppc64le/busybox +else + $(error Unsupported platform '$(PLATFORM)') endif -IMAGE := $(REGISTRY)/$(BIN)-$(ARCH) -LEGACY_IMAGE := $(REGISTRY)/$(BIN) +IMAGE := $(REGISTRY)/$(BIN) +TAG := $(VERSION)__$(OS)_$(ARCH) BUILD_IMAGE ?= golang:1.11-alpine @@ -74,86 +79,92 @@ container-%: push-%: @$(MAKE) --no-print-directory ARCH=$* push -all-build: $(addprefix build-, $(ALL_ARCH)) +all-build: $(addprefix build-, $(ALL_PLATFORMS)) -all-container: $(addprefix container-, $(ALL_ARCH)) +all-container: $(addprefix container-, $(ALL_PLATFORMS)) -all-push: $(addprefix push-, $(ALL_ARCH)) +all-push: $(addprefix push-, $(ALL_PLATFORMS)) -build: bin/$(ARCH)/$(BIN) +build: bin/$(OS)_$(ARCH)/$(BIN) -bin/$(ARCH)/$(BIN): build-dirs +bin/$(OS)_$(ARCH)/$(BIN): build-dirs @echo "building: $@" - @docker run \ - -i \ - -u $$(id -u):$$(id -g) \ - -v $$(pwd)/.go:/go \ - -v $$(pwd):/go/src/$(PKG) \ - -v $$(pwd)/bin/$(ARCH):/go/bin \ - -v $$(pwd)/bin/$(ARCH):/go/bin/linux_$(ARCH) \ - -v $$(pwd)/.go/std/$(ARCH):/usr/local/go/pkg/linux_$(ARCH)_static \ - -v $$(pwd)/.go/cache:/.cache \ - -w /go/src/$(PKG) \ - --rm \ - $(BUILD_IMAGE) \ - /bin/sh -c " \ - ARCH=$(ARCH) \ - VERSION=$(VERSION) \ - PKG=$(PKG) \ - ./build/build.sh \ + @docker run \ + -i \ + -u $$(id -u):$$(id -g) \ + -v $$(pwd)/.go:/go \ + -v $$(pwd):/go/src/$(PKG) \ + -v $$(pwd)/bin/$(OS)_$(ARCH):/go/bin \ + -v $$(pwd)/bin/$(OS)_$(ARCH):/go/bin/$(OS)_$(ARCH) \ + -v $$(pwd)/.go/std/$(OS)_$(ARCH):/usr/local/go/pkg/$(OS)_$(ARCH)_static \ + -v $$(pwd)/.go/cache:/.cache \ + -w /go/src/$(PKG) \ + --rm \ + $(BUILD_IMAGE) \ + /bin/sh -c " \ + ARCH=$(ARCH) \ + OS=$(OS) \ + VERSION=$(VERSION) \ + PKG=$(PKG) \ + ./build/build.sh \ " -DOTFILE_IMAGE = $(subst /,_,$(IMAGE))-$(VERSION) +DOTFILE_IMAGE = $(subst /,_,$(IMAGE))-$(TAG) container: .container-$(DOTFILE_IMAGE) container-name -.container-$(DOTFILE_IMAGE): bin/$(ARCH)/$(BIN) Dockerfile.in +.container-$(DOTFILE_IMAGE): bin/$(OS)_$(ARCH)/$(BIN) Dockerfile.in @sed \ - -e 's|ARG_BIN|$(BIN)|g' \ - -e 's|ARG_ARCH|$(ARCH)|g' \ - -e 's|ARG_FROM|$(BASEIMAGE)|g' \ - Dockerfile.in > .dockerfile-$(ARCH) - @docker build -t $(IMAGE):$(VERSION) -f .dockerfile-$(ARCH) . - @docker images -q $(IMAGE):$(VERSION) > $@ - @if [ "$(ARCH)" = "amd64" ]; then \ - docker tag $(IMAGE):$(VERSION) $(LEGACY_IMAGE):$(VERSION); \ - fi + -e 's|{ARG_BIN}|$(BIN)|g' \ + -e 's|{ARG_ARCH}|$(ARCH)|g' \ + -e 's|{ARG_OS}|$(OS)|g' \ + -e 's|{ARG_FROM}|$(BASEIMAGE)|g' \ + Dockerfile.in > .dockerfile-$(OS)_$(ARCH) + @docker build -t $(IMAGE):$(TAG) -f .dockerfile-$(OS)_$(ARCH) . + @docker images -q $(IMAGE):$(TAG) > $@ container-name: - @echo "container: $(IMAGE):$(VERSION)" + @echo "container: $(IMAGE):$(TAG)" push: .push-$(DOTFILE_IMAGE) push-name .push-$(DOTFILE_IMAGE): .container-$(DOTFILE_IMAGE) - @gcloud docker -- push $(IMAGE):$(VERSION) - @docker images -q $(IMAGE):$(VERSION) > $@ - @if [ "$(ARCH)" = "amd64" ]; then \ - gcloud docker -- push $(LEGACY_IMAGE):$(VERSION); \ - fi + @docker push $(IMAGE):$(TAG) + @docker images -q $(IMAGE):$(TAG) > $@ push-name: - @echo "pushed: $(IMAGE):$(VERSION)" + @echo "pushed: $(IMAGE):$(TAG)" + +# This depends on github.com/estesp/manifest-tool in $PATH. +manifest-list: container + manifest-tool \ + --username=oauth2accesstoken \ + --password=$$(gcloud auth print-access-token) \ + push from-args \ + --platforms "$(ALL_PLATFORMS)" \ + --template $(REGISTRY)/$(BIN):$(VERSION)__OS_ARCH \ + --target $(REGISTRY)/$(BIN):$(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 \ - -v $$(pwd)/.go/cache:/.cache \ - -w /go/src/$(PKG) \ - $(BUILD_IMAGE) \ - /bin/sh -c " \ - ./build/test.sh $(SRC_DIRS) \ + @docker run \ + -ti \ + -u $$(id -u):$$(id -g) \ + -v $$(pwd)/.go:/go \ + -v $$(pwd):/go/src/$(PKG) \ + -v $$(pwd)/bin/$(OS)_$(ARCH):/go/bin \ + -v $$(pwd)/.go/std/$(OS)_$(ARCH):/usr/local/go/pkg/$(OS)_$(ARCH)_static \ + -v $$(pwd)/.go/cache:/.cache \ + -w /go/src/$(PKG) \ + $(BUILD_IMAGE) \ + /bin/sh -c " \ + ./build/test.sh $(SRC_DIRS) \ " @./test_e2e.sh build-dirs: - @mkdir -p bin/$(ARCH) - @mkdir -p .go/src/$(PKG) .go/pkg .go/bin .go/std/$(ARCH) .go/cache + @mkdir -p bin/$(OS)_$(ARCH) + @mkdir -p .go/src/$(PKG) .go/pkg .go/bin .go/std/$(OS)_$(ARCH) .go/cache clean: container-clean bin-clean diff --git a/build/build.sh b/build/build.sh index ae91479..bb61a93 100755 --- a/build/build.sh +++ b/build/build.sh @@ -18,21 +18,26 @@ set -o errexit set -o nounset set -o pipefail -if [ -z "${PKG}" ]; then +if [ -z "${PKG:-}" ]; then echo "PKG must be set" exit 1 fi -if [ -z "${ARCH}" ]; then +if [ -z "${ARCH:-}" ]; then echo "ARCH must be set" exit 1 fi -if [ -z "${VERSION}" ]; then +if [ -z "${OS:-}" ]; then + echo "OS 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}" +export GOOS="${OS}" go install \ -installsuffix "static" \ diff --git a/test_e2e.sh b/test_e2e.sh index 3efbd86..2d25300 100755 --- a/test_e2e.sh +++ b/test_e2e.sh @@ -61,7 +61,7 @@ trap finish INT EXIT # ##################### # Build it -make container REGISTRY=e2e TAG=$(make -s version) +make container REGISTRY=e2e VERSION=$(make -s version) DIR="" for i in $(seq 1 10); do @@ -76,14 +76,14 @@ echo "test root is $DIR" CONTAINER_NAME=git-sync-$RANDOM function GIT_SYNC() { - #./bin/amd64/git-sync "$@" + #./bin/linux_amd64/git-sync "$@" docker run \ --name $CONTAINER_NAME \ -i \ -u $(id -u):$(id -g) \ -v "$DIR":"$DIR" \ --rm \ - e2e/git-sync-amd64:$(make -s version) \ + e2e/git-sync:$(make -s version) \ "$@" }