12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
+ ROOT_DIR_RELATIVE := .
16
+
17
+ include $(ROOT_DIR_RELATIVE ) /common.mk
18
+
15
19
# Image URL to use all building/pushing image targets
16
20
IMG ?= controller:latest
17
21
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
18
22
CRD_OPTIONS ?= "crd:crdVersions=v1"
23
+
24
+ # Directories.
25
+ REPO_ROOT := $(shell git rev-parse --show-toplevel)
26
+ ARTIFACTS ?= $(REPO_ROOT ) /_artifacts
19
27
TOOLS_DIR := hack/tools
20
- TOOLS_BIN_DIR := $(abspath $( TOOLS_DIR ) /bin)
28
+ TOOLS_BIN_DIR := $(TOOLS_DIR ) /bin
21
29
GO_INSTALL = ./scripts/go_install.sh
22
- GOLANGCI_LINT_VER := v1.31.0
23
- GOLANGCI_LINT_BIN := golangci-lint
24
- GOLANGCI_LINT := $(TOOLS_BIN_DIR ) /$(GOLANGCI_LINT_BIN ) -$(GOLANGCI_LINT_VER )
30
+
31
+ GOLANGCI_LINT := $(TOOLS_BIN_DIR ) /golangci-lint
32
+ KUSTOMIZE := $(TOOLS_BIN_DIR ) /kustomize
33
+ GOJQ := $(TOOLS_BIN_DIR ) /gojq
25
34
26
35
STAGING_REGISTRY ?= gcr.io/k8s-staging-capi-ibmcloud
36
+ PROD_REGISTRY := k8s.gcr.io/capi-ibmcloud
27
37
REGISTRY ?= $(STAGING_REGISTRY )
28
38
RELEASE_TAG ?= $(shell git describe --abbrev=0 2>/dev/null)
29
39
PULL_BASE_REF ?= $(RELEASE_TAG ) # PULL_BASE_REF will be provided by Prow
30
40
RELEASE_ALIAS_TAG ?= $(PULL_BASE_REF )
41
+ RELEASE_DIR := out
31
42
32
43
TAG ?= dev
33
44
ARCH ?= amd64
@@ -36,6 +47,11 @@ ALL_ARCH ?= amd64 ppc64le
36
47
# main controller
37
48
CORE_IMAGE_NAME ?= cluster-api-ibmcloud-controller
38
49
CORE_CONTROLLER_IMG ?= $(REGISTRY ) /$(CORE_IMAGE_NAME )
50
+ CORE_CONTROLLER_ORIGINAL_IMG := gcr.io/k8s-staging-capi-ibmcloud/cluster-api-ibmcloud-controller
51
+ CORE_CONTROLLER_NAME := controller-manager
52
+ CORE_MANIFEST_FILE := infrastructure-components
53
+ CORE_CONFIG_DIR := config/default
54
+ CORE_NAMESPACE := capi-ibmcloud-system
39
55
40
56
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
41
57
ifeq (,$(shell go env GOBIN) )
@@ -113,9 +129,6 @@ endif
113
129
lint : $(GOLANGCI_LINT ) # # Lint codebase
114
130
$(GOLANGCI_LINT ) run -v --fast=false
115
131
116
- $(GOLANGCI_LINT ) : # # Build golangci-lint from tools folder.
117
- GOBIN=$(TOOLS_BIN_DIR ) $(GO_INSTALL ) github.com/golangci/golangci-lint/cmd/golangci-lint $(GOLANGCI_LINT_BIN ) $(GOLANGCI_LINT_VER )
118
-
119
132
# # --------------------------------------
120
133
# # Docker
121
134
# # --------------------------------------
@@ -165,15 +178,126 @@ docker-push-manifest:
165
178
# # Release
166
179
# # --------------------------------------
167
180
168
- .PHONY : release-alias-tag
169
- release-alias-tag : # Adds the tag to the last build tag.
170
- gcloud container images add-tag -q $(CORE_CONTROLLER_IMG ) :$(TAG ) $(CORE_CONTROLLER_IMG ) :$(RELEASE_ALIAS_TAG )
181
+ $(RELEASE_DIR ) :
182
+ mkdir -p $@
183
+
184
+ $(ARTIFACTS ) :
185
+ mkdir -p $@
186
+
187
+ .PHONY : list-staging-releases
188
+ list-staging-releases : # # List staging images for image promotion
189
+ @echo $(CORE_IMAGE_NAME ) :
190
+ $(MAKE ) list-image RELEASE_TAG=$(RELEASE_TAG ) IMAGE=$(CORE_IMAGE_NAME )
191
+
192
+ list-image :
193
+ gcloud container images list-tags $(STAGING_REGISTRY ) /$(IMAGE ) --filter=" tags=('$( RELEASE_TAG) ')" --format=json
194
+
195
+ .PHONY : check-release-tag
196
+ check-release-tag :
197
+ @if [ -z " ${RELEASE_TAG} " ]; then echo " RELEASE_TAG is not set" ; exit 1; fi
198
+ @if ! [ -z " $$ (git status --porcelain)" ]; then echo " Your local git repository contains uncommitted changes, use git clean before proceeding." ; exit 1; fi
199
+
200
+ .PHONY : check-previous-release-tag
201
+ check-previous-release-tag :
202
+ @if [ -z " ${PREVIOUS_VERSION} " ]; then echo " PREVIOUS_VERSION is not set" ; exit 1; fi
203
+
204
+ .PHONY : check-github-token
205
+ check-github-token :
206
+ @if [ -z " ${GITHUB_TOKEN} " ]; then echo " GITHUB_TOKEN is not set" ; exit 1; fi
207
+
208
+ .PHONY : release
209
+ release : clean-release check-release-tag $(RELEASE_DIR ) # # Builds and push container images using the latest git tag for the commit.
210
+ git checkout " ${RELEASE_TAG} "
211
+ CORE_CONTROLLER_IMG=$(PROD_REGISTRY ) /$(CORE_IMAGE_NAME ) $(MAKE ) release-manifests
212
+ $(MAKE ) release-templates
213
+
214
+ .PHONY : release-manifests
215
+ release-manifests :
216
+ $(MAKE ) $(RELEASE_DIR ) /$(CORE_MANIFEST_FILE ) .yaml TAG=$(RELEASE_TAG )
217
+ # Add metadata to the release artifacts
218
+ cp metadata.yaml $(RELEASE_DIR ) /metadata.yaml
171
219
172
220
.PHONY : release-staging
173
- release-staging : # # Builds and push container images to the staging image registry .
221
+ release-staging : # # Builds and push container images and manifests to the staging bucket .
174
222
$(MAKE ) docker-build-all
175
223
$(MAKE ) docker-push-all
176
224
$(MAKE ) release-alias-tag
225
+ $(MAKE ) staging-manifests
226
+ $(MAKE ) release-templates
227
+ $(MAKE ) upload-staging-artifacts
228
+
229
+ .PHONY : staging-manifests
230
+ staging-manifests :
231
+ $(MAKE ) $(RELEASE_DIR ) /$(CORE_MANIFEST_FILE ) .yaml TAG=$(RELEASE_ALIAS_TAG )
232
+ cp metadata.yaml $(RELEASE_DIR ) /metadata.yaml
233
+
234
+ .PHONY : upload-staging-artifacts
235
+ upload-staging-artifacts : # # Upload release artifacts to the staging bucket
236
+ gsutil cp $(RELEASE_DIR ) /* gs://$(BUCKET ) /components/$(RELEASE_ALIAS_TAG )
237
+
238
+ .PHONY : release-alias-tag
239
+ release-alias-tag : # Adds the tag to the last build tag.
240
+ gcloud container images add-tag -q $(CORE_CONTROLLER_IMG ) :$(TAG ) $(CORE_CONTROLLER_IMG ) :$(RELEASE_ALIAS_TAG )
241
+
242
+ .PHONY : release-templates
243
+ release-templates : $(RELEASE_DIR ) # # Generate release templates
244
+ cp templates/cluster-template* .yaml $(RELEASE_DIR ) /
245
+
246
+ IMAGE_PATCH_DIR := $(ARTIFACTS ) /image-patch
247
+
248
+ $(IMAGE_PATCH_DIR ) : $(ARTIFACTS )
249
+ mkdir -p $@
250
+
251
+ .PHONY : $(RELEASE_DIR ) /$(CORE_MANIFEST_FILE ) .yaml
252
+ $(RELEASE_DIR ) /$(CORE_MANIFEST_FILE ) .yaml :
253
+ $(MAKE ) compiled-manifest \
254
+ PROVIDER=$(CORE_MANIFEST_FILE ) \
255
+ OLD_IMG=$(CORE_CONTROLLER_ORIGINAL_IMG ) \
256
+ MANIFEST_IMG=$(CORE_CONTROLLER_IMG ) \
257
+ CONTROLLER_NAME=$(CORE_CONTROLLER_NAME ) \
258
+ PROVIDER_CONFIG_DIR=$(CORE_CONFIG_DIR ) \
259
+ NAMESPACE=$(CORE_NAMESPACE ) \
260
+
261
+ .PHONY : compiled-manifest
262
+ compiled-manifest : $(RELEASE_DIR ) $(KUSTOMIZE )
263
+ $(MAKE ) image-patch-source-manifest
264
+ $(MAKE ) image-patch-kustomization
265
+ $(KUSTOMIZE ) build $(IMAGE_PATCH_DIR ) /$(PROVIDER ) > $(RELEASE_DIR ) /$(PROVIDER ) .yaml
266
+
267
+ .PHONY : image-patch-source-manifest
268
+ image-patch-source-manifest : $(IMAGE_PATCH_DIR ) $(KUSTOMIZE )
269
+ mkdir -p $(IMAGE_PATCH_DIR ) /$(PROVIDER )
270
+ $(KUSTOMIZE ) build $(PROVIDER_CONFIG_DIR ) > $(IMAGE_PATCH_DIR ) /$(PROVIDER ) /source-manifest.yaml
271
+
272
+ .PHONY : image-patch-kustomization
273
+ image-patch-kustomization : $(IMAGE_PATCH_DIR )
274
+ mkdir -p $(IMAGE_PATCH_DIR ) /$(PROVIDER )
275
+ $(MAKE ) image-patch-kustomization-without-webhook
276
+
277
+ .PHONY : image-patch-kustomization-without-webhook
278
+ image-patch-kustomization-without-webhook : $(IMAGE_PATCH_DIR ) $(GOJQ )
279
+ mkdir -p $(IMAGE_PATCH_DIR ) /$(PROVIDER )
280
+ $(GOJQ ) --yaml-input --yaml-output ' .images[0]={"name":"$(OLD_IMG)","newName":"$(MANIFEST_IMG)","newTag":"$(TAG)"}' \
281
+ " hack/image-patch/kustomization.yaml" > $(IMAGE_PATCH_DIR ) /$(PROVIDER ) /kustomization.yaml
282
+
283
+ # # --------------------------------------
284
+ # # Cleanup / Verification
285
+ # # --------------------------------------
286
+
287
+ .PHONY : clean
288
+ clean : # # Remove all generated files
289
+ $(MAKE ) -C hack/tools clean
290
+ $(MAKE ) clean-temporary
291
+
292
+ .PHONY : clean-temporary
293
+ clean-temporary : # # Remove all temporary files and folders
294
+ rm -f minikube.kubeconfig
295
+ rm -f kubeconfig
296
+ rm -rf _artifacts
297
+
298
+ .PHONY : clean-release
299
+ clean-release : # # Remove the release folder
300
+ rm -rf $(RELEASE_DIR )
177
301
178
302
.PHONY : verify
179
303
verify :
0 commit comments