From 18e93ca03df5978e5683fc52b6dec8f9aebb0449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Sun, 3 Sep 2017 12:48:59 +0300 Subject: [PATCH] Cross-build tiller as well --- Makefile | 77 ++++++++++++++++++------ rootfs/Dockerfile.experimental | 10 +-- rootfs/Dockerfile.rudder | 9 +-- rootfs/{Dockerfile => Dockerfile.tiller} | 12 ++-- versioning.mk | 22 +++++-- 5 files changed, 92 insertions(+), 38 deletions(-) rename rootfs/{Dockerfile => Dockerfile.tiller} (71%) diff --git a/Makefile b/Makefile index 2070fd4d0..1ed6ed0ca 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,10 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder -TARGETS = darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le windows/amd64 +# Helm CLI platforms +TARGETS = darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 +# Tiller docker image platforms +ALL_ARCH = amd64 arm arm64 ppc64le s390x DIST_DIRS = find * -type d -exec APP = helm @@ -16,10 +19,34 @@ LDFLAGS := GOFLAGS := BINDIR := $(CURDIR)/bin BINARIES := helm tiller +ARCH ?= amd64 +QEMUVERSION=v2.7.0 # Required for globs to work correctly SHELL=/bin/bash +ifeq ($(ARCH),amd64) + BASEIMAGE?=alpine:3.6 +endif +ifeq ($(ARCH),arm) + BASEIMAGE?=arm32v6/alpine:3.6 + QEMUARCH=arm +endif +ifeq ($(ARCH),arm64) + BASEIMAGE?=arm64v8/alpine:3.6 + QEMUARCH=aarch64 +endif +ifeq ($(ARCH),ppc64le) + BASEIMAGE?=ppc64le/alpine:3.6 + QEMUARCH=ppc64le +endif +ifeq ($(ARCH),s390x) + BASEIMAGE?=s390x/alpine:3.6 + QEMUARCH=s390x +endif + +include versioning.mk + .PHONY: all all: build @@ -57,28 +84,41 @@ check-docker: fi .PHONY: docker-binary -docker-binary: BINDIR = ./rootfs -docker-binary: GOFLAGS += -a -installsuffix cgo -docker-binary: - GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO) build -o $(BINDIR)/tiller $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/tiller +docker-binary-%: BINDIR = ./rootfs +docker-binary-%: GOFLAGS += -a -installsuffix cgo +docker-binary-%: + docker run -it -v $(shell pwd)/$(BINDIR):/build -v $(shell pwd):/go/src/k8s.io/helm -e GOARCH=$(ARCH) golang:1.8 /bin/bash -c "\ + CGO_ENABLED=0 go build -o /build/$* $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/$*" + +docker-build-prepare-%: + cp rootfs/Dockerfile.$* rootfs/Dockerfile.$*.$(ARCH) + sed -i "s|QEMUARCH|$(QEMUARCH)|g" rootfs/Dockerfile.$*.$(ARCH) + sed -i "s|BASEIMAGE|$(BASEIMAGE)|g" rootfs/Dockerfile.$*.$(ARCH) +ifeq ($(ARCH),amd64) + # When building "normally", remove the whole line, it has no part in the image + sed -i "/CROSS_BUILD_/d" rootfs/Dockerfile.$*.$(ARCH) +else + sed -i "s/CROSS_BUILD_//g" rootfs/Dockerfile.$*.$(ARCH) + + # When cross-building, only the placeholder "CROSS_BUILD_" should be removed + # Register /usr/bin/qemu-ARCH-static as the handler for ARM binaries in the kernel + docker run --rm --privileged multiarch/qemu-user-static:register --reset + curl -sSL --retry 5 https://github.com/multiarch/qemu-user-static/releases/download/$(QEMUVERSION)/x86_64_qemu-$(QEMUARCH)-static.tar.gz | tar -xz -C rootfs +endif .PHONY: docker-build -docker-build: check-docker docker-binary - docker build --rm -t ${IMAGE} rootfs - docker tag ${IMAGE} ${MUTABLE_IMAGE} - -.PHONY: docker-binary-rudder -docker-binary-rudder: BINDIR = ./rootfs -docker-binary-rudder: GOFLAGS += -a -installsuffix cgo -docker-binary-rudder: - GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO) build -o $(BINDIR)/rudder $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/rudder +docker-build: check-docker docker-binary-tiller docker-build-prepare-tiller + docker build --rm -t $(IMAGE) -f rootfs/Dockerfile.tiller.$(ARCH) rootfs + docker tag $(IMAGE) $(MUTABLE_IMAGE) + rm rootfs/Dockerfile.tiller.$(ARCH) .PHONY: docker-build-experimental -docker-build-experimental: check-docker docker-binary docker-binary-rudder - docker build --rm -t ${IMAGE} rootfs -f rootfs/Dockerfile.experimental +docker-build-experimental: check-docker docker-binary-tiller docker-binary-rudder docker-build-prepare-experimental docker-build-prepare-rudder + docker build --rm -t ${IMAGE} -f rootfs/Dockerfile.experimental.$(ARCH) rootfs docker tag ${IMAGE} ${MUTABLE_IMAGE} - docker build --rm -t ${IMAGE_RUDDER} rootfs -f rootfs/Dockerfile.rudder + docker build --rm -t ${IMAGE_RUDDER} -f rootfs/Dockerfile.rudder.$(ARCH) rootfs docker tag ${IMAGE_RUDDER} ${MUTABLE_IMAGE_RUDDER} + rm rootfs/Dockerfile.experimental.$(ARCH) rootfs/Dockerfile.rudder.$(ARCH) .PHONY: test test: build @@ -141,4 +181,5 @@ endif go build -o bin/protoc-gen-go ./vendor/github.com/golang/protobuf/protoc-gen-go scripts/setup-apimachinery.sh -include versioning.mk +bootstrap-dockerized: + docker run -it -v $(shell pwd):/go/src/k8s.io/helm -w /go/src/k8s.io/helm gcr.io/google_containers/kube-cross:v1.8.3-1 /bin/bash -c "make bootstrap" diff --git a/rootfs/Dockerfile.experimental b/rootfs/Dockerfile.experimental index 990bcde51..9c639bf97 100644 --- a/rootfs/Dockerfile.experimental +++ b/rootfs/Dockerfile.experimental @@ -12,15 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.3 +FROM BASEIMAGE + +# If we're building for another architecture than amd64, the CROSS_BUILD_ placeholder is removed so e.g. CROSS_BUILD_COPY turns into COPY +# If we're building normally, for amd64, CROSS_BUILD lines are removed +CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/ RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* ENV HOME /tmp - COPY tiller /tiller - EXPOSE 44134 - CMD ["/tiller", "--experimental-release"] - diff --git a/rootfs/Dockerfile.rudder b/rootfs/Dockerfile.rudder index 6bb3a2d92..a34129eed 100644 --- a/rootfs/Dockerfile.rudder +++ b/rootfs/Dockerfile.rudder @@ -12,14 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.3 +FROM BASEIMAGE + +# If we're building for another architecture than amd64, the CROSS_BUILD_ placeholder is removed so e.g. CROSS_BUILD_COPY turns into COPY +# If we're building normally, for amd64, CROSS_BUILD lines are removed +CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/ RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* ENV HOME /tmp - COPY rudder /rudder - EXPOSE 10001 - CMD ["/rudder"] diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile.tiller similarity index 71% rename from rootfs/Dockerfile rename to rootfs/Dockerfile.tiller index 53757cd8d..30bf54df7 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile.tiller @@ -12,15 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.3 +FROM BASEIMAGE + +# If we're building for another architecture than amd64, the CROSS_BUILD_ placeholder is removed so e.g. CROSS_BUILD_COPY turns into COPY +# If we're building normally, for amd64, CROSS_BUILD lines are removed +CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/ RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* ENV HOME /tmp - -COPY tiller /tiller - +COPY tiller / EXPOSE 44134 - CMD ["/tiller"] - diff --git a/versioning.mk b/versioning.mk index 2333530d9..5c9e3b558 100644 --- a/versioning.mk +++ b/versioning.mk @@ -25,10 +25,10 @@ endif LDFLAGS += -X k8s.io/helm/pkg/version.GitCommit=${GIT_COMMIT} LDFLAGS += -X k8s.io/helm/pkg/version.GitTreeState=${GIT_DIRTY} -IMAGE := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}:${DOCKER_VERSION} -IMAGE_RUDDER := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}:${DOCKER_VERSION} -MUTABLE_IMAGE := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}:${MUTABLE_VERSION} -MUTABLE_IMAGE_RUDDER := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}:${DOCKER_VERSION} +IMAGE := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}-${ARCH}:${DOCKER_VERSION} +IMAGE_RUDDER := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}-${ARCH}:${DOCKER_VERSION} +MUTABLE_IMAGE := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}-${ARCH}:${MUTABLE_VERSION} +MUTABLE_IMAGE_RUDDER := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}-${ARCH}:${DOCKER_VERSION} DOCKER_PUSH = docker push ifeq ($(DOCKER_REGISTRY),gcr.io) @@ -46,12 +46,24 @@ info: @echo "Mutable Image: ${MUTABLE_IMAGE}" .PHONY: docker-push -docker-push: docker-mutable-push docker-immutable-push +docker-push: $(addprefix sub-docker-push-,$(ALL_ARCH)) +sub-docker-push-%: + $(MAKE) ARCH=$* docker-build + $(MAKE) ARCH=$* docker-mutable-push + $(MAKE) ARCH=$* docker-immutable-push .PHONY: docker-immutable-push docker-immutable-push: ${DOCKER_PUSH} ${IMAGE} +ifeq ($(ARCH),amd64) + docker tag ${IMAGE} ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}:${DOCKER_VERSION} + docker push ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}:${DOCKER_VERSION} +endif .PHONY: docker-mutable-push docker-mutable-push: ${DOCKER_PUSH} ${MUTABLE_IMAGE} +ifeq ($(ARCH),amd64) + docker tag ${MUTABLE_IMAGE} ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}:${MUTABLE_VERSION} + docker push ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}:${MUTABLE_VERSION} +endif