-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathMakefile
More file actions
262 lines (215 loc) · 10.6 KB
/
Copy pathMakefile
File metadata and controls
262 lines (215 loc) · 10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# ====================================================================================
# Setup Project
BASE_NAME := hana
PROJECT_NAME := crossplane-provider-$(BASE_NAME)
PROJECT_REPO := github.com/SAP/$(PROJECT_NAME)
PLATFORMS ?= linux_amd64 linux_arm64
VERSION ?= $(shell git describe --tags --exact-match 2>/dev/null || echo "v0.0.0-$$(git rev-parse HEAD)")
$(info VERSION is $(VERSION))
GOLANGCILINT_VERSION ?= 2.10.1
-include build/makelib/common.mk
# Setup Output
-include build/makelib/output.mk
# Setup Go
NPROCS ?= 1
GO_TEST_PARALLEL := $(shell echo $$(( $(NPROCS) / 2 )))
GO_STATIC_PACKAGES = $(GO_PROJECT)/cmd/provider
GO_LDFLAGS += -X $(GO_PROJECT)/internal/version.Version=$(VERSION)
GO_SUBDIRS += cmd internal apis
GO111MODULE = on
-include build/makelib/golang.mk
# kind-related versions
KIND_VERSION ?= v0.30.0
KIND_NODE_IMAGE_TAG ?= v1.34.0
# up (UXP installer) versions — required by controlplane.mk at build submodule a0925d3
UP_VERSION = v0.31.0
UP_CHANNEL = stable
# Setup Kubernetes tools
-include build/makelib/k8s_tools.mk
# NOTE(hasheddan): we ensure up is installed prior to running platform-specific
# build steps in parallel to avoid encountering an installation race condition.
build.init: $(UP)
# Setup Images
#
# Migrated from the legacy two-image pattern (image.mk, IMAGES = $(BASE_NAME)
# $(BASE_NAME)-controller) to the single-image xpkg pattern (imagelight.mk +
# xpkg.mk). The package image now carries the provider runtime directly, which
# is required for Crossplane v2 (spec.controller.image was removed from the
# package API in crossplane#6487). Also fixes the missing io.crossplane.xpkg
# label, which `crossplane xpkg build` sets automatically.
#
# Reference: SAP/crossplane-provider-btp#626, SAP/crossplane-provider-cloudfoundry
IMAGES = provider-hana
-include build/makelib/imagelight.mk
# UUT_CONFIG and E2E_IMAGES are currently dead code: E2E_REUSE_CLUSTER is always
# set so xp-testing's InstallCrossplaneProvider is never called and these values
# are never consumed. Note: UUT_CONFIG is a runtime OCI image, not an xpkg
# artifact — if the full xp-testing install path is ever re-enabled, this would
# need to point at the output of `up xpkg build` instead.
export UUT_CONFIG = $(BUILD_REGISTRY)/provider-hana-$(ARCH):latest
export E2E_IMAGES = {"crossplane/provider-hana":"$(UUT_CONFIG)"}
# ====================================================================================
# Setup XPKG
XPKGS ?= provider-hana
XPKG_REG_ORGS ?= ghcr.io/sap/crossplane-provider-hana/crossplane
-include build/makelib/xpkg.mk
# NOTE(hasheddan): we force image building to happen prior to xpkg build so that
# we ensure image is present in daemon.
xpkg.build.provider-hana: do.build.images
# ====================================================================================
# Local e2e setup (mirrors SAP/crossplane-provider-cloudfoundry)
#
# Uses UXP (Universal Crossplane) installed via `up uxp install`, same as the
# CloudFoundry provider. The build submodule at a0925d3 provides controlplane.mk
# (UXP install) and local.xpkg.mk (sidecar xpkg cache) for this pattern.
# E2E_REUSE_CLUSTER / E2E_CLUSTER_NAME tell xp-testing to reuse the pre-deployed
# cluster so it skips provider installation entirely.
CROSSPLANE_NAMESPACE = upbound-system
KIND_CLUSTER_NAME ?= local-dev
# E2E_REUSE_CLUSTER is unconditionally exported so CI always reuses the cluster
# that local-deploy just created, skipping redundant provider installation.
# If local-deploy fails mid-way locally, reset with: make controlplane.down && make local-deploy
export E2E_REUSE_CLUSTER = $(KIND_CLUSTER_NAME)
export E2E_CLUSTER_NAME = $(KIND_CLUSTER_NAME)
-include build/makelib/local.xpkg.mk
-include build/makelib/controlplane.mk
.PHONY: local-deploy
local-deploy: build xpkg.build.provider-hana controlplane.up local.xpkg.deploy.provider.provider-hana
@$(INFO) waiting for provider-hana to become healthy
@$(foreach x,$(XPKGS),$(KUBECTL) wait provider.pkg $(x) --for condition=Healthy --timeout=5m;)
@$(KUBECTL) -n $(CROSSPLANE_NAMESPACE) wait --for=condition=Available deployment --all --timeout=5m
@$(OK) provider-hana is healthy
@# xp-testing puts the provider secret in crossplane-system; UXP installs into upbound-system so the namespace isn't created upstream.
@$(KUBECTL) get namespace crossplane-system >/dev/null 2>&1 || $(KUBECTL) create namespace crossplane-system
fallthrough: submodules
@echo Initial setup complete. Running make again . . .
@make
# run unit tests
test.run: $(GOJUNIT) $(GOCOVER_COBERTURA) go.test.unit
# e2e tests
e2e.run: test-e2e
test-e2e: local-deploy
@$(INFO) running e2e tests
@echo E2E_IMAGES=$$E2E_IMAGES
HANA_BINDINGS=$$HANA_BINDINGS go test $(PROJECT_REPO)/test/... -tags=e2e -test.v -count=1
@$(OK) e2e tests passed
# Update the submodules, such as the common build scripts.
submodules:
@git submodule sync
@git submodule update --init --recursive
# NOTE(hasheddan): the build submodule currently overrides XDG_CACHE_HOME in
# order to force the Helm 3 to use the .work/helm directory. This causes Go on
# Linux machines to use that directory as the build cache as well. We should
# adjust this behavior in the build submodule because it is also causing Linux
# users to duplicate their build cache, but for now we just make it easier to
# identify its location in CI so that we cache between builds.
go.cachedir:
@go env GOCACHE
# This is for running out-of-cluster locally, and is for convenience. Running
# this make target will print out the command which was used. For more control,
# try running the binary directly with different arguments.
run: go.build
@$(INFO) Running Crossplane locally out-of-cluster . . .
@# To see other arguments that can be provided, run the command with --help instead
$(GO_OUT_DIR)/provider --debug
# This is for running out-of-cluster locally for development.
# It installs Crossplane CRDs, Provider CRDs, ProviderConfig, creates Crossplane namespace.
# You need to start the controller manually, ideally in an IDE for debugging.
dev-debug: $(KIND) $(KUBECTL)
@$(INFO) Creating kind cluster
@$(KIND) create cluster --name=$(PROJECT_NAME)-dev
@$(KUBECTL) cluster-info --context kind-$(PROJECT_NAME)-dev
@$(INFO) Installing Crossplane CRDs
# @$(KUBECTL) apply -k https://github.com/crossplane/crossplane//cluster/crds?ref=main
@$(INFO) Installing Provider hana CRDs
@$(KUBECTL) apply -R -f package/crds
@$(INFO) Creating crossplane-system namespace
@$(KUBECTL) create ns crossplane-system
@$(INFO) Creating provider config and secret
@$(KUBECTL) apply -R -f examples/provider
# This is for running out-of-cluster locally for development.
# It installs Crossplane CRDs, Provider CRDs AND STARTS the controller.
# You need to apply ProviderConfig (along with secret) and the resources manually.
dev: $(KIND) $(KUBECTL)
@$(INFO) Creating kind cluster
@$(KIND) create cluster --name=$(PROJECT_NAME)-dev
@$(KUBECTL) cluster-info --context kind-$(PROJECT_NAME)-dev
@$(INFO) Installing Crossplane CRDs
# @$(KUBECTL) apply -k https://github.com/crossplane/crossplane//cluster?ref=main
@$(INFO) Installing Provider hana CRDs
@$(KUBECTL) apply -R -f package/crds
@$(INFO) Starting Provider hana controllers
@$(GO) run cmd/provider/main.go --debug
dev-clean: $(KIND) $(KUBECTL)
@$(INFO) Deleting kind cluster
@$(KIND) delete cluster --name=$(PROJECT_NAME)-dev
.PHONY: submodules fallthrough test-integration run dev dev-clean test-e2e test.run local-deploy
# ====================================================================================
# Special Targets
# Define tool versions (only if not already defined in golang.mk)
GOJUNIT_VERSION ?= v2.0.0
GOCOVER_COBERTURA_VERSION ?= aaee18c8195c3f2d90e5ef80ca918d265463842a
# Install gomplate
GOMPLATE_VERSION := 3.10.0
GOMPLATE := $(TOOLS_HOST_DIR)/gomplate-$(GOMPLATE_VERSION)
# Define custom tool installation targets that will only be used if the files don't exist
install-go-junit-report:
@$(INFO) installing go-junit-report
@mkdir -p $(TOOLS_HOST_DIR)
@GOBIN=$(TOOLS_HOST_DIR) go install github.com/jstemmer/go-junit-report/v2@$(GOJUNIT_VERSION) || $(FAIL)
@$(OK) installing go-junit-report
install-gocover-cobertura:
@$(INFO) installing gocover-cobertura
@mkdir -p $(TOOLS_HOST_DIR)
@GOBIN=$(TOOLS_HOST_DIR) go install github.com/t-yuki/gocover-cobertura@$(GOCOVER_COBERTURA_VERSION) || $(FAIL)
@$(OK) installing gocover-cobertura
# Check if tools exist and create dependencies if they don't
ifeq ($(wildcard $(GOJUNIT)),)
$(GOJUNIT): install-go-junit-report
endif
ifeq ($(wildcard $(GOCOVER_COBERTURA)),)
$(GOCOVER_COBERTURA): install-gocover-cobertura
endif
$(GOMPLATE):
@$(INFO) installing gomplate $(SAFEHOSTPLATFORM)
@mkdir -p $(TOOLS_HOST_DIR)
@curl -fsSLo $(GOMPLATE) https://github.com/hairyhenderson/gomplate/releases/download/v$(GOMPLATE_VERSION)/gomplate_$(SAFEHOSTPLATFORM) || $(FAIL)
@chmod +x $(GOMPLATE)
@$(OK) installing gomplate $(SAFEHOSTPLATFORM)
export GOMPLATE
export GOJUNIT
export GOCOVER_COBERTURA
# This target prepares repo for your provider by replacing all "hana"
# occurrences with your provider name.
# This target can only be run once, if you want to rerun for some reason,
# consider stashing/resetting your git state.
# Arguments:
# provider: Camel case name of your provider, e.g. GitHub, PlanetScale
provider.prepare:
@[ "${provider}" ] || ( echo "argument \"provider\" is not set"; exit 1 )
@PROVIDER=$(provider) ./hack/helpers/prepare.sh
# This target adds a new api type and its controller.
# You would still need to register new api in "apis/<provider>.go" and
# controller in "internal/controller/<provider>.go".
# Arguments:
# provider: Camel case name of your provider, e.g. GitHub, PlanetScale
# group: API group for the type you want to add.
# kind: Kind of the type you want to add
# apiversion: API version of the type you want to add. Optional and defaults to "v1alpha1"
provider.addtype: $(GOMPLATE)
@[ "${provider}" ] || ( echo "argument \"provider\" is not set"; exit 1 )
@[ "${group}" ] || ( echo "argument \"group\" is not set"; exit 1 )
@[ "${kind}" ] || ( echo "argument \"kind\" is not set"; exit 1 )
@PROVIDER=$(provider) GROUP=$(group) KIND=$(kind) APIVERSION=$(apiversion) ./hack/helpers/addtype.sh
define CROSSPLANE_MAKE_HELP
Crossplane Targets:
submodules Update the submodules, such as the common build scripts.
run Run crossplane locally, out-of-cluster. Useful for development.
endef
# The reason CROSSPLANE_MAKE_HELP is used instead of CROSSPLANE_HELP is because the crossplane
# binary will try to use CROSSPLANE_HELP if it is set, and this is for something different.
export CROSSPLANE_MAKE_HELP
crossplane.help:
@echo "$$CROSSPLANE_MAKE_HELP"
help-special: crossplane.help
.PHONY: crossplane.help help-special