From adf26e720279fab16c40411659bdaa5eff792028 Mon Sep 17 00:00:00 2001 From: yingjinhui Date: Sun, 8 May 2022 14:16:38 +0800 Subject: [PATCH] speed up docker build Signed-off-by: yingjinhui --- .github/workflows/dockerhub-latest-image.yml | 4 + .../workflows/dockerhub-released-image.yml | 4 + .github/workflows/release.yml | 6 +- .gitignore | 2 + Makefile | 187 ++++++------------ cluster/images/Dockerfile | 7 + cluster/images/buildx.Dockerfile | 8 + cluster/images/karmada-agent/Dockerfile | 16 -- .../karmada-aggregated-apiserver/Dockerfile | 16 -- .../karmada-controller-manager/Dockerfile | 16 -- cluster/images/karmada-descheduler/Dockerfile | 16 -- .../Dockerfile | 17 -- .../karmada-scheduler-estimator/Dockerfile | 17 -- cluster/images/karmada-scheduler/Dockerfile | 17 -- cluster/images/karmada-webhook/Dockerfile | 16 -- hack/build.sh | 55 ++++++ hack/docker.sh | 87 +++++++- hack/local-up-karmada.sh | 8 +- hack/util.sh | 17 ++ 19 files changed, 251 insertions(+), 265 deletions(-) create mode 100644 cluster/images/Dockerfile create mode 100644 cluster/images/buildx.Dockerfile delete mode 100644 cluster/images/karmada-agent/Dockerfile delete mode 100644 cluster/images/karmada-aggregated-apiserver/Dockerfile delete mode 100644 cluster/images/karmada-controller-manager/Dockerfile delete mode 100644 cluster/images/karmada-descheduler/Dockerfile delete mode 100644 cluster/images/karmada-interpreter-webhook-example/Dockerfile delete mode 100644 cluster/images/karmada-scheduler-estimator/Dockerfile delete mode 100644 cluster/images/karmada-scheduler/Dockerfile delete mode 100644 cluster/images/karmada-webhook/Dockerfile create mode 100755 hack/build.sh diff --git a/.github/workflows/dockerhub-latest-image.yml b/.github/workflows/dockerhub-latest-image.yml index 24d2d572e..4c482d382 100644 --- a/.github/workflows/dockerhub-latest-image.yml +++ b/.github/workflows/dockerhub-latest-image.yml @@ -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 diff --git a/.github/workflows/dockerhub-released-image.yml b/.github/workflows/dockerhub-released-image.yml index fa87a1591..0246f5716 100644 --- a/.github/workflows/dockerhub-released-image.yml +++ b/.github/workflows/dockerhub-released-image.yml @@ -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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 13fce8de6..fab0365a1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 diff --git a/.gitignore b/.gitignore index bd5d09991..a91416540 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/Makefile b/Makefile index ed2130c73..ee8c2b61c 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/cluster/images/Dockerfile b/cluster/images/Dockerfile new file mode 100644 index 000000000..6b6dfac65 --- /dev/null +++ b/cluster/images/Dockerfile @@ -0,0 +1,7 @@ +FROM alpine:3.15.1 + +ARG BINARY + +RUN apk add --no-cache ca-certificates + +COPY ${BINARY} /bin/${BINARY} diff --git a/cluster/images/buildx.Dockerfile b/cluster/images/buildx.Dockerfile new file mode 100644 index 000000000..cc0a612aa --- /dev/null +++ b/cluster/images/buildx.Dockerfile @@ -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} diff --git a/cluster/images/karmada-agent/Dockerfile b/cluster/images/karmada-agent/Dockerfile deleted file mode 100644 index fd90be122..000000000 --- a/cluster/images/karmada-agent/Dockerfile +++ /dev/null @@ -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"] diff --git a/cluster/images/karmada-aggregated-apiserver/Dockerfile b/cluster/images/karmada-aggregated-apiserver/Dockerfile deleted file mode 100644 index 23dd500be..000000000 --- a/cluster/images/karmada-aggregated-apiserver/Dockerfile +++ /dev/null @@ -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"] diff --git a/cluster/images/karmada-controller-manager/Dockerfile b/cluster/images/karmada-controller-manager/Dockerfile deleted file mode 100644 index fb2892f79..000000000 --- a/cluster/images/karmada-controller-manager/Dockerfile +++ /dev/null @@ -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"] diff --git a/cluster/images/karmada-descheduler/Dockerfile b/cluster/images/karmada-descheduler/Dockerfile deleted file mode 100644 index 5beaf7b24..000000000 --- a/cluster/images/karmada-descheduler/Dockerfile +++ /dev/null @@ -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"] diff --git a/cluster/images/karmada-interpreter-webhook-example/Dockerfile b/cluster/images/karmada-interpreter-webhook-example/Dockerfile deleted file mode 100644 index 558f93b55..000000000 --- a/cluster/images/karmada-interpreter-webhook-example/Dockerfile +++ /dev/null @@ -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"] - diff --git a/cluster/images/karmada-scheduler-estimator/Dockerfile b/cluster/images/karmada-scheduler-estimator/Dockerfile deleted file mode 100644 index 8b665c901..000000000 --- a/cluster/images/karmada-scheduler-estimator/Dockerfile +++ /dev/null @@ -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"] - diff --git a/cluster/images/karmada-scheduler/Dockerfile b/cluster/images/karmada-scheduler/Dockerfile deleted file mode 100644 index 6a01f9832..000000000 --- a/cluster/images/karmada-scheduler/Dockerfile +++ /dev/null @@ -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"] - diff --git a/cluster/images/karmada-webhook/Dockerfile b/cluster/images/karmada-webhook/Dockerfile deleted file mode 100644 index fb14b314b..000000000 --- a/cluster/images/karmada-webhook/Dockerfile +++ /dev/null @@ -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"] diff --git a/hack/build.sh b/hack/build.sh new file mode 100755 index 000000000..06efd3307 --- /dev/null +++ b/hack/build.sh @@ -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: `/` +# And binaries will be put in `_output///` +# +# Usage: +# hack/build.sh +# 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 "$@" diff --git a/hack/docker.sh b/hack/docker.sh index 76e65bd43..683c4daf9 100755 --- a/hack/docker.sh +++ b/hack/docker.sh @@ -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: `/` +# 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 +# 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 $@ diff --git a/hack/local-up-karmada.sh b/hack/local-up-karmada.sh index 217951050..c9adf2a67 100755 --- a/hack/local-up-karmada.sh +++ b/hack/local-up-karmada.sh @@ -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} diff --git a/hack/util.sh b/hack/util.sh index 6f3b40f46..81ff3d660 100755 --- a/hack/util.sh +++ b/hack/util.sh @@ -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)" +}