From 25131d64338cc0cb934a47bf3728d3258023fa30 Mon Sep 17 00:00:00 2001 From: Iceber Gu Date: Tue, 1 Nov 2022 15:10:15 +0800 Subject: [PATCH] add build scripts that support the go plugin Signed-off-by: Iceber Gu --- .dockerignore | 1 - .github/workflows/ci.yml | 5 +- .github/workflows/push-images.yml | 9 +- Dockerfile | 21 +++- Makefile | 162 +++++++++++++++------------- builder.dockerfile | 15 +++ builder.dockerfile.dockerignore | 0 hack/builder-nocgo.sh | 25 +++++ hack/builder.sh | 168 ++++++++++++++++++++++++++++++ ldflags.sh | 42 ++++++++ test/helper.sh | 2 +- 11 files changed, 363 insertions(+), 87 deletions(-) create mode 100644 builder.dockerfile create mode 100644 builder.dockerfile.dockerignore create mode 100755 hack/builder-nocgo.sh create mode 100755 hack/builder.sh create mode 100644 ldflags.sh diff --git a/.dockerignore b/.dockerignore index 720e3c1e0..72e8ffc0d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1 @@ * -!/bin diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 693140816..a8e07b785 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,9 +73,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v3 - - name: Install Go - uses: actions/setup-go@v3 with: - go-version: 1.19 + # https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches + fetch-depth: 0 - name: Run e2e test run: ./test/test.sh diff --git a/.github/workflows/push-images.yml b/.github/workflows/push-images.yml index 0e9924759..f9ae6af0d 100644 --- a/.github/workflows/push-images.yml +++ b/.github/workflows/push-images.yml @@ -14,14 +14,15 @@ jobs: with: # https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches fetch-depth: 0 - - name: Install Go - uses: actions/setup-go@v3 + - name: Set up qemu + uses: docker/setup-qemu-action@v2 with: - go-version: 1.19 - check-latest: true + platforms: amd64,arm64 - name: Login registry run: | echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Push images + env: + ON_PLUGINS: true run: | REGISTRY="ghcr.io/$(echo ${{ github.repository }} | tr "A-Z" "a-z")" make push-images diff --git a/Dockerfile b/Dockerfile index 33f19b467..80167bb3d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,18 @@ -ARG BASEIMAGE +ARG BUILDER_IMAGE +ARG BASE_IMAGE -FROM ${BASEIMAGE} -ARG BINNAME -COPY bin/${BINNAME} /usr/local/bin/${BINNAME} +FROM --platform=$BUILDPLATFORM ${BUILDER_IMAGE} as builder +WORKDIR /clusterpedia + +ARG BIN_NAME +ARG ON_PLUGINS +ARG TARGETARCH +RUN GOARCH=${TARGETARCH} ON_PLUGINS=${ON_PLUGINS} make ${BIN_NAME} + +FROM ${BASE_IMAGE} + +ARG ON_PLUGINS +RUN if [ "${ON_PLUGINS}" = "true" ]; then apk add --no-cache gcompat; fi + +ARG BIN_NAME +COPY --from=builder /clusterpedia/bin/${BIN_NAME} /usr/local/bin/${BIN_NAME} diff --git a/Makefile b/Makefile index 7682048a1..5c86c40c3 100644 --- a/Makefile +++ b/Makefile @@ -1,53 +1,25 @@ -BASEIMAGE ?= "alpine:3.14" +ON_PLUGINS ?= flase +BASE_IMAGE ?= "alpine:3.14" REGISTRY ?= "ghcr.io/clusterpedia-io/clusterpedia" GOOS ?= $(shell go env GOOS) GOARCH ?= $(shell go env GOARCH) RELEASE_ARCHS ?= amd64 arm64 -# Git information, used to set clusterpedia version -GIT_VERSION ?= $(shell git describe --tags --dirty) -GIT_COMMIT_HASH ?= $(shell git rev-parse HEAD) -GIT_TREESTATE = "clean" -GIT_DIFF = $(shell git diff --quiet >/dev/null 2>&1; if [ $$? -eq 1 ]; then echo "1"; fi) -ifeq ($(GIT_DIFF), 1) - GIT_TREESTATE = "dirty" -endif -BUILD_DATE = $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') - -KUBE_DEPENDENCE_VERSION = $(shell go list -m k8s.io/kubernetes | cut -d' ' -f2) - -LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitVersion=$(GIT_VERSION) -LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitCommit=$(GIT_COMMIT_HASH) -LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitTreeState=$(GIT_TREESTATE) -LDFLAGS += -X github.com/clusterpedia-io/clusterpedia/pkg/version.buildDate=$(BUILD_DATE) - -# The `client-go/pkg/version` effects the **User-Agent** when using client-go to request. -# User-Agent="/$(GIT_VERSION) ($(GOOS)/$(GOARCH)) kubernetes/$(GIT_COMMIT_HASH)[/]" -# eg. "clustersynchro-manager/0.4.0 (linux/amd64) kubernetes/fbf0f4f/clustersynchro-manager" -LDFLAGS += -X k8s.io/client-go/pkg/version.gitVersion=$(GIT_VERSION) -LDFLAGS += -X k8s.io/client-go/pkg/version.gitMajor=$(shell echo '$(subst v,,$(GIT_VERSION))' | cut -d. -f1) -LDFLAGS += -X k8s.io/client-go/pkg/version.gitMinor=$(shell echo '$(subst v,,$(GIT_VERSION))' | cut -d. -f2) -LDFLAGS += -X k8s.io/client-go/pkg/version.gitCommit=$(GIT_COMMIT_HASH) -LDFLAGS += -X k8s.io/client-go/pkg/version.gitTreeState=$(GIT_TREESTATE) -LDFLAGS += -X k8s.io/client-go/pkg/version.buildDate=$(BUILD_DATE) - -# The `component-base/version` effects the version obtained using Kubernetes OpenAPI. -# OpenAPI Path: /apis/clusterpedia.io/v1beta1/resources/version -# $ kubectl version -LDFLAGS += -X k8s.io/component-base/version.gitVersion=$(KUBE_DEPENDENCE_VERSION) -LDFLAGS += -X k8s.io/component-base/version.gitMajor=$(shell echo '$(subst v,,$(KUBE_DEPENDENCE_VERSION))' | cut -d. -f1) -LDFLAGS += -X k8s.io/component-base/version.gitMinor=$(shell echo '$(subst v,,$(KUBE_DEPENDENCE_VERSION))' | cut -d. -f2) -LDFLAGS += -X k8s.io/component-base/version.gitCommit=$(GIT_COMMIT_HASH) -LDFLAGS += -X k8s.io/component-base/version.gitTreeState=$(GIT_TREESTATE) -LDFLAGS += -X k8s.io/component-base/version.buildDate=$(BUILD_DATE) - VERSION ?= "latest" LATEST_TAG=$(shell git describe --tags) ifeq ($(LATEST_TAG),$(shell git describe --abbrev=0 --tags)) VERSION=$(LATEST_TAG) endif +BUILDER_IMAGE_TAG = $(shell git rev-parse HEAD) +GIT_DIFF = $(shell git diff --quiet >/dev/null 2>&1; if [ $$? -eq 1 ]; then echo "1"; fi) +ifeq ($(GIT_DIFF), 1) + BUILDER_IMAGE_TAG := $(BUILDER_IMAGE_TAG)-dirty +endif + +HOSTARCH = $(shell go env GOHOSTARCH) + all: apiserver binding-apiserver clustersynchro-manager controller-manager gen-clusterconfigs: @@ -86,76 +58,114 @@ clean: clean-images .PHONY: apiserver apiserver: - CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \ - -ldflags "$(LDFLAGS)" \ - -o bin/apiserver \ - cmd/apiserver/main.go +ifeq ($(ON_PLUGINS), true) + hack/builder.sh $@ +else + hack/builder-nocgo.sh $@ +endif .PHONY: binding-apiserver binding-apiserver: - CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \ - -ldflags "$(LDFLAGS)" \ - -o bin/binding-apiserver \ - cmd/binding-apiserver/main.go +ifeq ($(ON_PLUGINS), true) + hack/builder.sh $@ +else + hack/builder-nocgo.sh $@ +endif .PHONY: clustersynchro-manager clustersynchro-manager: - CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \ - -ldflags "$(LDFLAGS)" \ - -o bin/clustersynchro-manager \ - cmd/clustersynchro-manager/main.go +ifeq ($(ON_PLUGINS), true) + hack/builder.sh $@ +else + hack/builder-nocgo.sh $@ +endif .PHONY: controller-manager controller-manager: - CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \ - -ldflags "$(LDFLAGS)" \ - -o bin/controller-manager \ - cmd/controller-manager/main.go + hack/builder-nocgo.sh $@ .PHONY: images -images: image-apiserver image-binding-apiserver image-clustersynchro-manager image-controller-manager +images: image-builder image-apiserver image-binding-apiserver image-clustersynchro-manager image-controller-manager + +image-builder: + docker buildx build \ + -t $(REGISTRY)/builder-$(GOARCH):$(BUILDER_IMAGE_TAG) \ + --platform=linux/$(GOARCH) \ + --load \ + -f builder.dockerfile . ; \ + +build-image-%: + GOARCH=$(HOSTARCH) $(MAKE) image-builder + $(MAKE) $(subst build-,,$@) + image-apiserver: - GOOS="linux" $(MAKE) apiserver docker buildx build \ - -t ${REGISTRY}/apiserver-$(GOARCH):$(VERSION) \ + -t $(REGISTRY)/apiserver-$(GOARCH):$(VERSION) \ --platform=linux/$(GOARCH) \ --load \ - --build-arg BASEIMAGE=$(BASEIMAGE) \ - --build-arg BINNAME=apiserver . + --build-arg BASE_IMAGE=$(BASE_IMAGE) \ + --build-arg BIN_NAME=apiserver \ + --build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \ + --build-arg ON_PLUGINS=$(ON_PLUGINS) . image-binding-apiserver: - GOOS="linux" $(MAKE) binding-apiserver docker buildx build \ - -t ${REGISTRY}/binding-apiserver-$(GOARCH):$(VERSION) \ + -t $(REGISTRY)/binding-apiserver-$(GOARCH):$(VERSION) \ --platform=linux/$(GOARCH) \ --load \ - --build-arg BASEIMAGE=$(BASEIMAGE) \ - --build-arg BINNAME=binding-apiserver . + --build-arg BASE_IMAGE=$(BASE_IMAGE) \ + --build-arg BIN_NAME=binding-apiserver \ + --build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \ + --build-arg ON_PLUGINS=$(ON_PLUGINS) . -image-clustersynchro-manager: - GOOS="linux" $(MAKE) clustersynchro-manager +image-clustersynchro-manager: docker buildx build \ -t $(REGISTRY)/clustersynchro-manager-$(GOARCH):$(VERSION) \ --platform=linux/$(GOARCH) \ --load \ - --build-arg BASEIMAGE=$(BASEIMAGE) \ - --build-arg BINNAME=clustersynchro-manager . + --build-arg BASE_IMAGE=$(BASE_IMAGE) \ + --build-arg BIN_NAME=clustersynchro-manager \ + --build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \ + --build-arg ON_PLUGINS=$(ON_PLUGINS) . image-controller-manager: - GOOS="linux" $(MAKE) controller-manager docker buildx build \ -t $(REGISTRY)/controller-manager-$(GOARCH):$(VERSION) \ --platform=linux/$(GOARCH) \ --load \ - --build-arg BASEIMAGE=$(BASEIMAGE) \ - --build-arg BINNAME=controller-manager . + --build-arg BASE_IMAGE=$(BASE_IMAGE) \ + --build-arg BIN_NAME=controller-manager \ + --build-arg BUILDER_IMAGE=$(REGISTRY)/builder-$(HOSTARCH):$(BUILDER_IMAGE_TAG) \ + --build-arg ON_PLUGINS=false . .PHONY: push-images push-images: push-apiserver-image push-binding-apiserver-image push-clustersynchro-manager-image push-controller-manager-image # clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447 -push-apiserver-image: clean-apiserver-manifest +push-builder-image: clean-builder-manifest + set -e; \ + images=""; \ + for arch in $(RELEASE_ARCHS); do \ + GOARCH=$$arch $(MAKE) image-builder; \ + image=$(REGISTRY)/builder-$$arch:$(BUILDER_IMAGE_TAG); \ + docker push $$image; \ + images="$$images $$image"; \ + if [ $(VERSION) != latest ]; then \ + tag_image=$(REGISTRY)/builder-$$arch:$(VERSION); \ + docker tag $$image $$tag_image; \ + docker push $$tag_image; \ + fi; \ + done; \ + docker manifest create $(REGISTRY)/builder:$(BUILDER_IMAGE_TAG) $$images; \ + docker manifest push $(REGISTRY)/builder:$(BUILDER_IMAGE_TAG); \ + if [ $(VERSION) != latest ]; then \ + docker manifest create $(REGISTRY)/builder:$(VERSION) $$images; \ + docker manifest push $(REGISTRY)/builder:$(VERSION); \ + fi; + +# clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447 +push-apiserver-image: clean-apiserver-manifest push-builder-image set -e; \ images=""; \ for arch in $(RELEASE_ARCHS); do \ @@ -177,7 +187,7 @@ push-apiserver-image: clean-apiserver-manifest fi; # clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447 -push-binding-apiserver-image: clean-binding-apiserver-manifest +push-binding-apiserver-image: clean-binding-apiserver-manifest push-builder-image set -e; \ images=""; \ for arch in $(RELEASE_ARCHS); do \ @@ -199,7 +209,7 @@ push-binding-apiserver-image: clean-binding-apiserver-manifest fi; # clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447 -push-clustersynchro-manager-image: clean-clustersynchro-manager-manifest +push-clustersynchro-manager-image: clean-clustersynchro-manager-manifest push-builder-image set -e; \ images=""; \ for arch in $(RELEASE_ARCHS); do \ @@ -221,7 +231,7 @@ push-clustersynchro-manager-image: clean-clustersynchro-manager-manifest fi; # clean manifest https://github.com/docker/cli/issues/954#issuecomment-586722447 -push-controller-manager-image: clean-controller-manager-manifest +push-controller-manager-image: clean-controller-manager-manifest push-builder-image set -e; \ images=""; \ for arch in $(RELEASE_ARCHS); do \ @@ -246,6 +256,10 @@ clean-images: clean-apiserver-manifest clean-clustersynchro-manager-manifest docker images|grep $(REGISTRY)/apiserver|awk '{print $$3}'|xargs docker rmi --force docker images|grep $(REGISTRY)/clustersynchro-manager|awk '{print $$3}'|xargs docker rmi --force +clean-builder-manifest: + docker manifest rm $(REGISTRY)/builder:$(BUILDER_IMAGE_TAG) 2>/dev/null;\ + docker manifest rm $(REGISTRY)/builder:$(VERSION) 2>/dev/null; exit 0 + clean-apiserver-manifest: docker manifest rm $(REGISTRY)/apiserver:$(VERSION) 2>/dev/null;\ docker manifest rm $(REGISTRY)/apiserver:latest 2>/dev/null; exit 0 diff --git a/builder.dockerfile b/builder.dockerfile new file mode 100644 index 000000000..baede38c8 --- /dev/null +++ b/builder.dockerfile @@ -0,0 +1,15 @@ +FROM golang:1.19.3 + +# FROM golang:1.19.2-alpine +# RUN apk add --no-cache build-base git bash + +RUN apt-get update && apt-get install -y gcc-aarch64-linux-gnu gcc-x86-64-linux-gnu + +COPY . /clusterpedia + +# RUN rm -rf /clusterpedia/.git +# RUN rm -rf /clusterpedia/test + +ENV CLUSTERPEDIA_REPO="/clusterpedia" + +RUN cp /clusterpedia/hack/builder.sh / diff --git a/builder.dockerfile.dockerignore b/builder.dockerfile.dockerignore new file mode 100644 index 000000000..e69de29bb diff --git a/hack/builder-nocgo.sh b/hack/builder-nocgo.sh new file mode 100755 index 000000000..1c9ed4a12 --- /dev/null +++ b/hack/builder-nocgo.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +REPO_ROOT=$(git rev-parse --show-toplevel) + +OUTPUT_DIR=${OUTPUT_DIR:-$REPO_ROOT} +CLUSTERPEDIA_REPO=${CLUSTERPEDIA_REPO:-$REPO_ROOT} + +GOOS=${GOOS:-$(go env GOOS)} +GOARCH=${GOARCH:-$(go env GOARCH)} + +function build_component() { + cd $CLUSTERPEDIA_REPO + + LDFLAGS=${BUILD_LDFLAGS:-""} + if [ -f ./ldflags.sh ]; then + source ./ldflags.sh + fi + CGO_ENABLED=0 go build -ldflags "${LDFLAGS}" -o ${OUTPUT_DIR}/bin/$1 ./cmd/$1 +} + +build_component $1 diff --git a/hack/builder.sh b/hack/builder.sh new file mode 100755 index 000000000..cec2d84e5 --- /dev/null +++ b/hack/builder.sh @@ -0,0 +1,168 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +function usage() { + cat < + +Build plugins: + $0 plugins + +ENV: + CLUSTERPEDIA_REPO: clusterpedia repo path, required if the pwd is not in the clusterpedia repository. + eg. CLUSTERPEDIA_REPO=/clusterpedia + + PLUGIN_REPO: plugin repo path, required if the pwd is not the plugin repository. + eg. CLUSTERPEDIA_REPO=/plugins/sample-storage-layer + + OUTPUT_DIR: default is the root of the repository or pwd, + the component binary will be output in \$OUTPUT_DIR/bin, the plugins will be output in \$OUTPUT_DIR/plugins. + eg. OUTPUT_DIR=. +EOF +} + +set +e; REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null);set -e +if [ -z $REPO_ROOT ]; then + if [ -z $CLUSTERPEDIA_REPO ]; then + echo "the current directory is not in the clusterpedia repo, please set CLUSTERPEDIA_REPO=" + usage + exit 1 + fi + REPO_ROOT=$(pwd) +else + CLUSTERPEDIA_REPO=${CLUSTERPEDIA_REPO:-$REPO_ROOT} +fi +OUTPUT_DIR=${OUTPUT_DIR:-$REPO_ROOT} + +CLUSTERPEDIA_PACKAGE="github.com/clusterpedia-io/clusterpedia" +if [ $CLUSTERPEDIA_PACKAGE != "$(sed -n '1p' ${CLUSTERPEDIA_REPO}/go.mod | awk '{print $2}')" ]; then + echo "CLUSTERPEDIA_REPO is invalid" + usage + exit 1 +fi + + +TMP_GOPATH=/tmp/clusterpedia +function cleanup() { + rm -rf $TMP_GOPATH +} + +TMP_CLUSTERPEDIA=$TMP_GOPATH/src/$CLUSTERPEDIA_PACKAGE +function copy_clusterpedia_repo() { + mkdir -p $TMP_CLUSTERPEDIA && cd $TMP_CLUSTERPEDIA + cp -rf $CLUSTERPEDIA_REPO/* . + + for file in $(ls staging/src/github.com/clusterpedia-io); do + rm -rf vendor/github.com/clusterpedia-io/$file + done + + cp -rf staging/src/github.com/clusterpedia-io/* $TMP_GOPATH/src/github.com/clusterpedia-io + cp -rf vendor/* $TMP_GOPATH/src + rm -rf go.mod go.sum vendor + + rm $TMP_GOPATH/src/modules.txt +} + +GOOS=${GOOS:-$(go env GOOS)} +GOARCH=${GOARCH:-$(go env GOARCH)} +HOSTARCH=$(go env GOHOSTARCH) + +CC_FOR_TARGET=${BUILD_CC_FOR_TARGET:-""} +CC=${BUILD_CC:-""} +if [[ "${GOOS}" == "linux" && "${GOARCH}" != "${HOSTARCH}" ]]; then + case ${GOARCH} in + amd64) + CC_FOR_TARGET=${CC_FOR_TARGET:-"gcc-x86-64-linux-gnu"} + CC=${CC:-"x86-64-linux-gnu-gcc"} + ;; + arm64) + CC_FOR_TARGET=${CC_FOR_TARGET:-"gcc-aarch64-linux-gnu"} + CC=${CC:-"aarch64-linux-gnu-gcc"} + ;; + esac +fi + +function build_component() { + local LDFLAGS=${BUILD_LDFLAGS:-""} + if [ -f ${CLUSTERPEDIA_REPO}/ldflags.sh ]; then + cd ${CLUSTERPEDIA_REPO} && source ./ldflags.sh + fi + + cd $TMP_CLUSTERPEDIA + GOPATH=$TMP_GOPATH GO111MODULE=off CGO_ENABLED=1 CC_FOR_TARGET=$CC_FOR_TARGET CC=$CC \ + go build -ldflags "${LDFLAGS}" -o $OUTPUT_DIR/bin/$1 ./cmd/$1 +} + +cleanup +trap cleanup EXIT + +mkdir -p $TMP_GOPATH + +case ${1:-""} in + plugins) + if [ -z ${2:-""} ]; then + echo "please set plugin name" + usage + exit 1 + fi + ;; + "") + usage + exit + ;; + *) + copy_clusterpedia_repo + build_component $1 + exit + ;; +esac + +PLUGIN_REPO=${PLUGIN_REPO:-$REPO_ROOT} +if [ $CLUSTERPEDIA_REPO == $PLUGIN_REPO ]; then + echo "please set CLUSTERPEDIA_REPO or PLUGIN_REPO" + usage + exit 1 +fi + +PLUGIN_PACKAGE="$(sed -n '1p' go.mod | awk '{print $2}')" +TMP_PLUGIN=$TMP_GOPATH/src/$PLUGIN_PACKAGE +function copy_plugin_repo() { + mkdir -p $TMP_PLUGIN && cd $TMP_PLUGIN + cp -r $PLUGIN_REPO/* . + + [ -f go.mod ] && [ ! -d ./vendor ] && GO111MODULE=on go mod vendor + + rm -rf vendor/$CLUSTERPEDIA_PACKAGE + for file in $CLUSTERPEDIA_REPO/staging/src/github.com/clusterpedia-io/*; do + if [ -d file ]; then + rm -rf vendor/github.com/clusterpedia-io/$file + fi + done + + cp -rf vendor/* $TMP_GOPATH/src + rm -rf go.mod go.sum vendor + + rm $TMP_GOPATH/src/modules.txt +} + +function build_plugin() { + local LDFLAGS=${BUILD_LDFLAGS:-""} + if [ -f ${PLUGIN_REPO}/ldflags.sh ]; then + cd ${PLUGIN_REPO} && source ./ldflags.sh + fi + + cd $TMP_PLUGIN + GOPATH=$TMP_GOPATH GO111MODULE=off CGO_ENABLED=1 CC_FOR_TARGET=$CC_FOR_TARGET CC=$CC \ + go build -ldflags "${LDFLAGS}" -buildmode=plugin -o $OUTPUT_DIR/plugins/$1 +} + +copy_plugin_repo + +copy_clusterpedia_repo + +build_plugin $2 diff --git a/ldflags.sh b/ldflags.sh new file mode 100644 index 000000000..d09c3fd0f --- /dev/null +++ b/ldflags.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') + +# Git information, used to set clusterpedia version +GIT_VERSION=$(git describe --tags --dirty) +GIT_COMMIT_HASH=$(git rev-parse HEAD) + +GIT_TREESTATE="clean" +GIT_DIFF=$(git diff --quiet >/dev/null 2>&1; if [ $? -eq 1 ]; then echo "1"; fi) +if [ "${GIT_DIFF}" == "1" ]; then + GIT_TREESTATE="dirty" +fi + +KUBE_DEPENDENCE_VERSION=$(go list -m k8s.io/kubernetes | cut -d' ' -f2) + +LDFLAGS+=" -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitVersion=${GIT_VERSION}" +LDFLAGS+=" -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitCommit=${GIT_COMMIT_HASH}" +LDFLAGS+=" -X github.com/clusterpedia-io/clusterpedia/pkg/version.gitTreeState=${GIT_TREESTATE}" +LDFLAGS+=" -X github.com/clusterpedia-io/clusterpedia/pkg/version.buildDate=${BUILD_DATE}" + +# The `client-go/pkg/version` effects the **User-Agent** when using client-go to request. +# User-Agent="/$(GIT_VERSION) ($(GOOS)/$(GOARCH)) kubernetes/$(GIT_COMMIT_HASH)[/]" +# eg. "clustersynchro-manager/0.4.0 (linux/amd64) kubernetes/fbf0f4f/clustersynchro-manager" +LDFLAGS+=" -X k8s.io/client-go/pkg/version.gitVersion=${GIT_VERSION}" +LDFLAGS+=" -X k8s.io/client-go/pkg/version.gitMajor=$(echo ${GIT_VERSION#v} | cut -d. -f1)" +LDFLAGS+=" -X k8s.io/client-go/pkg/version.gitMinor=$(echo ${GIT_VERSION#v} | cut -d. -f2)" +LDFLAGS+=" -X k8s.io/client-go/pkg/version.gitCommit=${GIT_COMMIT_HASH}" +LDFLAGS+=" -X k8s.io/client-go/pkg/version.gitTreeState=${GIT_TREESTATE}" +LDFLAGS+=" -X k8s.io/client-go/pkg/version.buildDate=${BUILD_DATE}" + + +# The `component-base/version` effects the version obtained using Kubernetes OpenAPI. +# OpenAPI Path: /apis/clusterpedia.io/v1beta1/resources/version +# $ kubectl version + +LDFLAGS+=" -X k8s.io/component-base/version.gitVersion=${KUBE_DEPENDENCE_VERSION}" +LDFLAGS+=" -X k8s.io/component-base/version.gitMajor=$(echo ${KUBE_DEPENDENCE_VERSION#v} | cut -d. -f1)" +LDFLAGS+=" -X k8s.io/component-base/version.gitMinor=$(echo ${KUBE_DEPENDENCE_VERSION#v} | cut -d. -f2)" +LDFLAGS+=" -X k8s.io/component-base/version.gitCommit=${GIT_COMMIT_HASH}" +LDFLAGS+=" -X k8s.io/component-base/version.gitTreeState=${GIT_TREESTATE}" +LDFLAGS+=" -X k8s.io/component-base/version.buildDate=${BUILD_DATE}" diff --git a/test/helper.sh b/test/helper.sh index f0a6db1ae..62779d20e 100755 --- a/test/helper.sh +++ b/test/helper.sh @@ -33,7 +33,7 @@ function check_dependencies() { # build the image for the test function build_image() { - make VERSION=test REGISTRY=localtest images + make ON_PLUGINS=true VERSION=test REGISTRY=localtest images } # load the image into the kind cluster