Skip to content

Commit

Permalink
add build scripts that support the go plugin
Browse files Browse the repository at this point in the history
Signed-off-by: Iceber Gu <[email protected]>
  • Loading branch information
Iceber committed Nov 3, 2022
1 parent 0c547be commit 25131d6
Show file tree
Hide file tree
Showing 11 changed files with 363 additions and 87 deletions.
1 change: 0 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
*
!/bin
5 changes: 2 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
9 changes: 5 additions & 4 deletions .github/workflows/push-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
21 changes: 17 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -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}
162 changes: 88 additions & 74 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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="<bin name>/$(GIT_VERSION) ($(GOOS)/$(GOARCH)) kubernetes/$(GIT_COMMIT_HASH)[/<component name>]"
# 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:
Expand Down Expand Up @@ -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 \
Expand All @@ -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 \
Expand All @@ -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 \
Expand All @@ -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 \
Expand All @@ -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
Expand Down
15 changes: 15 additions & 0 deletions builder.dockerfile
Original file line number Diff line number Diff line change
@@ -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 /
Empty file added builder.dockerfile.dockerignore
Empty file.
25 changes: 25 additions & 0 deletions hack/builder-nocgo.sh
Original file line number Diff line number Diff line change
@@ -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
Loading

0 comments on commit 25131d6

Please sign in to comment.