@@ -21,8 +21,11 @@ PKG := k8s.io/git-sync
2121# Where to push the docker image.
2222REGISTRY ?= staging-k8s.gcr.io
2323
24- # Which architecture to build - see $(ALL_ARCH) for options.
25- ARCH ?= amd64
24+ # Which platform to build - see $(ALL_PLATFORMS) for options.
25+ PLATFORM ?= linux/amd64
26+
27+ OS := $(firstword $(subst /, ,$(PLATFORM ) ) )
28+ ARCH := $(lastword $(subst /, ,$(PLATFORM ) ) )
2629
2730# This version-strategy uses git tags to set the version string
2831VERSION := $(shell git describe --tags --always --dirty)
@@ -36,27 +39,29 @@ VERSION := $(shell git describe --tags --always --dirty)
3639
3740SRC_DIRS := cmd pkg # directories which hold app source (not vendored)
3841
39- ALL_ARCH := amd64
42+ ALL_PLATFORMS := linux/ amd64
4043
41- # TODO: get a baseimage that works for other architectures
42- # arm arm64 ppc64le
44+ # TODO: get a baseimage that works for other platforms
45+ # linux/ arm linux/ arm64 linux/ ppc64le
4346
4447# Set default base image dynamically for each arch
45- ifeq ($(ARCH ) ,amd64)
46- BASEIMAGE? =alpine:3.7
47- endif
48- ifeq ($(ARCH ) ,arm)
49- BASEIMAGE? =armel/busybox
50- endif
51- ifeq ($(ARCH ) ,arm64)
52- BASEIMAGE? =aarch64/busybox
53- endif
54- ifeq ($(ARCH ) ,ppc64le)
55- BASEIMAGE? =ppc64le/busybox
48+ ifeq ($(PLATFORM ) ,linux/amd64)
49+ BASEIMAGE ?= alpine:3.8
50+ # endif
51+ # ifeq ($(PLATFORM),linux/arm)
52+ # BASEIMAGE ?= armel/busybox
53+ # endif
54+ # ifeq ($(PLATFORM),linux/arm64)
55+ # BASEIMAGE ?= aarch64/busybox
56+ # endif
57+ # ifeq ($(PLATFORM),linux/ppc64le)
58+ # BASEIMAGE ?= ppc64le/busybox
59+ else
60+ $(error Unsupported platform '$(PLATFORM)')
5661endif
5762
58- IMAGE := $(REGISTRY ) /$(BIN ) - $( ARCH )
59- LEGACY_IMAGE := $(REGISTRY ) / $( BIN )
63+ IMAGE := $(REGISTRY ) /$(BIN )
64+ TAG := $(VERSION ) __ $( OS ) _ $( ARCH )
6065
6166BUILD_IMAGE ?= golang:1.11-alpine
6267
@@ -74,86 +79,92 @@ container-%:
7479push-% :
7580 @$(MAKE ) --no-print-directory ARCH=$* push
7681
77- all-build : $(addprefix build-, $(ALL_ARCH ) )
82+ all-build : $(addprefix build-, $(ALL_PLATFORMS ) )
7883
79- all-container : $(addprefix container-, $(ALL_ARCH ) )
84+ all-container : $(addprefix container-, $(ALL_PLATFORMS ) )
8085
81- all-push : $(addprefix push-, $(ALL_ARCH ) )
86+ all-push : $(addprefix push-, $(ALL_PLATFORMS ) )
8287
83- build : bin/$(ARCH ) /$(BIN )
88+ build : bin/$(OS ) _ $( ARCH ) /$(BIN )
8489
85- bin/$(ARCH ) /$(BIN ) : build-dirs
90+ bin/$(OS ) _ $( ARCH ) /$(BIN ) : build-dirs
8691 @echo " building: $@ "
87- @docker run \
88- -i \
89- -u $$(id -u ) :$$(id -g ) \
90- -v $$(pwd ) /.go:/go \
91- -v $$(pwd ) :/go/src/$(PKG ) \
92- -v $$(pwd ) /bin/$(ARCH ) :/go/bin \
93- -v $$(pwd ) /bin/$(ARCH ) :/go/bin/linux_$(ARCH ) \
94- -v $$(pwd ) /.go/std/$(ARCH ) :/usr/local/go/pkg/linux_$(ARCH ) _static \
95- -v $$(pwd ) /.go/cache:/.cache \
96- -w /go/src/$(PKG ) \
97- --rm \
98- $(BUILD_IMAGE ) \
99- /bin/sh -c " \
100- ARCH=$(ARCH ) \
101- VERSION=$(VERSION ) \
102- PKG=$(PKG ) \
103- ./build/build.sh \
92+ @docker run \
93+ -i \
94+ -u $$(id -u ) :$$(id -g ) \
95+ -v $$(pwd ) /.go:/go \
96+ -v $$(pwd ) :/go/src/$(PKG ) \
97+ -v $$(pwd ) /bin/$(OS ) _$(ARCH ) :/go/bin \
98+ -v $$(pwd ) /bin/$(OS ) _$(ARCH ) :/go/bin/$(OS ) _$(ARCH ) \
99+ -v $$(pwd ) /.go/std/$(OS ) _$(ARCH ) :/usr/local/go/pkg/$(OS ) _$(ARCH ) _static \
100+ -v $$(pwd ) /.go/cache:/.cache \
101+ -w /go/src/$(PKG ) \
102+ --rm \
103+ $(BUILD_IMAGE ) \
104+ /bin/sh -c " \
105+ ARCH=$(ARCH ) \
106+ OS=$(OS ) \
107+ VERSION=$(VERSION ) \
108+ PKG=$(PKG ) \
109+ ./build/build.sh \
104110 "
105111
106- DOTFILE_IMAGE = $(subst /,_,$(IMAGE ) ) -$(VERSION )
112+ DOTFILE_IMAGE = $(subst /,_,$(IMAGE ) ) -$(TAG )
107113
108114container : .container-$(DOTFILE_IMAGE ) container-name
109- .container-$(DOTFILE_IMAGE ) : bin/$(ARCH ) /$(BIN ) Dockerfile.in
115+ .container-$(DOTFILE_IMAGE ) : bin/$(OS ) _ $( ARCH ) /$(BIN ) Dockerfile.in
110116 @sed \
111- -e ' s|ARG_BIN|$(BIN)|g' \
112- -e ' s|ARG_ARCH|$(ARCH)|g' \
113- -e ' s|ARG_FROM|$(BASEIMAGE)|g' \
114- Dockerfile.in > .dockerfile-$(ARCH )
115- @docker build -t $(IMAGE ) :$(VERSION ) -f .dockerfile-$(ARCH ) .
116- @docker images -q $(IMAGE ) :$(VERSION ) > $@
117- @if [ " $( ARCH) " = " amd64" ]; then \
118- docker tag $(IMAGE ) :$(VERSION ) $(LEGACY_IMAGE ) :$(VERSION ) ; \
119- fi
117+ -e ' s|{ARG_BIN}|$(BIN)|g' \
118+ -e ' s|{ARG_ARCH}|$(ARCH)|g' \
119+ -e ' s|{ARG_OS}|$(OS)|g' \
120+ -e ' s|{ARG_FROM}|$(BASEIMAGE)|g' \
121+ Dockerfile.in > .dockerfile-$(OS ) _$(ARCH )
122+ @docker build -t $(IMAGE ) :$(TAG ) -f .dockerfile-$(OS ) _$(ARCH ) .
123+ @docker images -q $(IMAGE ) :$(TAG ) > $@
120124
121125container-name :
122- @echo " container: $( IMAGE) :$( VERSION ) "
126+ @echo " container: $( IMAGE) :$( TAG ) "
123127
124128push : .push-$(DOTFILE_IMAGE ) push-name
125129.push-$(DOTFILE_IMAGE ) : .container-$(DOTFILE_IMAGE )
126- @gcloud docker -- push $(IMAGE ) :$(VERSION )
127- @docker images -q $(IMAGE ) :$(VERSION ) > $@
128- @if [ " $( ARCH) " = " amd64" ]; then \
129- gcloud docker -- push $(LEGACY_IMAGE ) :$(VERSION ) ; \
130- fi
130+ @docker push $(IMAGE ) :$(TAG )
131+ @docker images -q $(IMAGE ) :$(TAG ) > $@
131132
132133push-name :
133- @echo " pushed: $( IMAGE) :$( VERSION) "
134+ @echo " pushed: $( IMAGE) :$( TAG) "
135+
136+ # This depends on github.com/estesp/manifest-tool in $PATH.
137+ manifest-list : container
138+ manifest-tool \
139+ --username=oauth2accesstoken \
140+ --password=$$(gcloud auth print-access-token ) \
141+ push from-args \
142+ --platforms " $( ALL_PLATFORMS) " \
143+ --template $(REGISTRY ) /$(BIN ) :$(VERSION ) __OS_ARCH \
144+ --target $(REGISTRY ) /$(BIN ) :$(VERSION )
134145
135146version :
136147 @echo $(VERSION )
137148
138149test : build-dirs
139- @docker run \
140- -ti \
141- -u $$(id -u ) :$$(id -g ) \
142- -v $$(pwd ) /.go:/go \
143- -v $$(pwd ) :/go/src/$(PKG ) \
144- -v $$(pwd ) /bin/$(ARCH ) :/go/bin \
145- -v $$(pwd ) /.go/std/$(ARCH ) :/usr/local/go/pkg/linux_ $(ARCH ) _static \
146- -v $$(pwd ) /.go/cache:/.cache \
147- -w /go/src/$(PKG ) \
148- $(BUILD_IMAGE ) \
149- /bin/sh -c " \
150- ./build/test.sh $(SRC_DIRS ) \
150+ @docker run \
151+ -ti \
152+ -u $$(id -u ) :$$(id -g ) \
153+ -v $$(pwd ) /.go:/go \
154+ -v $$(pwd ) :/go/src/$(PKG ) \
155+ -v $$(pwd ) /bin/$(OS ) _ $( ARCH ) :/go/bin \
156+ -v $$(pwd ) /.go/std/$(OS ) _ $( ARCH ) :/usr/local/go/pkg/$( OS ) _ $(ARCH ) _static \
157+ -v $$(pwd ) /.go/cache:/.cache \
158+ -w /go/src/$(PKG ) \
159+ $(BUILD_IMAGE ) \
160+ /bin/sh -c " \
161+ ./build/test.sh $(SRC_DIRS ) \
151162 "
152163 @./test_e2e.sh
153164
154165build-dirs :
155- @mkdir -p bin/$(ARCH )
156- @mkdir -p .go/src/$(PKG ) .go/pkg .go/bin .go/std/$(ARCH ) .go/cache
166+ @mkdir -p bin/$(OS ) _ $( ARCH )
167+ @mkdir -p .go/src/$(PKG ) .go/pkg .go/bin .go/std/$(OS ) _ $( ARCH ) .go/cache
157168
158169clean : container-clean bin-clean
159170
0 commit comments