Integrate contiv/vpp CNI into IEC
[iec.git] / src / foundation / api / Makefile
1 # build image for apiserver
2
3 # This image is built from files in this directory and pushed to
4 # a docker registry that is accesseble on each node.
5 #
6 #
7
8 # For a user created registry, the registry must be setup ahead of time.
9 # This Makefile supports both amd64 and arm64
10
11 EMPTY :=
12 SPACE := $(EMPTY) $(EMPTY)
13 COMMA := $(EMPTY),$(EMPTY)
14
15 DOCKER ?= docker
16 LINUX_ARCH := amd64 arm64
17 ARCHES = amd64 arm64
18 DOCKERFILE :=
19 REGISTRY ?= iecedge
20 PLATFORMS := $(subst $(SPACE),$(COMMA),$(foreach arch,$(LINUX_ARCH),linux/$(arch)))
21
22 # SECRET is used when pushing the manifest. docker-credential-gcr may not be
23 # available locally (except in Jenkins) so delay the evaluation unless the secret
24 # is needed.
25 SECRET = $(shell echo "https://gcr.io" | docker-credential-gcr get | jq '.Secret')
26
27 BUILD_ARCH ?= $(shell [ $$(uname -m) = "aarch64" ] && echo "arm64" || echo "amd64")
28 IMAGE_BASE ?= $(REGISTRY)/iec-apiserver-base-$(BUILD_ARCH)
29
30 TAG ?= latest
31 GIT_VERSION ?= $(shell git describe --always --dirty --tags)
32 IMAGE_VERSION ?= $(GIT_VERSION)
33 IMAGE_TAG := $(shell echo $(IMAGE_VERSION) | cut -d. -f1,2)
34 IMAGE_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD | tr -d '/')
35
36 #Currently, we choose golang-alpine based image as the default image base due to its 
37 #small size
38 base:
39         @IMAGE_NAME="$(REGISTRY)/iec-apiserver-base"; \
40         docker build -t $$IMAGE_NAME-$(BUILD_ARCH) \
41                     -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION) \
42                     -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG) \
43                     -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH) \
44                     -f docker/Dockerfile.base \
45                       .
46
47 #Use native golang based image as the base of apiserver, the reason to keep it here
48 #is that it is easier to extend if we need to add extra functions into it.
49 #It's kept here as a backup.
50 base-golang:
51         @IMAGE_NAME="$(REGISTRY)/iec-apiserver-base"; \
52         docker build -t $$IMAGE_NAME-$(BUILD_ARCH)-golang \
53                     -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_VERSION) \
54                     -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_TAG) \
55                     -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_BRANCH) \
56                     -f docker/Dockerfile.base.golang \
57                     .
58
59 .PHONY: apiserver
60 apiserver:
61         @IMAGE_NAME="$(REGISTRY)/iec-apiserver"; \
62         docker build -t $$IMAGE_NAME-$(BUILD_ARCH) \
63                     -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION) \
64                     -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG) \
65                     -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH) \
66                     --build-arg IMAGEBASE="${IMAGE_BASE}" \
67                     -f docker/Dockerfile \
68                        .
69
70 #Use golang image as the base, but only used as a backup now
71 .PHONY: apiserver-golang
72 apiserver-golang:
73         @IMAGE_NAME="$(REGISTRY)/iec-apiserver"; \
74         docker build -t $$IMAGE_NAME-$(BUILD_ARCH)-golang \
75                     -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_VERSION) \
76                     -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_TAG) \
77                     -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_BRANCH) \
78                     --build-arg IMAGEBASE="${IMAGE_BASE}"-golang \
79                     -f docker/Dockerfile.golang \
80                        .
81
82
83 all: base apiserver
84
85 #Before push images or push fat-manifest, please use 'docker login -u your_repo_account' to login to dockerhub first
86 #For docker login, it may need to install package 'jq', like "sudo apt-get install -y jq" for Debian based system
87
88 push_images:
89         @IMAGE_NAME="$(REGISTRY)/iec-apiserver-base"; \
90         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION); \
91         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG); \
92         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH); \
93         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(TAG)
94
95         @IMAGE_NAME="$(REGISTRY)/iec-apiserver"; \
96         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION); \
97         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG); \
98         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH); \
99         docker push $$IMAGE_NAME-$(BUILD_ARCH):$(TAG);
100
101 .PHONY: pre_manifest
102 pre_manifest:
103         if [ ! -f "./manifest-tool" ]; then \
104                 wget https://github.com/estesp/manifest-tool/releases/download/v0.9.0/manifest-tool-linux-$(BUILD_ARCH) \
105                 -O manifest-tool && \
106                 chmod +x ./manifest-tool; \
107         fi
108
109 .push_manifest: pre_manifest
110         ./manifest-tool push from-args --platforms $(PLATFORMS) --template $(REGISTRY)/$(TARGET)-ARCH:$(VERSION) --target $(REGISTRY)/$(TARGET):$(VERSION)
111
112
113 #Note: Currently, just multi-arch the latest version of the images to avoid the possible version 
114 #mismatch between amd64 and arm64 in docker hub. In case we need them, we can just remove the comment tags below
115 #Just multi-arch the iec-apiserver image currently
116
117 multi_arch:
118         #$(MAKE) .push_manifest VERSION=$(TAG) TARGET="iec-apiserver-base"
119         $(MAKE) .push_manifest VERSION=$(TAG) TARGET="iec-apiserver"
120
121 push: pre_manifest push_images multi_arch
122         #$(MAKE) .push_manifest VERSION=$(IMAGE_VERSION) TARGET="iec-apiserver-base"
123         #$(MAKE) .push_manifest VERSION=$(IMAGE_TAG) TARGET="iec-apiserver-base"
124         #$(MAKE) .push_manifest VERSION=$(IMAGE_VERSION) TARGET="iec-apiserver"
125         #$(MAKE) .push_manifest VERSION=$(IMAGE_TAG) TARGET="iec-apiserver"
126
127 #For cleaning images, it seems more stable when we remove it by their names, not just by their ids.
128 clean_image:
129         #$(DOCKER) rmi -f `$(DOCKER) images $(REGISTRY)/$(TARGET) -a -q` || true
130         $(DOCKER) rmi -f $(REGISTRY)/$(TARGET):$(VERSION) || true
131
132 #Normally, we don't remove the base image to keep a stable Revel version for use
133 clean:
134         docker rmi $(docker images --filter "dangling=true" -q --no-trunc) || true
135         #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(IMAGE_VERSION)
136         #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(IMAGE_TAG)
137         #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(IMAGE_BRANCH)
138         #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(TAG)
139
140         $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(IMAGE_VERSION)
141         $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(IMAGE_TAG)
142         $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(IMAGE_BRANCH)
143         $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(TAG)