Skip to content

Commit

Permalink
Add multiarch building support for arm64
Browse files Browse the repository at this point in the history
Signed-off-by: Bin Lu <bin.lu@arm.com>
  • Loading branch information
Bin Lu committed Mar 11, 2019
1 parent 367b6fc commit a184c1c
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 12 deletions.
101 changes: 92 additions & 9 deletions Makefile
Expand Up @@ -5,7 +5,11 @@ SHORT_NAME ?= tiller
SHORT_NAME_RUDDER ?= rudder
TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64
TARGET_OBJS ?= darwin-amd64.tar.gz darwin-amd64.tar.gz.sha256 linux-amd64.tar.gz linux-amd64.tar.gz.sha256 linux-386.tar.gz linux-386.tar.gz.sha256 linux-arm.tar.gz linux-arm.tar.gz.sha256 linux-arm64.tar.gz linux-arm64.tar.gz.sha256 linux-ppc64le.tar.gz linux-ppc64le.tar.gz.sha256 linux-s390x.tar.gz linux-s390x.tar.gz.sha256 windows-amd64.zip windows-amd64.zip.sha256
ARCH ?= amd64
DOCKER_ARCH_TARGETS ?= amd64 arm arm64 ppc64le s390x
DIST_DIRS = find * -type d -exec
QEMUVERSION ?= v2.9.1
DOCKERFILE ?= Dockerfile

# go option
GO ?= go
Expand All @@ -21,6 +25,26 @@ BINARIES := helm tiller
# Required for globs to work correctly
SHELL=/usr/bin/env bash

ifeq ($(ARCH),amd64)
BASEIMAGE?=alpine:3.7
endif
ifeq ($(ARCH),arm)
BASEIMAGE?=arm32v6/alpine:3.7
QEMUARCH=arm
endif
ifeq ($(ARCH),arm64)
BASEIMAGE?=arm64v8/alpine:3.7
QEMUARCH=aarch64
endif
ifeq ($(ARCH),ppc64le)
BASEIMAGE?=ppc64le/alpine:3.7
QEMUARCH=ppc64le
endif
ifeq ($(ARCH),s390x)
BASEIMAGE?=s390x/alpine:3.7
QEMUARCH=s390x
endif

.PHONY: all
all: build

Expand Down Expand Up @@ -77,26 +101,85 @@ check-docker:
docker-binary: BINDIR = ./rootfs
docker-binary: GOFLAGS += -a -installsuffix cgo
docker-binary:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO) build -o $(BINDIR)/helm $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/helm
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO) build -o $(BINDIR)/tiller $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/tiller
GOOS=linux GOARCH=$(ARCH) CGO_ENABLED=0 $(GO) build -o $(BINDIR)/helm $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/helm
GOOS=linux GOARCH=$(ARCH) CGO_ENABLED=0 $(GO) build -o $(BINDIR)/tiller $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/tiller

.PHONY: docker-pre-build
docker-pre-build: BINDIR = ./rootfs
docker-pre-build: check-docker
cat $(BINDIR)/$(DOCKERFILE) \
| sed "s|BASEIMAGE|$(BASEIMAGE)|g" \
| sed "s|QEMUARCH|$(QEMUARCH)|g" \
> $(BINDIR)/$(DOCKERFILE).build

ifeq ($(ARCH),amd64)
# When building "normally" for amd64, remove the whole line, it has no part in the amd64 image
sed "/CROSS_BUILD_/d" $(BINDIR)/$(DOCKERFILE).build > $(BINDIR)/$(DOCKERFILE).build.tmp
else
# When cross-building, only the placeholder "CROSS_BUILD_" should be removed
# Register /usr/bin/qemu-ARCH-static as the handler for non-x86 binaries in the kernel
docker run --rm --privileged multiarch/qemu-user-static:register --reset
curl -sSL https://github.com/multiarch/qemu-user-static/releases/download/$(QEMUVERSION)/x86_64_qemu-$(QEMUARCH)-static.tar.gz | tar -xz -C $(BINDIR)
# Ensure we don't get surprised by umask settings
chmod 0755 $(BINDIR)/qemu-$(QEMUARCH)-static
sed "s/CROSS_BUILD_//g" $(BINDIR)/$(DOCKERFILE).build > $(BINDIR)/$(DOCKERFILE).build.tmp
endif

.PHONY: docker-build
docker-build: check-docker docker-binary
docker build --rm -t ${IMAGE} rootfs
docker-build: BINDIR = ./rootfs
docker-build: DOCKERFILE = Dockerfile
docker-build: check-docker docker-binary docker-pre-build
ifeq ($(ARCH),amd64)
docker build --rm -t ${IMAGE} -f $(BINDIR)/$(DOCKERFILE).build.tmp $(BINDIR)
docker tag ${IMAGE} ${MUTABLE_IMAGE}
endif
docker build --rm -t ${IMAGE_ARCH} -f $(BINDIR)/$(DOCKERFILE).build.tmp $(BINDIR)
docker tag ${IMAGE_ARCH} ${MUTABLE_IMAGE_ARCH}

.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
GOOS=linux GOARCH=$(ARCH) CGO_ENABLED=0 $(GO) build -o $(BINDIR)/rudder $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/rudder

.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: BINDIR = ./rootfs
docker-build-experimental: DOCKERFILE = Dockerfile.experimental
docker-build-experimental: check-docker docker-binary docker-pre-build
ifeq ($(ARCH),amd64)
docker build --rm -t ${IMAGE} -f $(BINDIR)/$(DOCKERFILE).build.tmp $(BINDIR)
docker tag ${IMAGE} ${MUTABLE_IMAGE}
docker build --rm -t ${IMAGE_RUDDER} rootfs -f rootfs/Dockerfile.rudder
endif
docker build --rm -t ${IMAGE_ARCH} -f $(BINDIR)/$(DOCKERFILE).build.tmp $(BINDIR)
docker tag ${IMAGE_ARCH} ${MUTABLE_IMAGE_ARCH}

.PHONY: docker-build-rudder
docker-build-rudder: BINDIR = ./rootfs
docker-build-rudder: DOCKERFILE = Dockerfile.rudder
docker-build-rudder: check-docker docker-binary-rudder docker-pre-build
ifeq ($(ARCH),amd64)
docker build --rm -t ${IMAGE_RUDDER} -f $(BINDIR)/$(DOCKERFILE).build.tmp $(BINDIR)
docker tag ${IMAGE_RUDDER} ${MUTABLE_IMAGE_RUDDER}
endif
docker build --rm -t ${IMAGE_RUDDER_ARCH} -f $(BINDIR)/$(DOCKERFILE).build.tmp $(BINDIR)
docker tag ${IMAGE_RUDDER_ARCH} ${MUTABLE_IMAGE_RUDDER_ARCH}

# Building multi-arch docker images
.PHONY: docker-build-all
docker-build-all:
for arch in $(DOCKER_ARCH_TARGETS); do \
$(MAKE) docker-build ARCH=$$arch; \
$(MAKE) clean; \
done

.PHONY: docker-build-experimental-all
docker-build-experimental-all:
for arch in $(DOCKER_ARCH_TARGETS); do \
$(MAKE) docker-build-experimental ARCH=$$arch; \
$(MAKE) clean; \
$(MAKE) docker-build-rudder ARCH=$$arch; \
$(MAKE) clean; \
done

.PHONY: test
test: build
Expand Down Expand Up @@ -151,7 +234,7 @@ verify-docs: build

.PHONY: clean
clean:
@rm -rf $(BINDIR) ./rootfs/tiller ./_dist
@rm -rf $(BINDIR) ./rootfs/tiller ./rootfs/helm ./rootfs/rudder ./rootfs/Dockerfile*build* ./rootfs/qemu-*-static ./_dist

.PHONY: coverage
coverage:
Expand Down
6 changes: 5 additions & 1 deletion rootfs/Dockerfile
Expand Up @@ -12,7 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.

FROM alpine:3.7
FROM BASEIMAGE

CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/

RUN apk update && apk add ca-certificates socat && rm -rf /var/cache/apk/*

Expand All @@ -21,6 +23,8 @@ ENV HOME /tmp
COPY helm /helm
COPY tiller /tiller

RUN rm /usr/bin/qemu-*-static -f

EXPOSE 44134
USER 65534
ENTRYPOINT ["/tiller"]
Expand Down
6 changes: 5 additions & 1 deletion rootfs/Dockerfile.experimental
Expand Up @@ -12,14 +12,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.

FROM alpine:3.7
FROM BASEIMAGE

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

RUN rm /usr/bin/qemu-*-static -f

EXPOSE 44134
USER 65534
ENTRYPOINT ["/tiller", "--experimental-release"]
Expand Down
6 changes: 5 additions & 1 deletion rootfs/Dockerfile.rudder
Expand Up @@ -12,14 +12,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.

FROM alpine:3.3
FROM BASEIMAGE

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

RUN rm /usr/bin/qemu-*-static -f

EXPOSE 10001

CMD ["/rudder"]
6 changes: 6 additions & 0 deletions versioning.mk
Expand Up @@ -12,6 +12,7 @@ endif

DOCKER_VERSION ?= git-${GIT_SHA}
BINARY_VERSION ?= ${GIT_TAG}
ARCH ?= amd64

# Only set Version if building a tag or VERSION is set
ifneq ($(BINARY_VERSION),)
Expand All @@ -30,6 +31,11 @@ IMAGE_RUDDER := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}:
MUTABLE_IMAGE := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}:${MUTABLE_VERSION}
MUTABLE_IMAGE_RUDDER := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}:${MUTABLE_VERSION}

IMAGE_ARCH := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}-${ARCH}:${DOCKER_VERSION}
IMAGE_RUDDER_ARCH := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}-${ARCH}:${DOCKER_VERSION}
MUTABLE_IMAGE_ARCH := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME}-${ARCH}:${MUTABLE_VERSION}
MUTABLE_IMAGE_RUDDER_ARCH := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${SHORT_NAME_RUDDER}-${ARCH}:${MUTABLE_VERSION}

DOCKER_PUSH = docker push
ifeq ($(DOCKER_REGISTRY),gcr.io)
DOCKER_PUSH = gcloud docker push
Expand Down

0 comments on commit a184c1c

Please sign in to comment.