porthole/Makefile
Phil Sphicas f165082caf Pass extra build args to Docker image builds
This change updates the generic container image build Makefile to allow
the passing of extra build args to the container build Dockerfiles. For
example, to build the calicoctl-utility container with an alternative
version of calicoctl:

make build EXTRA_BUILD_ARGS='--build-arg CALICOCTL_VERSION=v3.8.1' ...

Change-Id: I2af072d72fd60389a9080ce18cdc38860bcb30b3
2019-10-28 12:56:28 -07:00

181 lines
5.8 KiB
Makefile

# Copyright 2019 AT&T Intellectual Property. All other rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# It's necessary to set this because some environments don't link sh -> bash.
SHELL := /bin/bash
# APP INFO
DOCKER_REGISTRY ?= quay.io
IMAGE_PREFIX ?= airshipit
IMAGE_NAME ?= $@
IMAGE_TAG ?= latest
BUILD_DIR := $(shell mktemp -d)
HELM ?= $(BUILD_DIR)/helm
CHARTS := $(patsubst charts/%/.,%,$(wildcard charts/*/.))
IMAGES := $(addprefix porthole-,$(patsubst images/%/.,%,$(wildcard images/*/.)))
PROXY ?= http://proxy.foo.com:8000
NO_PROXY ?= localhost,127.0.0.1,.svc.cluster.local
USE_PROXY ?= false
PUSH_IMAGE ?= false
# use this variable for image labels added in internal build process
LABEL ?= org.airshipit.build=community
COMMIT ?= $(shell git rev-parse HEAD)
DISTRO_SUFFIX ?= $(DISTRO)
IMAGE = $(DOCKER_REGISTRY)/$(IMAGE_PREFIX)/$(IMAGE_NAME):$(IMAGE_TAG)$(IMAGE_TAG_SUFFIX)
BASE_IMAGE ?=
# TODO(roman_g): DISTRO_SUFFIX should be autogenerated
# from Dockerfile extensions, see $(suffix ) Makefile function
ifeq "$(DISTRO_SUFFIX)" ""
# We expect that container is named 'porthole-xxxxx', and
# subdirectory is named 'xxxxx'; so we cut 'porthole-' from
# directory names here below and in next statement
DOCKERFILE = images/$(subst porthole-,,$(IMAGE_NAME))/Dockerfile
else
DOCKERFILE = images/$(subst porthole-,,$(IMAGE_NAME))/Dockerfile.$(DISTRO_SUFFIX)
IMAGE_TAG_SUFFIX = -$(DISTRO_SUFFIX)
endif
# VERSION INFO
GIT_COMMIT = $(COMMIT)
GIT_SHA = $(shell git rev-parse --short HEAD)
GIT_TAG = $(shell git describe --tags --abbrev=0 --exact-match 2>/dev/null)
GIT_DIRTY = $(shell test -n "$$(git status --porcelain)" && echo "dirty" || echo "clean")
HELM_PIDFILE ?= $(abspath ./.helm-pid)
ifdef VERSION
DOCKER_VERSION = $(VERSION)
endif
info:
@echo "Version: $(VERSION)"
@echo "Git Tag: $(GIT_TAG)"
@echo "Git Commit: $(GIT_COMMIT)"
@echo "Git Tree State: $(GIT_DIRTY)"
@echo "Docker Version: $(DOCKER_VERSION)"
@echo "Registry: $(DOCKER_REGISTRY)"
# TODO(roman_g): currently does not include images, but eventually it should
all: lint charts
@echo -e "\n---\nAnd what is there's nothing in there? You die, and " \
"there's nothing beyond that. Nothing. Nothing remains. Someone " \
"might remember you for a little while after but not for long.\n"
check-docker:
@if [ -z $$(which docker) ]; then \
echo "Missing \`docker\` client which is required for development"; \
exit 2; \
fi
dry-run: clean $(addprefix dry-run-,$(CHARTS))
dry-run-%: helm-lint-%
echo Running Dry-Run on chart $*
cd charts; $(HELM) template --set pod.resources.enabled=true $*
charts: $(CHARTS)
@echo "Done building charts."
$(CHARTS): $(addprefix dry-run-,$(CHARTS)) chartbanner
$(HELM) package -d charts charts/$@
chartbanner:
@echo "Building charts: $(CHARTS)"
lint: helm-lint
helm-lint: $(addprefix helm-lint-,$(CHARTS))
helm-lint-%: helm-init-%
@echo "Linting chart $*"
cd charts;$(HELM) lint $*
helm-init-%: helm-serve
@echo "Initializing chart $*"
cd charts;if [ -s $*/requirements.yaml ]; then echo "Initializing $*";$(HELM) dep up $*; fi
helm-serve: helm-install
./tools/helm_tk.sh $(HELM) $(HELM_PIDFILE)
# Install helm binary
helm-install:
./tools/helm_install.sh $(HELM)
dry-run:
docs:
@echo "Not implemented." >&2; exit 2
clean:
rm -rf build
rm -f charts/*.tgz
rm -f charts/*/requirements.lock
rm -rf charts/*/charts
run_images:
@echo "Not implemented." >&2; exit 2
run_$(IMAGE_NAME):
@echo "Not implemented." >&2; exit 2
tests:
@echo "Not implemented." >&2; exit 2
format:
@echo "Not implemented." >&2; exit 2
images: $(IMAGES)
@echo "Done building images."
$(IMAGES):
@echo
@echo "===== Processing [$@] image ====="
@make build IMAGE_NAME=$(IMAGE_NAME) DOCKERFILE=$(DOCKERFILE)
_BASE_IMAGE_ARG := $(if $(BASE_IMAGE),--build-arg FROM="${BASE_IMAGE}" ,)
build:
@echo "Building $(IMAGE_NAME)..."
ifeq ($(USE_PROXY), true)
docker build --network host -t $(IMAGE) --label $(LABEL) \
--label "org.opencontainers.image.revision=$(COMMIT)" \
--label "org.opencontainers.image.created=$(shell date --rfc-3339=seconds --utc)" \
--label "org.opencontainers.image.title=$(IMAGE_NAME)" \
-f $(DOCKERFILE) \
$(EXTRA_BUILD_ARGS) \
$(_BASE_IMAGE_ARG) \
--build-arg http_proxy=$(PROXY) \
--build-arg https_proxy=$(PROXY) \
--build-arg HTTP_PROXY=$(PROXY) \
--build-arg HTTPS_PROXY=$(PROXY) \
--build-arg no_proxy=$(NO_PROXY) \
--build-arg NO_PROXY=$(NO_PROXY) images/$(subst porthole-,,$(IMAGE_NAME))/
else
docker build --network host -t $(IMAGE) --label $(LABEL) \
--label "org.opencontainers.image.revision=$(COMMIT)" \
--label "org.opencontainers.image.created=$(shell date --rfc-3339=seconds --utc)" \
--label "org.opencontainers.image.title=$(IMAGE_NAME)" \
-f $(DOCKERFILE) \
$(EXTRA_BUILD_ARGS) \
$(_BASE_IMAGE_ARG) images/$(subst porthole-,,$(IMAGE_NAME))/
endif
ifeq ($(PUSH_IMAGE), true)
docker push $(IMAGE)
endif
.PHONY: $(CHARTS) $(IMAGES) all build chartbanner charts check-docker clean \
docs dry-run-% dry-run format helm-init-% helm-install helm-lint-% \
helm-lint helm-serve images info lint run_$(IMAGE_NAME) run_images \
tests