Build a manifest list

Retool some of the build/test to produce a manifest-list rather than a
single image.
This commit is contained in:
Tim Hockin 2018-11-09 14:16:13 -08:00
parent 76bda81e0f
commit ada75e9c6c
4 changed files with 97 additions and 81 deletions

View File

@ -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 <thockin@google.com>
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}"]

107
Makefile
View File

@ -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,63 +79,69 @@ 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)/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)
@ -141,8 +152,8 @@ test: build-dirs
-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)/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) \
@ -152,8 +163,8 @@ test: build-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

View File

@ -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" \

View File

@ -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) \
"$@"
}