Skip to content

Commit 25131d6

Browse files
committed
add build scripts that support the go plugin
Signed-off-by: Iceber Gu <[email protected]>
1 parent 0c547be commit 25131d6

11 files changed

+363
-87
lines changed

.dockerignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
*
2-
!/bin

.github/workflows/ci.yml

+2-3
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,8 @@ jobs:
7373
steps:
7474
- name: Checkout code
7575
uses: actions/checkout@v3
76-
- name: Install Go
77-
uses: actions/setup-go@v3
7876
with:
79-
go-version: 1.19
77+
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
78+
fetch-depth: 0
8079
- name: Run e2e test
8180
run: ./test/test.sh

.github/workflows/push-images.yml

+5-4
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ jobs:
1414
with:
1515
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
1616
fetch-depth: 0
17-
- name: Install Go
18-
uses: actions/setup-go@v3
17+
- name: Set up qemu
18+
uses: docker/setup-qemu-action@v2
1919
with:
20-
go-version: 1.19
21-
check-latest: true
20+
platforms: amd64,arm64
2221
- name: Login registry
2322
run: |
2423
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
2524
- name: Push images
25+
env:
26+
ON_PLUGINS: true
2627
run: |
2728
REGISTRY="ghcr.io/$(echo ${{ github.repository }} | tr "A-Z" "a-z")" make push-images

Dockerfile

+17-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
1-
ARG BASEIMAGE
1+
ARG BUILDER_IMAGE
2+
ARG BASE_IMAGE
23

3-
FROM ${BASEIMAGE}
4-
ARG BINNAME
5-
COPY bin/${BINNAME} /usr/local/bin/${BINNAME}
4+
FROM --platform=$BUILDPLATFORM ${BUILDER_IMAGE} as builder
5+
WORKDIR /clusterpedia
6+
7+
ARG BIN_NAME
8+
ARG ON_PLUGINS
9+
ARG TARGETARCH
10+
RUN GOARCH=${TARGETARCH} ON_PLUGINS=${ON_PLUGINS} make ${BIN_NAME}
11+
12+
FROM ${BASE_IMAGE}
13+
14+
ARG ON_PLUGINS
15+
RUN if [ "${ON_PLUGINS}" = "true" ]; then apk add --no-cache gcompat; fi
16+
17+
ARG BIN_NAME
18+
COPY --from=builder /clusterpedia/bin/${BIN_NAME} /usr/local/bin/${BIN_NAME}

Makefile

+88-74
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,25 @@
1-
BASEIMAGE ?= "alpine:3.14"
1+
ON_PLUGINS ?= flase
2+
BASE_IMAGE ?= "alpine:3.14"
23
REGISTRY ?= "ghcr.io/clusterpedia-io/clusterpedia"
34

45
GOOS ?= $(shell go env GOOS)
56
GOARCH ?= $(shell go env GOARCH)
67
RELEASE_ARCHS ?= amd64 arm64
78

8-
# Git information, used to set clusterpedia version
9-
GIT_VERSION ?= $(shell git describe --tags --dirty)
10-
GIT_COMMIT_HASH ?= $(shell git rev-parse HEAD)
11-
GIT_TREESTATE = "clean"
12-
GIT_DIFF = $(shell git diff --quiet >/dev/null 2>&1; if [ $$? -eq 1 ]; then echo "1"; fi)
13-
ifeq ($(GIT_DIFF), 1)
14-
GIT_TREESTATE = "dirty"
15-
endif
16-
BUILD_DATE = $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
17-
18-
KUBE_DEPENDENCE_VERSION = $(shell go list -m k8s.io/kubernetes | cut -d' ' -f2)
19-
20-
LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitVersion=$(GIT_VERSION)
21-
LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitCommit=$(GIT_COMMIT_HASH)
22-
LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitTreeState=$(GIT_TREESTATE)
23-
LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.buildDate=$(BUILD_DATE)
24-
25-
# The `client-go/pkg/version` effects the **User-Agent** when using client-go to request.
26-
# User-Agent="<bin name>/$(GIT_VERSION) ($(GOOS)/$(GOARCH)) kubernetes/$(GIT_COMMIT_HASH)[/<component name>]"
27-
# eg. "clustersynchro-manager/0.4.0 (linux/amd64) kubernetes/fbf0f4f/clustersynchro-manager"
28-
LDFLAGS += -X k8s.io/client-go/pkg/version.gitVersion=$(GIT_VERSION)
29-
LDFLAGS += -X k8s.io/client-go/pkg/version.gitMajor=$(shell echo '$(subst v,,$(GIT_VERSION))' | cut -d. -f1)
30-
LDFLAGS += -X k8s.io/client-go/pkg/version.gitMinor=$(shell echo '$(subst v,,$(GIT_VERSION))' | cut -d. -f2)
31-
LDFLAGS += -X k8s.io/client-go/pkg/version.gitCommit=$(GIT_COMMIT_HASH)
32-
LDFLAGS += -X k8s.io/client-go/pkg/version.gitTreeState=$(GIT_TREESTATE)
33-
LDFLAGS += -X k8s.io/client-go/pkg/version.buildDate=$(BUILD_DATE)
34-
35-
# The `component-base/version` effects the version obtained using Kubernetes OpenAPI.
36-
# OpenAPI Path: /apis/clusterpedia.io/v1beta1/resources/version
37-
# $ kubectl version
38-
LDFLAGS += -X k8s.io/component-base/version.gitVersion=$(KUBE_DEPENDENCE_VERSION)
39-
LDFLAGS += -X k8s.io/component-base/version.gitMajor=$(shell echo '$(subst v,,$(KUBE_DEPENDENCE_VERSION))' | cut -d. -f1)
40-
LDFLAGS += -X k8s.io/component-base/version.gitMinor=$(shell echo '$(subst v,,$(KUBE_DEPENDENCE_VERSION))' | cut -d. -f2)
41-
LDFLAGS += -X k8s.io/component-base/version.gitCommit=$(GIT_COMMIT_HASH)
42-
LDFLAGS += -X k8s.io/component-base/version.gitTreeState=$(GIT_TREESTATE)
43-
LDFLAGS += -X k8s.io/component-base/version.buildDate=$(BUILD_DATE)
44-
459
VERSION ?= "latest"
4610
LATEST_TAG=$(shell git describe --tags)
4711
ifeq ($(LATEST_TAG),$(shell git describe --abbrev=0 --tags))
4812
VERSION=$(LATEST_TAG)
4913
endif
5014

15+
BUILDER_IMAGE_TAG = $(shell git rev-parse HEAD)
16+
GIT_DIFF = $(shell git diff --quiet >/dev/null 2>&1; if [ $$? -eq 1 ]; then echo "1"; fi)
17+
ifeq ($(GIT_DIFF), 1)
18+
BUILDER_IMAGE_TAG := $(BUILDER_IMAGE_TAG)-dirty
19+
endif
20+
21+
HOSTARCH = $(shell go env GOHOSTARCH)
22+
5123
all: apiserver binding-apiserver clustersynchro-manager controller-manager
5224

5325
gen-clusterconfigs:
@@ -86,76 +58,114 @@ clean: clean-images
8658

8759
.PHONY: apiserver
8860
apiserver:
89-
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
90-
-ldflags "$(LDFLAGS)" \
91-
-o bin/apiserver \
92-
cmd/apiserver/main.go
61+
ifeq ($(ON_PLUGINS), true)
62+
hack/builder.sh $@
63+
else
64+
hack/builder-nocgo.sh $@
65+
endif
9366

9467
.PHONY: binding-apiserver
9568
binding-apiserver:
96-
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
97-
-ldflags "$(LDFLAGS)" \
98-
-o bin/binding-apiserver \
99-
cmd/binding-apiserver/main.go
69+
ifeq ($(ON_PLUGINS), true)
70+
hack/builder.sh $@
71+
else
72+
hack/builder-nocgo.sh $@
73+
endif
10074

10175
.PHONY: clustersynchro-manager
10276
clustersynchro-manager:
103-
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
104-
-ldflags "$(LDFLAGS)" \
105-
-o bin/clustersynchro-manager \
106-
cmd/clustersynchro-manager/main.go
77+
ifeq ($(ON_PLUGINS), true)
78+
hack/builder.sh $@
79+
else
80+
hack/builder-nocgo.sh $@
81+
endif
10782

10883
.PHONY: controller-manager
10984
controller-manager:
110-
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
111-
-ldflags "$(LDFLAGS)" \
112-
-o bin/controller-manager \
113-
cmd/controller-manager/main.go
85+
hack/builder-nocgo.sh $@
11486

11587
.PHONY: images
116-
images: image-apiserver image-binding-apiserver image-clustersynchro-manager image-controller-manager
88+
images: image-builder image-apiserver image-binding-apiserver image-clustersynchro-manager image-controller-manager
89+
90+
image-builder:
91+
docker buildx build \
92+
-t $(REGISTRY)/builder-$(GOARCH):$(BUILDER_IMAGE_TAG) \
93+
--platform=linux/$(GOARCH) \
94+
--load \
95+
-f builder.dockerfile . ; \
96+
97+
build-image-%:
98+
GOARCH=$(HOSTARCH) $(MAKE) image-builder
99+
$(MAKE) $(subst build-,,$@)
100+
117101

118102
image-apiserver:
119-
GOOS="linux" $(MAKE) apiserver
120103
docker buildx build \
121-
-t ${REGISTRY}/apiserver-$(GOARCH):$(VERSION) \
104+
-t $(REGISTRY)/apiserver-$(GOARCH):$(VERSION) \
122105
--platform=linux/$(GOARCH) \
123106
--load \
124-
--build-arg BASEIMAGE=$(BASEIMAGE) \
125-
--build-arg BINNAME=apiserver .
107+
--build-arg BASE_IMAGE=$(BASE_IMAGE) \
108+
--build-arg BIN_NAME=apiserver \
109+
--build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \
110+
--build-arg ON_PLUGINS=$(ON_PLUGINS) .
126111

127112
image-binding-apiserver:
128-
GOOS="linux" $(MAKE) binding-apiserver
129113
docker buildx build \
130-
-t ${REGISTRY}/binding-apiserver-$(GOARCH):$(VERSION) \
114+
-t $(REGISTRY)/binding-apiserver-$(GOARCH):$(VERSION) \
131115
--platform=linux/$(GOARCH) \
132116
--load \
133-
--build-arg BASEIMAGE=$(BASEIMAGE) \
134-
--build-arg BINNAME=binding-apiserver .
117+
--build-arg BASE_IMAGE=$(BASE_IMAGE) \
118+
--build-arg BIN_NAME=binding-apiserver \
119+
--build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \
120+
--build-arg ON_PLUGINS=$(ON_PLUGINS) .
135121

136-
image-clustersynchro-manager:
137-
GOOS="linux" $(MAKE) clustersynchro-manager
122+
image-clustersynchro-manager:
138123
docker buildx build \
139124
-t $(REGISTRY)/clustersynchro-manager-$(GOARCH):$(VERSION) \
140125
--platform=linux/$(GOARCH) \
141126
--load \
142-
--build-arg BASEIMAGE=$(BASEIMAGE) \
143-
--build-arg BINNAME=clustersynchro-manager .
127+
--build-arg BASE_IMAGE=$(BASE_IMAGE) \
128+
--build-arg BIN_NAME=clustersynchro-manager \
129+
--build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \
130+
--build-arg ON_PLUGINS=$(ON_PLUGINS) .
144131

145132
image-controller-manager:
146-
GOOS="linux" $(MAKE) controller-manager
147133
docker buildx build \
148134
-t $(REGISTRY)/controller-manager-$(GOARCH):$(VERSION) \
149135
--platform=linux/$(GOARCH) \
150136
--load \
151-
--build-arg BASEIMAGE=$(BASEIMAGE) \
152-
--build-arg BINNAME=controller-manager .
137+
--build-arg BASE_IMAGE=$(BASE_IMAGE) \
138+
--build-arg BIN_NAME=controller-manager \
139+
--build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \
140+
--build-arg ON_PLUGINS=false .
153141

154142
.PHONY: push-images
155143
push-images: push-apiserver-image push-binding-apiserver-image push-clustersynchro-manager-image push-controller-manager-image
156144

157145
# clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447
158-
push-apiserver-image: clean-apiserver-manifest
146+
push-builder-image: clean-builder-manifest
147+
set -e; \
148+
images=""; \
149+
for arch in $(RELEASE_ARCHS); do \
150+
GOARCH=$$arch $(MAKE) image-builder; \
151+
image=$(REGISTRY)/builder-$$arch:$(BUILDER_IMAGE_TAG); \
152+
docker push $$image; \
153+
images="$$images $$image"; \
154+
if [ $(VERSION) != latest ]; then \
155+
tag_image=$(REGISTRY)/builder-$$arch:$(VERSION); \
156+
docker tag $$image $$tag_image; \
157+
docker push $$tag_image; \
158+
fi; \
159+
done; \
160+
docker manifest create $(REGISTRY)/builder:$(BUILDER_IMAGE_TAG) $$images; \
161+
docker manifest push $(REGISTRY)/builder:$(BUILDER_IMAGE_TAG); \
162+
if [ $(VERSION) != latest ]; then \
163+
docker manifest create $(REGISTRY)/builder:$(VERSION) $$images; \
164+
docker manifest push $(REGISTRY)/builder:$(VERSION); \
165+
fi;
166+
167+
# clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447
168+
push-apiserver-image: clean-apiserver-manifest push-builder-image
159169
set -e; \
160170
images=""; \
161171
for arch in $(RELEASE_ARCHS); do \
@@ -177,7 +187,7 @@ push-apiserver-image: clean-apiserver-manifest
177187
fi;
178188

179189
# clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447
180-
push-binding-apiserver-image: clean-binding-apiserver-manifest
190+
push-binding-apiserver-image: clean-binding-apiserver-manifest push-builder-image
181191
set -e; \
182192
images=""; \
183193
for arch in $(RELEASE_ARCHS); do \
@@ -199,7 +209,7 @@ push-binding-apiserver-image: clean-binding-apiserver-manifest
199209
fi;
200210

201211
# clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447
202-
push-clustersynchro-manager-image: clean-clustersynchro-manager-manifest
212+
push-clustersynchro-manager-image: clean-clustersynchro-manager-manifest push-builder-image
203213
set -e; \
204214
images=""; \
205215
for arch in $(RELEASE_ARCHS); do \
@@ -221,7 +231,7 @@ push-clustersynchro-manager-image: clean-clustersynchro-manager-manifest
221231
fi;
222232

223233
# clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447
224-
push-controller-manager-image: clean-controller-manager-manifest
234+
push-controller-manager-image: clean-controller-manager-manifest push-builder-image
225235
set -e; \
226236
images=""; \
227237
for arch in $(RELEASE_ARCHS); do \
@@ -246,6 +256,10 @@ clean-images: clean-apiserver-manifest clean-clustersynchro-manager-manifest
246256
docker images|grep $(REGISTRY)/apiserver|awk '{print $$3}'|xargs docker rmi --force
247257
docker images|grep $(REGISTRY)/clustersynchro-manager|awk '{print $$3}'|xargs docker rmi --force
248258

259+
clean-builder-manifest:
260+
docker manifest rm $(REGISTRY)/builder:$(BUILDER_IMAGE_TAG) 2>/dev/null;\
261+
docker manifest rm $(REGISTRY)/builder:$(VERSION) 2>/dev/null; exit 0
262+
249263
clean-apiserver-manifest:
250264
docker manifest rm $(REGISTRY)/apiserver:$(VERSION) 2>/dev/null;\
251265
docker manifest rm $(REGISTRY)/apiserver:latest 2>/dev/null; exit 0

builder.dockerfile

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
FROM golang:1.19.3
2+
3+
# FROM golang:1.19.2-alpine
4+
# RUN apk add --no-cache build-base git bash
5+
6+
RUN apt-get update && apt-get install -y gcc-aarch64-linux-gnu gcc-x86-64-linux-gnu
7+
8+
COPY . /clusterpedia
9+
10+
# RUN rm -rf /clusterpedia/.git
11+
# RUN rm -rf /clusterpedia/test
12+
13+
ENV CLUSTERPEDIA_REPO="/clusterpedia"
14+
15+
RUN cp /clusterpedia/hack/builder.sh /

builder.dockerfile.dockerignore

Whitespace-only changes.

hack/builder-nocgo.sh

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/env bash
2+
3+
set -o errexit
4+
set -o nounset
5+
set -o pipefail
6+
7+
REPO_ROOT=$(git rev-parse --show-toplevel)
8+
9+
OUTPUT_DIR=${OUTPUT_DIR:-$REPO_ROOT}
10+
CLUSTERPEDIA_REPO=${CLUSTERPEDIA_REPO:-$REPO_ROOT}
11+
12+
GOOS=${GOOS:-$(go env GOOS)}
13+
GOARCH=${GOARCH:-$(go env GOARCH)}
14+
15+
function build_component() {
16+
cd $CLUSTERPEDIA_REPO
17+
18+
LDFLAGS=${BUILD_LDFLAGS:-""}
19+
if [ -f ./ldflags.sh ]; then
20+
source ./ldflags.sh
21+
fi
22+
CGO_ENABLED=0 go build -ldflags "${LDFLAGS}" -o ${OUTPUT_DIR}/bin/$1 ./cmd/$1
23+
}
24+
25+
build_component $1

0 commit comments

Comments
 (0)