From e12aef136a44e270bf4db410ee3b38906ec5ba97 Mon Sep 17 00:00:00 2001 From: Prashant Shahi Date: Sat, 7 Oct 2023 21:23:53 +0545 Subject: [PATCH] perf(query-service): :hammer: improve backend build time (#3658) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf(query-service): :hammer: improve backend build time * chore(query-service): 🔧 address comments on image build time --------- Signed-off-by: Prashant Shahi --- Makefile | 69 ++++++++++++------- .../docker-compose-local.yaml | 6 +- ee/query-service/Dockerfile | 37 +++------- pkg/query-service/Dockerfile | 38 ++-------- 4 files changed, 63 insertions(+), 87 deletions(-) diff --git a/Makefile b/Makefile index 0d46bfa161..01ac0e33ab 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ BUILD_HASH ?= $(shell git rev-parse --short HEAD) BUILD_TIME ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") BUILD_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD) DEV_LICENSE_SIGNOZ_IO ?= https://staging-license.signoz.io/api/v1 +DEV_BUILD ?= "" # set to any non-empty value to enable dev build # Internal variables or constants. FRONTEND_DIRECTORY ?= frontend @@ -15,15 +16,15 @@ QUERY_SERVICE_DIRECTORY ?= pkg/query-service EE_QUERY_SERVICE_DIRECTORY ?= ee/query-service STANDALONE_DIRECTORY ?= deploy/docker/clickhouse-setup SWARM_DIRECTORY ?= deploy/docker-swarm/clickhouse-setup -LOCAL_GOOS ?= $(shell go env GOOS) -LOCAL_GOARCH ?= $(shell go env GOARCH) + +GOOS ?= $(shell go env GOOS) +GOARCH ?= $(shell go env GOARCH) +GOPATH ?= $(shell go env GOPATH) REPONAME ?= signoz DOCKER_TAG ?= $(subst v,,$(BUILD_VERSION)) - FRONTEND_DOCKER_IMAGE ?= frontend QUERY_SERVICE_DOCKER_IMAGE ?= query-service -DEV_BUILD ?= "" # Build-time Go variables PACKAGE?=go.signoz.io/signoz @@ -69,49 +70,71 @@ build-push-frontend: build-frontend-static docker buildx build --file Dockerfile --progress plain --push --platform linux/arm64,linux/amd64 \ --tag $(REPONAME)/$(FRONTEND_DOCKER_IMAGE):$(DOCKER_TAG) . +# Steps to build static binary of query service +.PHONY: build-query-service-static +build-query-service-static: + @echo "------------------" + @echo "--> Building query-service static binary" + @echo "------------------" + @if [ $(DEV_BUILD) != "" ]; then \ + cd $(QUERY_SERVICE_DIRECTORY) && \ + CGO_ENABLED=1 go build -tags timetzdata -a -o ./bin/query-service-${GOOS}-${GOARCH} \ + -ldflags "-linkmode external -extldflags '-static' -s -w ${LD_FLAGS} ${DEV_LD_FLAGS}"; \ + else \ + cd $(QUERY_SERVICE_DIRECTORY) && \ + CGO_ENABLED=1 go build -tags timetzdata -a -o ./bin/query-service-${GOOS}-${GOARCH} \ + -ldflags "-linkmode external -extldflags '-static' -s -w ${LD_FLAGS}"; \ + fi + +.PHONY: build-query-service-static-amd64 +build-query-service-static-amd64: + make GOARCH=amd64 build-query-service-static + +.PHONY: build-query-service-static-arm64 +build-query-service-static-arm64: + make CC=aarch64-linux-gnu-gcc GOARCH=arm64 build-query-service-static + +# Steps to build static binary of query service for all platforms +.PHONY: build-query-service-static-all +build-query-service-static-all: build-query-service-static-amd64 build-query-service-static-arm64 + # Steps to build and push docker image of query service -.PHONY: build-query-service-amd64 build-push-query-service +.PHONY: build-query-service-amd64 build-push-query-service # Step to build docker image of query service in amd64 (used in build pipeline) -build-query-service-amd64: +build-query-service-amd64: build-query-service-static-amd64 @echo "------------------" @echo "--> Building query-service docker image for amd64" @echo "------------------" @docker build --file $(QUERY_SERVICE_DIRECTORY)/Dockerfile \ - -t $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) \ - --build-arg TARGETPLATFORM="linux/amd64" --build-arg LD_FLAGS="$(LD_FLAGS)" . + --tag $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) \ + --build-arg TARGETPLATFORM="linux/amd64" . # Step to build and push docker image of query in amd64 and arm64 (used in push pipeline) -build-push-query-service: +build-push-query-service: build-query-service-static-all @echo "------------------" @echo "--> Building and pushing query-service docker image" @echo "------------------" @docker buildx build --file $(QUERY_SERVICE_DIRECTORY)/Dockerfile --progress plain \ - --push --platform linux/arm64,linux/amd64 --build-arg LD_FLAGS="$(LD_FLAGS)" \ + --push --platform linux/arm64,linux/amd64 \ --tag $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) . # Step to build EE docker image of query service in amd64 (used in build pipeline) -build-ee-query-service-amd64: +build-ee-query-service-amd64: build-query-service-static-amd64 @echo "------------------" @echo "--> Building query-service docker image for amd64" @echo "------------------" - @if [ $(DEV_BUILD) != "" ]; then \ - docker build --file $(EE_QUERY_SERVICE_DIRECTORY)/Dockerfile \ - -t $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) \ - --build-arg TARGETPLATFORM="linux/amd64" --build-arg LD_FLAGS="${LD_FLAGS} ${DEV_LD_FLAGS}" .; \ - else \ - docker build --file $(EE_QUERY_SERVICE_DIRECTORY)/Dockerfile \ - -t $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) \ - --build-arg TARGETPLATFORM="linux/amd64" --build-arg LD_FLAGS="$(LD_FLAGS)" .; \ - fi + @docker build --file $(EE_QUERY_SERVICE_DIRECTORY)/Dockerfile \ + --tag $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) \ + --build-arg TARGETPLATFORM="linux/amd64" . # Step to build and push EE docker image of query in amd64 and arm64 (used in push pipeline) -build-push-ee-query-service: +build-push-ee-query-service: build-query-service-static-all @echo "------------------" @echo "--> Building and pushing query-service docker image" @echo "------------------" @docker buildx build --file $(EE_QUERY_SERVICE_DIRECTORY)/Dockerfile \ --progress plain --push --platform linux/arm64,linux/amd64 \ - --build-arg LD_FLAGS="$(LD_FLAGS)" --tag $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) . + --tag $(REPONAME)/$(QUERY_SERVICE_DOCKER_IMAGE):$(DOCKER_TAG) . dev-setup: mkdir -p /var/lib/signoz @@ -122,7 +145,7 @@ dev-setup: @echo "------------------" run-local: - @LOCAL_GOOS=$(LOCAL_GOOS) LOCAL_GOARCH=$(LOCAL_GOARCH) docker-compose -f \ + @docker-compose -f \ $(STANDALONE_DIRECTORY)/docker-compose-core.yaml -f $(STANDALONE_DIRECTORY)/docker-compose-local.yaml \ up --build -d diff --git a/deploy/docker/clickhouse-setup/docker-compose-local.yaml b/deploy/docker/clickhouse-setup/docker-compose-local.yaml index 2c7b9a5c46..78aa72ff75 100644 --- a/deploy/docker/clickhouse-setup/docker-compose-local.yaml +++ b/deploy/docker/clickhouse-setup/docker-compose-local.yaml @@ -8,7 +8,7 @@ services: dockerfile: "./Dockerfile" args: LDFLAGS: "" - TARGETPLATFORM: "${LOCAL_GOOS}/${LOCAL_GOARCH}" + TARGETPLATFORM: "${GOOS}/${GOARCH}" container_name: signoz-query-service environment: - ClickHouseUrl=tcp://clickhouse:9000 @@ -52,8 +52,8 @@ services: context: "../../../frontend" dockerfile: "./Dockerfile" args: - TARGETOS: "${LOCAL_GOOS}" - TARGETPLATFORM: "${LOCAL_GOARCH}" + TARGETOS: "${GOOS}" + TARGETPLATFORM: "${GOARCH}" container_name: signoz-frontend environment: - FRONTEND_API_ENDPOINT=http://query-service:8080 diff --git a/ee/query-service/Dockerfile b/ee/query-service/Dockerfile index 258b0869f7..09e2701aa5 100644 --- a/ee/query-service/Dockerfile +++ b/ee/query-service/Dockerfile @@ -1,43 +1,23 @@ -FROM golang:1.21-bookworm AS builder - -# LD_FLAGS is passed as argument from Makefile. It will be empty, if no argument passed -ARG LD_FLAGS -ARG TARGETPLATFORM - -ENV CGO_ENABLED=1 -ENV GOPATH=/go - -RUN export GOOS=$(echo ${TARGETPLATFORM} | cut -d / -f1) && \ - export GOARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) - -# Prepare and enter src directory -WORKDIR /go/src/github.com/signoz/signoz - -# Add the sources and proceed with build -ADD . . -RUN cd ee/query-service \ - && go build -tags timetzdata -a -o ./bin/query-service \ - -ldflags "-linkmode external -extldflags '-static' -s -w $LD_FLAGS" \ - && chmod +x ./bin/query-service - - # use a minimal alpine image -FROM alpine:3.16.7 +FROM alpine:3.17 # Add Maintainer Info LABEL maintainer="signoz" +# define arguments that can be passed during build time +ARG TARGETOS TARGETARCH + # add ca-certificates in case you need them RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* # set working directory WORKDIR /root -# copy the binary from builder -COPY --from=builder /go/src/github.com/signoz/signoz/ee/query-service/bin/query-service . +# copy the query-service binary +COPY ee/pkg/query-service/bin/query-service-${TARGETOS}-${TARGETARCH} /root/query-service # copy prometheus YAML config -COPY pkg/query-service/config/prometheus.yml /root/config/prometheus.yml +COPY ee/pkg/query-service/config/prometheus.yml /root/config/prometheus.yml # Make query-service executable for non-root users RUN chmod 755 /root /root/query-service @@ -45,7 +25,6 @@ RUN chmod 755 /root /root/query-service # run the binary ENTRYPOINT ["./query-service"] -CMD ["-config", "../config/prometheus.yml"] -# CMD ["./query-service -config /root/config/prometheus.yml"] +CMD ["-config", "/root/config/prometheus.yml"] EXPOSE 8080 diff --git a/pkg/query-service/Dockerfile b/pkg/query-service/Dockerfile index e616ad5d12..9d62c5cc62 100644 --- a/pkg/query-service/Dockerfile +++ b/pkg/query-service/Dockerfile @@ -1,45 +1,20 @@ -FROM golang:1.21-bookworm AS builder - -# LD_FLAGS is passed as argument from Makefile. It will be empty, if no argument passed -ARG LD_FLAGS -ARG TARGETPLATFORM - -ENV CGO_ENABLED=1 -ENV GOPATH=/go - -RUN export GOOS=$(echo ${TARGETPLATFORM} | cut -d / -f1) && \ - export GOARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) - -# Prepare and enter src directory -WORKDIR /go/src/github.com/signoz/signoz - -# Cache dependencies -ADD go.mod . -ADD go.sum . -RUN go mod download -x - -# Add the sources and proceed with build -ADD . . -RUN cd pkg/query-service \ - && go build -tags timetzdata -a -o ./bin/query-service \ - -ldflags "-linkmode external -extldflags '-static' -s -w $LD_FLAGS" \ - && chmod +x ./bin/query-service - - # use a minimal alpine image -FROM alpine:3.16.7 +FROM alpine:3.17 # Add Maintainer Info LABEL maintainer="signoz" +# define arguments that can be passed during build time +ARG TARGETOS TARGETARCH + # add ca-certificates in case you need them RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* # set working directory WORKDIR /root -# copy the binary from builder -COPY --from=builder /go/src/github.com/signoz/signoz/pkg/query-service/bin/query-service . +# copy the query-service binary +COPY pkg/query-service/bin/query-service-${TARGETOS}-${TARGETARCH} /root/query-service # copy prometheus YAML config COPY pkg/query-service/config/prometheus.yml /root/config/prometheus.yml @@ -51,6 +26,5 @@ RUN chmod 755 /root /root/query-service ENTRYPOINT ["./query-service"] CMD ["-config", "/root/config/prometheus.yml"] -# CMD ["./query-service -config /root/config/prometheus.yml"] EXPOSE 8080