1
1
# Image URL to use all building/pushing image targets
2
2
IMG ?= fluxcd/source-controller:latest
3
+
4
+ # Base image used to build the Go binary
5
+ BASE_IMG ?= ghcr.io/hiddeco/golang-with-libgit2
6
+ BASE_TAG ?= dev
7
+
3
8
# Produce CRDs that work back to Kubernetes 1.16
4
9
CRD_OPTIONS ?= crd:crdVersions=v1
5
10
6
- ENVTEST_BIN_VERSION? =1.19.2
7
- KUBEBUILDER_ASSETS? =$(shell $(SETUP_ENVTEST ) use -i $(ENVTEST_BIN_VERSION ) -p path)
11
+ # Repository root based on Git metadata
12
+ REPOSITORY_ROOT := $(shell git rev-parse --show-toplevel)
13
+
14
+ # Dependency versions
15
+ LIBGIT2_VERSION ?= 1.2.0
16
+ ENVTEST_BIN_VERSION ?= 1.19.2
17
+ KUBEBUILDER_ASSETS ?= $(shell $(SETUP_ENVTEST ) use -i $(ENVTEST_BIN_VERSION ) -p path)
18
+
19
+ # libgit2 related magical paths
20
+ # These are used to determine if the target libgit2 version is already available on
21
+ # the system, or where they should be installed to
22
+ SYSTEM_LIBGIT2_VERSION := $(shell pkg-config --modversion libgit2 2>/dev/null)
23
+ LIBGIT2_PATH := $(REPOSITORY_ROOT ) /hack/libgit2
24
+ LIBGIT2_LIB_PATH := $(LIBGIT2_PATH ) /lib
25
+ LIBGIT2 := $(LIBGIT2_LIB_PATH ) /libgit2.so.$(LIBGIT2_VERSION )
26
+
27
+ # API (doc) generation utilities
28
+ CONTROLLER_GEN_VERSION ?= v0.5.0
29
+ GEN_API_REF_DOCS_VERSION ?= 0.3.0
8
30
9
31
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
10
32
ifeq (,$(shell go env GOBIN) )
@@ -13,121 +35,130 @@ else
13
35
GOBIN =$(shell go env GOBIN)
14
36
endif
15
37
16
- all : manager
38
+ all : build
17
39
18
- # Run tests
19
- test : generate fmt vet manifests api-docs setup-envtest
20
- KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS ) go test ./... -coverprofile cover.out
21
- cd api; go test ./... -coverprofile cover.out
22
-
23
- # Build manager binary
24
- manager : generate fmt vet
40
+ build : $(LIBGIT2 ) # # Build manager binary
41
+ PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH ) /pkgconfig/ \
25
42
go build -o bin/manager main.go
26
43
27
- # Run against the configured Kubernetes cluster in ~/.kube/config
28
- run : generate fmt vet manifests
44
+ test : $(LIBGIT2 ) test-api # # Run tests
45
+ LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH ) \
46
+ PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH ) /pkgconfig/ \
47
+ go test ./... -coverprofile cover.out
48
+
49
+ test-api : # # Run api tests
50
+ cd api; go test ./... -coverprofile cover.out
51
+
52
+ run : $(LIBGIT2 ) generate fmt vet manifests # # Run against the configured Kubernetes cluster in ~/.kube/config
53
+ LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH ) \
29
54
go run ./main.go
30
55
31
- # Install CRDs into a cluster
32
- install : manifests
56
+ install : manifests # # Install CRDs into a cluster
33
57
kustomize build config/crd | kubectl apply -f -
34
58
35
- # Uninstall CRDs from a cluster
36
- uninstall : manifests
59
+ uninstall : manifests # # Uninstall CRDs from a cluster
37
60
kustomize build config/crd | kubectl delete -f -
38
61
39
- # Deploy controller in the configured Kubernetes cluster in ~/.kube/config
40
- deploy : manifests
62
+ deploy : manifests # # Deploy controller in the configured Kubernetes cluster in ~/.kube/config
41
63
cd config/manager && kustomize edit set image fluxcd/source-controller=${IMG}
42
64
kustomize build config/default | kubectl apply -f -
43
65
44
- # Deploy controller dev image in the configured Kubernetes cluster in ~/.kube/config
45
- dev-deploy :
66
+ dev-deploy : # # Deploy controller dev image in the configured Kubernetes cluster in ~/.kube/config
46
67
mkdir -p config/dev && cp config/default/* config/dev
47
68
cd config/dev && kustomize edit set image fluxcd/source-controller=${IMG}
48
69
kustomize build config/dev | kubectl apply -f -
49
70
rm -rf config/dev
50
71
51
- # Generate manifests e.g. CRD, RBAC etc.
52
- manifests : controller-gen
72
+ manifests : controller-gen # # Generate manifests, e.g. CRD, RBAC, etc.
53
73
$(CONTROLLER_GEN ) $(CRD_OPTIONS ) rbac:roleName=manager-role paths=" ./..." output:crd:artifacts:config=" config/crd/bases"
54
74
cd api; $(CONTROLLER_GEN ) $(CRD_OPTIONS ) rbac:roleName=manager-role paths=" ./..." output:crd:artifacts:config=" ../config/crd/bases"
55
75
56
- # Generate API reference documentation
57
- api-docs : gen-crd-api-reference-docs
76
+ api-docs : gen-crd-api-reference-docs # # Generate API reference documentation
58
77
$(API_REF_GEN ) -api-dir=./api/v1beta1 -config=./hack/api-docs/config.json -template-dir=./hack/api-docs/template -out-file=./docs/api/source.md
59
78
60
- # Run go mod tidy
61
- tidy :
79
+ tidy : # # Run go mod tidy
62
80
go mod tidy
63
81
cd api; go mod tidy
64
82
65
- # Run go fmt against code
66
- fmt :
83
+ fmt : # # Run go fmt against code
67
84
go fmt ./...
68
85
cd api; go fmt ./...
69
86
70
- # Run go vet against code
71
- vet :
87
+ vet : # # Run go vet against code
88
+ PKG_CONFIG_PATH= $( LIBGIT2_LIB_PATH ) /pkgconfig \
72
89
go vet ./...
73
90
cd api; go vet ./...
74
91
75
- # Generate code
76
- generate : controller-gen
92
+ generate : controller-gen # # Generate API code
77
93
cd api; $(CONTROLLER_GEN ) object:headerFile=" ../hack/boilerplate.go.txt" paths=" ./..."
78
94
79
- # Build the docker image
80
- docker-build :
81
- docker build . -t ${IMG}
95
+ docker-build : # # Build the docker image
96
+ docker build \
97
+ --build-arg BASE_IMG=$(BASE_IMG ) \
98
+ --build-arg BASE_TAG=$(BASE_TAG ) \
99
+ -t ${IMG} .
82
100
83
- # Push the docker image
84
- docker-push :
101
+ docker-push : # # Push docker image
85
102
docker push ${IMG}
86
103
87
- # Find or download controller-gen
88
- controller-gen :
104
+ controller-gen : # # Find or download controller-gen
89
105
ifeq (, $(shell which controller-gen) )
90
106
@{ \
91
- set -e ; \
92
- CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ; \
93
- cd $$CONTROLLER_GEN_TMP_DIR ; \
94
- go mod init tmp ; \
95
- go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.5.0 ; \
96
- rm -rf $$CONTROLLER_GEN_TMP_DIR ; \
107
+ set -e; \
108
+ CONTROLLER_GEN_TMP_DIR=$$(mktemp -d); \
109
+ cd $$CONTROLLER_GEN_TMP_DIR; \
110
+ go mod init tmp; \
111
+ go get sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_GEN_VERSION); \
112
+ rm -rf $$CONTROLLER_GEN_TMP_DIR; \
97
113
}
98
114
CONTROLLER_GEN =$(GOBIN ) /controller-gen
99
115
else
100
116
CONTROLLER_GEN =$(shell which controller-gen)
101
117
endif
102
118
103
- # Find or download gen-crd-api-reference-docs
104
- gen-crd-api-reference-docs :
119
+ gen-crd-api-reference-docs : # # Find or download gen-crd-api-reference-docs
105
120
ifeq (, $(shell which gen-crd-api-reference-docs) )
106
121
@{ \
107
- set -e ; \
108
- API_REF_GEN_TMP_DIR=$$(mktemp -d) ; \
109
- cd $$API_REF_GEN_TMP_DIR ; \
110
- go mod init tmp ; \
111
- go get github.com/ahmetb/gen-crd-api-reference-docs@v0.3.0 ; \
112
- rm -rf $$API_REF_GEN_TMP_DIR ; \
122
+ set -e; \
123
+ API_REF_GEN_TMP_DIR=$$(mktemp -d); \
124
+ cd $$API_REF_GEN_TMP_DIR; \
125
+ go mod init tmp; \
126
+ go get github.com/ahmetb/gen-crd-api-reference-docs@$(GEN_API_REF_DOCS_VERSION); \
127
+ rm -rf $$API_REF_GEN_TMP_DIR; \
113
128
}
114
129
API_REF_GEN =$(GOBIN ) /gen-crd-api-reference-docs
115
130
else
116
131
API_REF_GEN =$(shell which gen-crd-api-reference-docs)
117
132
endif
118
133
119
- # Find or download setup-envtest
120
- setup-envtest :
134
+ setup-envtest : # # Find or download setup-envtest
121
135
ifeq (, $(shell which setup-envtest) )
122
136
@{ \
123
- set -e ; \
124
- SETUP_ENVTEST_TMP_DIR=$$(mktemp -d) ; \
125
- cd $$SETUP_ENVTEST_TMP_DIR ; \
126
- go mod init tmp ; \
127
- go get sigs.k8s.io/controller-runtime/tools/setup-envtest@latest ; \
128
- rm -rf $$SETUP_ENVTEST_TMP_DIR ; \
137
+ set -e; \
138
+ SETUP_ENVTEST_TMP_DIR=$$(mktemp -d); \
139
+ cd $$SETUP_ENVTEST_TMP_DIR; \
140
+ go mod init tmp; \
141
+ go get sigs.k8s.io/controller-runtime/tools/setup-envtest@latest; \
142
+ rm -rf $$SETUP_ENVTEST_TMP_DIR; \
129
143
}
130
144
SETUP_ENVTEST =$(GOBIN ) /setup-envtest
131
145
else
132
146
SETUP_ENVTEST =$(shell which setup-envtest)
133
147
endif
148
+
149
+ libgit2 : $(LIBGIT2 ) # # Detect or download libgit2 library
150
+
151
+ $(LIBGIT2 ) :
152
+ ifeq ($(LIBGIT2_VERSION ) ,$(SYSTEM_LIBGIT2_VERSION ) )
153
+ else
154
+ @{ \
155
+ set -e; \
156
+ mkdir -p $(LIBGIT2_PATH); \
157
+ docker cp $(shell docker create --rm $(BASE_IMG):$(BASE_TAG)):/libgit2/Makefile $(LIBGIT2_PATH); \
158
+ INSTALL_PREFIX=$(LIBGIT2_PATH) make -C $(LIBGIT2_PATH); \
159
+ }
160
+ endif
161
+
162
+ .PHONY : help
163
+ help : # # Display this help menu
164
+ @awk ' BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST )
0 commit comments