Merge pull request #1740 from ikaven1024/speedup

speed up docker build
This commit is contained in:
karmada-bot 2022-05-11 15:18:30 +08:00 committed by GitHub
commit 627c040f18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 251 additions and 265 deletions

View File

@ -30,6 +30,10 @@ jobs:
# 0 indicates all history for all branches and tags.
# for `git describe --tags` in Makefile.
fetch-depth: 0
- name: install Go
uses: actions/setup-go@v2
with:
go-version: 1.17.x
- name: install QEMU
uses: docker/setup-qemu-action@v1
- name: install Buildx

View File

@ -26,6 +26,10 @@ jobs:
# 0 indicates all history for all branches and tags.
# for `git describe --tags` in Makefile.
fetch-depth: 0
- name: install Go
uses: actions/setup-go@v2
with:
go-version: 1.17.x
- name: install QEMU
uses: docker/setup-qemu-action@v1
- name: install Buildx

View File

@ -29,13 +29,15 @@ jobs:
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
- name: Make release directory
run: mkdir -p _output/release
- name: Packaging...
run: tar czf kubectl-karmada-${{ matrix.goos }}-${{ matrix.goarch }}.tgz kubectl-karmada LICENSE
run: tar czf _output/release/kubectl-karmada-${{ matrix.goos }}-${{ matrix.goarch }}.tgz LICENSE -C _output/bin/${{ matrix.goos }}/${{ matrix.goarch }} kubectl-karmada
- name: Uploading assets...
if: ${{ !env.ACT }}
uses: softprops/action-gh-release@v1
with:
files: ./kubectl-karmada-${{ matrix.goos }}-${{ matrix.goarch }}.tgz
files: _output/release/kubectl-karmada-${{ matrix.goos }}-${{ matrix.goarch }}.tgz
update-krew-index:
needs: release-assests
name: Update krew-index

2
.gitignore vendored
View File

@ -10,6 +10,8 @@
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
_tmp/
_output/
# Dependency directories (remove the comment below to include it)
# vendor/

187
Makefile
View File

@ -1,7 +1,6 @@
GOOS ?= $(shell go env GOOS)
GOARCH ?= $(shell go env GOARCH)
SOURCES := $(shell find . -type f -name '*.go')
LDFLAGS='$(shell hack/version.sh)'
# Images management
@ -9,7 +8,6 @@ REGISTRY?="swr.ap-southeast-1.myhuaweicloud.com/karmada"
REGISTRY_USER_NAME?=""
REGISTRY_PASSWORD?=""
REGISTRY_SERVER_ADDRESS?=""
PLATFORMS?="linux/amd64,linux/arm64"
# Set your version by env or using latest tags from git
VERSION?=""
@ -23,70 +21,79 @@ ifeq ($(VERSION), "")
endif
endif
all: karmada-aggregated-apiserver karmada-controller-manager karmada-scheduler karmada-descheduler karmadactl kubectl-karmada karmada-webhook karmada-agent karmada-scheduler-estimator karmada-interpreter-webhook-example
TARGETS := karmada-aggregated-apiserver \
karmada-controller-manager \
karmada-scheduler \
karmada-descheduler \
karmada-webhook \
karmada-agent \
karmada-scheduler-estimator \
karmada-interpreter-webhook-example
karmada-aggregated-apiserver: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-aggregated-apiserver \
cmd/aggregated-apiserver/main.go
CTL_TARGETS := karmadactl kubectl-karmada
karmada-controller-manager: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-controller-manager \
cmd/controller-manager/controller-manager.go
# Build code.
#
# Args:
# GOOS: OS to build.
# GOARCH: Arch to build.
#
# Example:
# make
# make all
# make karmada-aggregated-apiserver
# make karmada-aggregated-apiserver GOOS=linux
CMD_TARGET=$(TARGETS) $(CTL_TARGETS)
karmada-scheduler: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-scheduler \
cmd/scheduler/main.go
.PHONY: all
all: $(CMD_TARGET)
karmada-descheduler: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-descheduler \
cmd/descheduler/main.go
.PHONY: $(CMD_TARGET)
$(CMD_TARGET): $(SOURCES)
LDFLAGS=$(LDFLAGS) BUILD_PLATFORMS=$(GOOS)/$(GOARCH) hack/build.sh $@
karmadactl: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmadactl \
cmd/karmadactl/karmadactl.go
# Build image.
#
# Args:
# GOARCH: Arch to build.
# OUTPUT_TYPE: Destination to save image(docker/registry).
#
# Example:
# make image
# make image-aggregated-apiserver
# make image-aggregated-apiserver GOARCH=arm64
IMAGE_TARGET=$(addprefix image-, $(TARGETS))
.PHONY: $(IMAGE_TARGET)
$(IMAGE_TARGET):
set -e;\
target=$$(echo $(subst image-,,$@));\
make $$target GOOS=linux;\
VERSION=$(VERSION) REGISTRY=$(REGISTRY) BUILD_PLATFORMS=linux/$(GOARCH) hack/docker.sh $$target
kubectl-karmada: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o kubectl-karmada \
cmd/kubectl-karmada/kubectl-karmada.go
images: $(IMAGE_TARGET)
karmada-webhook: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-webhook \
cmd/webhook/main.go
# Build and push multi-platform image to DockerHub
#
# Example
# make multi-platform-images
# make mp-image-karmada-aggregated-apiserver
MP_TARGET=$(addprefix mp-image-, $(TARGETS))
.PHONY: $(MP_TARGET)
$(MP_TARGET):
set -e;\
target=$$(echo $(subst mp-image-,,$@));\
make $$target GOOS=linux GOARCH=amd64;\
make $$target GOOS=linux GOARCH=arm64;\
VERSION=$(VERSION) REGISTRY=$(REGISTRY) \
OUTPUT_TYPE=registry \
BUILD_PLATFORMS=linux/amd64,linux/arm64 \
hack/docker.sh $$target
karmada-agent: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-agent \
cmd/agent/main.go
karmada-scheduler-estimator: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-scheduler-estimator \
cmd/scheduler-estimator/main.go
karmada-interpreter-webhook-example: $(SOURCES)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build \
-ldflags $(LDFLAGS) \
-o karmada-interpreter-webhook-example \
examples/customresourceinterpreter/webhook/main.go
multi-platform-images: $(MP_TARGET)
.PHONY: clean
clean:
rm -rf karmada-aggregated-apiserver karmada-controller-manager karmada-scheduler karmada-descheduler karmadactl kubectl-karmada karmada-webhook karmada-agent karmada-scheduler-estimator karmada-interpreter-webhook-example
rm -rf _tmp _output
.PHONY: update
update:
@ -102,32 +109,6 @@ test:
go test --race --v ./cmd/...
go test --race --v ./examples/...
images: image-karmada-aggregated-apiserver image-karmada-controller-manager image-karmada-scheduler image-karmada-descheduler image-karmada-webhook image-karmada-agent image-karmada-scheduler-estimator image-karmada-interpreter-webhook-example
image-karmada-aggregated-apiserver:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-aggregated-apiserver
image-karmada-controller-manager:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-controller-manager
image-karmada-scheduler:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-scheduler
image-karmada-descheduler:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-descheduler
image-karmada-webhook:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-webhook
image-karmada-agent:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-agent
image-karmada-scheduler-estimator:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-scheduler-estimator
image-karmada-interpreter-webhook-example:
VERSION=$(VERSION) REGISTRY=$(REGISTRY) hack/docker.sh karmada-interpreter-webhook-example
upload-images: images
@echo "push images to $(REGISTRY)"
ifneq ($(REGISTRY_USER_NAME), "")
@ -141,45 +122,3 @@ endif
docker push ${REGISTRY}/karmada-scheduler-estimator:${VERSION}
docker push ${REGISTRY}/karmada-interpreter-webhook-example:${VERSION}
docker push ${REGISTRY}/karmada-aggregated-apiserver:${VERSION}
# Build and push multi-platform image to DockerHub
mp-image-karmada-controller-manager:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-controller-manager:${VERSION} --file=cluster/images/karmada-controller-manager/Dockerfile .
# Build and push multi-platform image to DockerHub
mp-image-karmada-scheduler:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-scheduler:${VERSION} --file=cluster/images/karmada-scheduler/Dockerfile .
# Build and push multi-platform image to DockerHub
mp-image-karmada-descheduler:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-descheduler:${VERSION} --file=cluster/images/karmada-descheduler/Dockerfile .
# Build and push multi-platform image to DockerHub
mp-image-karmada-webhook:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-webhook:${VERSION} --file=cluster/images/karmada-webhook/Dockerfile .
# Build and push multi-platform image to DockerHub
mp-image-karmada-agent:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-agent:${VERSION} --file=cluster/images/karmada-agent/Dockerfile .
# Build and push multi-platform image to DockerHub
mp-image-karmada-scheduler-estimator:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-scheduler-estimator:${VERSION} --file=cluster/images/karmada-scheduler-estimator/Dockerfile .
# Build and push multi-platform image to DockerHub
mp-image-karmada-interpreter-webhook-example:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-interpreter-webhook-example:${VERSION} --file=cluster/images/karmada-interpreter-webhook-example/Dockerfile .
# Build and push multi-platform image to DockerHub
mp-image-karmada-aggregated-apiserver:
docker buildx build --push --platform=${PLATFORMS} --tag=karmada/karmada-aggregated-apiserver:${VERSION} --file=cluster/images/karmada-aggregated-apiserver/Dockerfile .
# Build and push multi-platform images to DockerHub.
multi-platform-images: mp-image-karmada-controller-manager \
mp-image-karmada-scheduler \
mp-image-karmada-descheduler \
mp-image-karmada-webhook \
mp-image-karmada-agent \
mp-image-karmada-scheduler-estimator \
mp-image-karmada-interpreter-webhook-example \
mp-image-karmada-aggregated-apiserver

View File

@ -0,0 +1,7 @@
FROM alpine:3.15.1
ARG BINARY
RUN apk add --no-cache ca-certificates
COPY ${BINARY} /bin/${BINARY}

View File

@ -0,0 +1,8 @@
FROM alpine:3.15.1
ARG BINARY
ARG TARGETPLATFORM
RUN apk add --no-cache ca-certificates
COPY ${TARGETPLATFORM}/${BINARY} /bin/${BINARY}

View File

@ -1,16 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-agent
RUN mv /go/src/github.com/karmada-io/karmada/karmada-agent /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-agent /bin/karmada-agent
CMD ["/bin/karmada-agent"]

View File

@ -1,16 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-aggregated-apiserver
RUN mv /go/src/github.com/karmada-io/karmada/karmada-aggregated-apiserver /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-aggregated-apiserver /bin/karmada-aggregated-apiserver
CMD ["/bin/karmada-aggregated-apiserver"]

View File

@ -1,16 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-controller-manager
RUN mv /go/src/github.com/karmada-io/karmada/karmada-controller-manager /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-controller-manager /bin/karmada-controller-manager
CMD ["/bin/karmada-controller-manager"]

View File

@ -1,16 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-descheduler
RUN mv /go/src/github.com/karmada-io/karmada/karmada-descheduler /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-descheduler /bin/karmada-descheduler
CMD ["/bin/karmada-descheduler"]

View File

@ -1,17 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-interpreter-webhook-example
RUN mv /go/src/github.com/karmada-io/karmada/karmada-interpreter-webhook-example /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-interpreter-webhook-example /bin/karmada-interpreter-webhook-example
CMD ["/bin/karmada-interpreter-webhook-example"]

View File

@ -1,17 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-scheduler-estimator
RUN mv /go/src/github.com/karmada-io/karmada/karmada-scheduler-estimator /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-scheduler-estimator /bin/karmada-scheduler-estimator
CMD ["/bin/karmada-scheduler-estimator"]

View File

@ -1,17 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-scheduler
RUN mv /go/src/github.com/karmada-io/karmada/karmada-scheduler /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-scheduler /bin/karmada-scheduler
CMD ["/bin/karmada-scheduler"]

View File

@ -1,16 +0,0 @@
FROM golang:1.17 AS builder
WORKDIR /go/src/github.com/karmada-io/karmada
COPY . /go/src/github.com/karmada-io/karmada
RUN make karmada-webhook
RUN mv /go/src/github.com/karmada-io/karmada/karmada-webhook /bin/
FROM alpine:3.15.1
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/karmada-webhook /bin/karmada-webhook
CMD ["/bin/karmada-webhook"]

55
hack/build.sh Executable file
View File

@ -0,0 +1,55 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
# This script builds go components.
# You can set the platform to build with BUILD_PLATFORMS, with format: `<os>/<arch>`
# And binaries will be put in `_output/<os>/<arch>/`
#
# Usage:
# hack/build.sh <target>
# Args:
# $1: target to build
# Environments:
# BUILD_PLATFORMS: platforms to build. You can set one or more platforms separated by comma.
# e.g.: linux/amd64,linux/arm64
# LDFLAGS pass to the `-ldflags` parameter of go build
# Examples:
# hack/build.sh karmada-aggregated-apiserver
# BUILD_PLATFORMS=linux/amd64,linux/arm64 hack/build.sh karmada-aggregated-apiserver
REPO_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${REPO_ROOT}/hack/util.sh"
function build_binary() {
local -r target=$1
IFS="," read -ra platforms <<< "${BUILD_PLATFORMS:-}"
if [[ ${#platforms[@]} -eq 0 ]]; then
platforms=("$(util:host_platform)")
fi
for platform in "${platforms[@]}"; do
echo "!!! Building ${target} for ${platform}:"
build_binary_for_platform "${target}" "${platform}"
done
}
function build_binary_for_platform() {
local -r target=$1
local -r platform=$2
local -r os=${platform%/*}
local -r arch=${platform##*/}
local gopkg="${KARMADA_GO_PACKAGE}/${KARMADA_TARGET_SOURCE[$target]}"
set -x
CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go build \
-ldflags "${LDFLAGS:-}" \
-o "_output/bin/${platform}/$target" \
"${gopkg}"
set +x
}
build_binary "$@"

View File

@ -5,6 +5,24 @@ set -o nounset
set -o pipefail
# This script holds docker related functions.
# You can set the platform to build with BUILD_PLATFORMS, with format: `<os>/<arch>`
# When `OUTPUT_TYPE=docker` is set, `BUILD_PLATFORMS` cannot be set with multi platforms.
# See: https://github.com/docker/buildx/issues/59
#
# Usage:
# hack/docker.sh <target>
# Args:
# $1: target to build
# Environments:
# BUILD_PLATFORMS: platforms to build. You can set one or more platforms separated by comma.
# e.g.: linux/amd64,linux/arm64
# OUTPUT_TYPE Destination to save image(`docker`/`registry`/`local,dest=path`, default is `docker`).
# REGISTRY image registry
# VERSION image version
# Examples:
# hack/docker.sh karmada-aggregated-apiserver
# BUILD_PLATFORMS=linux/amd64 hack/docker.sh karmada-aggregated-apiserver
# OUTPUT_TYPE=registry BUILD_PLATFORMS=linux/amd64,linux/arm64 hack/docker.sh karmada-aggregated-apiserver
REPO_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${REPO_ROOT}/hack/util.sh"
@ -13,8 +31,73 @@ REGISTRY=${REGISTRY:-"swr.ap-southeast-1.myhuaweicloud.com/karmada"}
VERSION=${VERSION:="unknown"}
function build_images() {
local target="$1"
docker build -t ${REGISTRY}/${target}:${VERSION} -f ${REPO_ROOT}/cluster/images/${target}/Dockerfile ${REPO_ROOT}
local -ra target=$1
local -r output_type=${OUTPUT_TYPE:-docker}
local platforms="${BUILD_PLATFORMS:-"$(util:host_platform)"}"
# Preferentially use `docker build`. If we are building multi platform,
# or cross building, change to `docker buildx build`
cross=$(isCross "${platforms}")
if [[ "${cross}" == "true" ]]; then
build_cross_image "${output_type}" "${target}" "${platforms}"
else
build_local_image "${output_type}" "${target}" "${platforms}"
fi
}
function build_local_image() {
local -r output_type=$1
local -r target=$2
local -r platform=$3
local -r image_name="${REGISTRY}/${target}:${VERSION}"
echo "Building image for ${platform}: ${image_name}"
set -x
docker build --build-arg BINARY="${target}" \
--tag "${image_name}" \
--file "${REPO_ROOT}/cluster/images/Dockerfile" \
"${REPO_ROOT}/_output/bin/${platform}"
set +x
if [[ "$output_type" == "registry" ]]; then
docker push "${image_name}"
fi
}
function build_cross_image() {
local -r output_type=$1
local -r target=$2
local -r platforms=$3
local -r image_name="${REGISTRY}/${target}:${VERSION}"
echo "Cross building image for ${platforms}: ${image_name}"
set -x
docker buildx build --output=type="${output_type}" \
--platform "${platforms}" \
--build-arg BINARY="${target}" \
--tag "${image_name}" \
--file "${REPO_ROOT}/cluster/images/buildx.Dockerfile" \
"${REPO_ROOT}/_output/bin"
set +x
}
function isCross() {
local platforms=$1
IFS="," read -ra platform_array <<< "${platforms}"
if [[ ${#platform_array[@]} -ne 1 ]]; then
echo true
return
fi
local -r arch=${platforms##*/}
if [[ "$arch" == $(go env GOHOSTARCH) ]]; then
echo false
else
echo true
fi
}
build_images $@

View File

@ -42,12 +42,8 @@ for registry_file in "${registry_files[@]}"; do
done
# set mirror registry in the dockerfile of components of karmada
dockerfile_list=( # Dockerfile files need to be replaced
"cluster/images/karmada-controller-manager/Dockerfile"
"cluster/images/karmada-agent/Dockerfile"
"cluster/images/karmada-scheduler-estimator/Dockerfile"
"cluster/images/karmada-scheduler/Dockerfile"
"cluster/images/karmada-webhook/Dockerfile"
"cluster/images/karmada-aggregated-apiserver/Dockerfile"
"cluster/images/Dockerfile"
"cluster/images/buildx.Dockerfile"
)
for dockerfile in "${dockerfile_list[@]}"; do
grep 'mirrors.ustc.edu.cn' ${REPO_ROOT}/${dockerfile} > /dev/null || sed -i'' -e "s#FROM alpine:3.15.1#FROM alpine:3.15.1\nRUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.15/main/ > /etc/apk/repositories#" ${REPO_ROOT}/${dockerfile}

View File

@ -21,6 +21,19 @@ KARMADA_GO_PACKAGE="github.com/karmada-io/karmada"
MIN_Go_VERSION=go1.17.0
declare -A KARMADA_TARGET_SOURCE=(
[karmada-aggregated-apiserver]=cmd/aggregated-apiserver
[karmada-controller-manager]=cmd/controller-manager
[karmada-scheduler]=cmd/scheduler
[karmada-descheduler]=cmd/descheduler
[karmadactl]=cmd/karmadactl
[kubectl-karmada]=cmd/kubectl-karmada
[karmada-webhook]=cmd/webhook
[karmada-agent]=cmd/agent
[karmada-scheduler-estimator]=cmd/scheduler-estimator
[karmada-interpreter-webhook-example]=examples/customresourceinterpreter/webhook
)
#https://textkool.com/en/ascii-art-generator?hl=default&vl=default&font=DOS%20Rebel&text=KARMADA
KARMADA_GREETING='
------------------------------------------------------------------------------------------------------
@ -592,3 +605,7 @@ function util:create_gopath_tree() {
ln -snf "${repo_root}" "${go_pkg_dir}"
fi
}
function util:host_platform() {
echo "$(go env GOHOSTOS)/$(go env GOHOSTARCH)"
}