mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-12-25 06:02:44 +00:00
During development I tend to do: make -C pkg/foo tag HASH=dev ORG=ijc and I expect to get an image `ijc/foo:dev` and not `ijc/foo:dev-amd64`. In general I think if the HASH has been explicitly provided the build should just honour that. To compensate and avoid mistaken pushes adjust the check for dirtiness to also insist on a non-empty suffix. Signed-off-by: Ian Campbell <ijc@docker.com>
124 lines
3.1 KiB
Makefile
124 lines
3.1 KiB
Makefile
.PHONY: image tag forcetag show-tag check-dirty push forcepush
|
|
default: push
|
|
|
|
ORG?=linuxkit
|
|
SOURCE ?= .
|
|
|
|
ARCH := $(shell uname -m)
|
|
|
|
# Hash is of $(CURDIR) not $(CURDIR)$(SOURCE) to allow autogenerated
|
|
# source subdirectories (which would not be covered by ls-tree, but
|
|
# the code which autogenerates should be in $(CURDIR) so that is what
|
|
# we want to use.
|
|
ifeq ($(HASH),)
|
|
HASH_COMMIT?=HEAD # Setting this is only really useful with the show-tag target
|
|
HASH?=$(shell git ls-tree --full-tree $(HASH_COMMIT) -- $(CURDIR) | awk '{print $$3}')
|
|
|
|
ifneq ($(HASH_COMMIT),HEAD) # Others can't be dirty by definition
|
|
DIRTY:=$(shell git update-index -q --refresh && git diff-index --quiet HEAD -- $(CURDIR) || echo "-dirty")
|
|
endif
|
|
|
|
ifeq ($(ARCH), x86_64)
|
|
SUFFIX=-amd64
|
|
endif
|
|
ifeq ($(ARCH), aarch64)
|
|
SUFFIX=-arm64
|
|
endif
|
|
|
|
endif
|
|
|
|
# Makefiles can specify specific architectures they compile for. Default: all
|
|
ifeq ($(ARCHES),)
|
|
ARCHES:=x86_64 aarch64
|
|
endif
|
|
|
|
ifneq ($(filter $(ARCH),$(ARCHES)),)
|
|
REAL:=-y
|
|
else
|
|
REAL:=-n
|
|
endif
|
|
|
|
TAG:=$(ORG)/$(IMAGE):$(HASH)$(DIRTY)
|
|
|
|
REPO?=https://github.com/linuxkit/linuxkit
|
|
ifneq ($(REPO),)
|
|
REPO_LABEL=--label org.opencontainers.image.source=$(REPO)
|
|
endif
|
|
ifeq ($(DIRTY),)
|
|
REPO_COMMIT=$(shell git rev-parse HEAD)
|
|
COMMIT_LABEL=--label org.opencontainers.image.revision=$(REPO_COMMIT)
|
|
endif
|
|
LABELS=$(REPO_LABEL) $(COMMIT_LABEL)
|
|
|
|
BASE_DEPS=Dockerfile Makefile
|
|
|
|
# Get a release tag, if present
|
|
RELEASE:=$(shell git tag -l --points-at HEAD)
|
|
|
|
# Path to push-manifest.sh
|
|
PUSH_MANIFEST:=$(shell git rev-parse --show-toplevel)/scripts/push-manifest.sh
|
|
|
|
ifdef NETWORK
|
|
NET_OPT=
|
|
else
|
|
NET_OPT=--network=none
|
|
endif
|
|
|
|
ifeq ($(DOCKER_CONTENT_TRUST),)
|
|
ifndef NOTRUST
|
|
export DOCKER_CONTENT_TRUST=1
|
|
endif
|
|
endif
|
|
|
|
tag: tag$(REAL)
|
|
forcetag: forcetag$(REAL)
|
|
push: push$(REAL)
|
|
forcepush: forcepush$(REAL)
|
|
|
|
show-tag:
|
|
@echo $(TAG)
|
|
|
|
tag-y: $(BASE_DEPS) $(DEPS)
|
|
docker pull $(TAG)$(SUFFIX) || \
|
|
docker build $(LABELS) $(NET_OPT) -t $(TAG)$(SUFFIX) $(SOURCE)
|
|
|
|
forcetag-y: $(BASE_DEPS) $(DEPS)
|
|
docker build $(LABELS) $(NET_OPT) -t $(TAG)$(SUFFIX) $(SOURCE)
|
|
|
|
check-dirty:
|
|
ifneq ($(DIRTY),)
|
|
$(error Your repository is not clean. Will not push package image)
|
|
endif
|
|
ifeq ($(SUFFIX),)
|
|
$(error Refusing to push without a SUFFIX)
|
|
endif
|
|
|
|
push-y: tag-y check-dirty
|
|
docker pull $(TAG)$(SUFFIX) || \
|
|
(docker push $(TAG)$(SUFFIX) && \
|
|
$(PUSH_MANIFEST) $(TAG) $(DOCKER_CONTENT_TRUST))
|
|
ifneq ($(RELEASE),)
|
|
docker tag $(TAG)$(SUFFIX) $(ORG)/$(IMAGE):$(RELEASE)$(SUFFIX)
|
|
docker push $(ORG)/$(IMAGE):$(RELEASE)$(SUFFIX)
|
|
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(RELEASE) $(DOCKER_CONTENT_TRUST)
|
|
endif
|
|
|
|
forcepush-y: forcetag-y check-dirty
|
|
docker push $(TAG)$(SUFFIX)
|
|
$(PUSH_MANIFEST) $(TAG) $(DOCKER_CONTENT_TRUST)
|
|
ifneq ($(RELEASE),)
|
|
docker tag $(TAG)$(SUFFIX) $(ORG)/$(IMAGE):$(RELEASE)
|
|
docker push $(ORG)/$(IMAGE):$(RELEASE)$(SUFFIX)
|
|
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(RELEASE) $(DOCKER_CONTENT_TRUST)
|
|
endif
|
|
|
|
# If not supported for an arch, print a message
|
|
tag-n:
|
|
$(info This package does not work on $(ARCH). Ignored)
|
|
forcetag-n:
|
|
$(info This package does not work on $(ARCH). Ignored)
|
|
push-n:
|
|
$(info This package does not work on $(ARCH). Ignored)
|
|
forcepush-n:
|
|
$(info This package does not work on $(ARCH). Ignored)
|