From be0514c5c93a47c9ff9d83b6a1301a1fc0b06d3f Mon Sep 17 00:00:00 2001 From: Michael Fornaro Date: Fri, 29 May 2020 11:06:27 +1000 Subject: [PATCH] Adding support for multi-architecture images and binaries (#184) * Allow Dockerfile --build-args to override GOOS and GOARCH defaults Allow Dockerfile --build-args to override GOOS and GOARCH defaults Support building multi architecture binaries remove default OS and ARCH to avoid tag confusion when compiling image through Makefile Tag image with corrosponding OS and ARCH build variables updating Makefile Signed-off-by: Michael Fornaro <20387402+xUnholy@users.noreply.github.com> * remove duplicate import on windows_service.go Signed-off-by: Michael Fornaro <20387402+xUnholy@users.noreply.github.com> --- Dockerfile | 11 ++++----- Makefile | 36 ++++++++++++++++++++++-------- cmd/cloudflared/windows_service.go | 1 - 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index 97ef11e3..ca5716b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,11 @@ # use a builder image for building cloudflare +ARG TARGET_GOOS +ARG TARGET_GOARCH FROM golang:1.13.3 as builder -ENV GO111MODULE=on -ENV CGO_ENABLED=0 -ENV GOOS=linux +ENV GO111MODULE=on \ + CGO_ENABLED=0 \ + TARGET_GOOS=${TARGET_GOOS} \ + TARGET_GOARCH=${TARGET_GOARCH} WORKDIR /go/src/github.com/cloudflare/cloudflared/ @@ -12,8 +15,6 @@ COPY . . # compile cloudflared RUN make cloudflared -# --- - # use a distroless base image with glibc FROM gcr.io/distroless/base-debian10:nonroot diff --git a/Makefile b/Makefile index 7aef9225..12ec9209 100644 --- a/Makefile +++ b/Makefile @@ -7,17 +7,35 @@ PACKAGE_DIR := $(CURDIR)/packaging INSTALL_BINDIR := usr/local/bin EQUINOX_FLAGS = --version="$(VERSION)" \ - --platforms="$(EQUINOX_BUILD_PLATFORMS)" \ - --app="$(EQUINOX_APP_ID)" \ - --token="$(EQUINOX_TOKEN)" \ - --channel="$(EQUINOX_CHANNEL)" + --platforms="$(EQUINOX_BUILD_PLATFORMS)" \ + --app="$(EQUINOX_APP_ID)" \ + --token="$(EQUINOX_TOKEN)" \ + --channel="$(EQUINOX_CHANNEL)" ifeq ($(EQUINOX_IS_DRAFT), true) EQUINOX_FLAGS := --draft $(EQUINOX_FLAGS) endif -ifeq ($(GOARCH),) - GOARCH := amd64 +LOCAL_ARCH ?= $(shell uname -m) +ifeq ($(LOCAL_ARCH),x86_64) + TARGET_ARCH ?= amd64 +else ifeq ($(shell echo $(LOCAL_ARCH) | head -c 5),armv8) + TARGET_ARCH ?= arm64 +else ifeq ($(LOCAL_ARCH),aarch64) + TARGET_ARCH ?= arm64 +else ifeq ($(shell echo $(LOCAL_ARCH) | head -c 4),armv) + TARGET_ARCH ?= arm +else + $(error This system's architecture $(LOCAL_ARCH) isn't supported) +endif + +LOCAL_OS ?= $(shell go env GOOS) +ifeq ($(LOCAL_OS),linux) + TARGET_OS ?= linux +else ifeq ($(LOCAL_OS),darwin) + TARGET_OS ?= darwin +else + $(error This system's OS $(LOCAL_OS) isn't supported) endif .PHONY: all @@ -29,11 +47,11 @@ clean: .PHONY: cloudflared cloudflared: tunnel-deps - go build -v -mod=vendor $(VERSION_FLAGS) $(IMPORT_PATH)/cmd/cloudflared + GOOS=$(TARGET_OS) GOARCH=$(TARGET_ARCH) go build -v -mod=vendor $(VERSION_FLAGS) $(IMPORT_PATH)/cmd/cloudflared .PHONY: container container: - docker build -t cloudflare/cloudflared:"$(VERSION)" . + docker build --build-arg=TARGET_ARCH=$(TARGET_ARCH) --build-arg=TARGET_OS=$(TARGET_OS) -t cloudflare/cloudflared-$(TARGET_OS)-$(TARGET_ARCH):"$(VERSION)" . .PHONY: test test: vet @@ -48,7 +66,7 @@ cloudflared-deb: cloudflared mkdir -p $(PACKAGE_DIR) cp cloudflared $(PACKAGE_DIR)/cloudflared fakeroot fpm -C $(PACKAGE_DIR) -s dir -t deb --deb-compression bzip2 \ - -a $(GOARCH) -v $(VERSION) -n cloudflared cloudflared=/usr/local/bin/ + -a $(TARGET_ARCH) -v $(VERSION) -n cloudflared cloudflared=/usr/local/bin/ .PHONY: cloudflared-darwin-amd64.tgz cloudflared-darwin-amd64.tgz: cloudflared diff --git a/cmd/cloudflared/windows_service.go b/cmd/cloudflared/windows_service.go index 1cc34990..a78b4fdb 100644 --- a/cmd/cloudflared/windows_service.go +++ b/cmd/cloudflared/windows_service.go @@ -16,7 +16,6 @@ import ( "github.com/pkg/errors" cli "gopkg.in/urfave/cli.v2" - "github.com/pkg/errors" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" "golang.org/x/sys/windows/svc/eventlog"