From 42b239bb51ea4f2695e1829fef4352d32ad066dc Mon Sep 17 00:00:00 2001 From: Naeel Date: Sat, 25 Apr 2026 15:14:37 +0300 Subject: [PATCH] feat: custom go-builder-fast with prebuilt stdlib for plugin mode --- go-builder/Dockerfile | 18 ++++++++++++++++++ go-builder/build.sh | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 go-builder/Dockerfile create mode 100644 go-builder/build.sh diff --git a/go-builder/Dockerfile b/go-builder/Dockerfile new file mode 100644 index 0000000..35ddaae --- /dev/null +++ b/go-builder/Dockerfile @@ -0,0 +1,18 @@ +ARG GO_VERSION=1.25 +FROM ghcr.io/fission/builder AS fission-builder +FROM golang:${GO_VERSION} + +ENV GOPATH=/usr +ENV GO111MODULE=on +ENV GOTOOLCHAIN=local + +WORKDIR ${GOPATH} + +COPY --from=fission-builder /builder /builder + +# Prebuild stdlib для -buildmode=plugin → бьём кэш в образе +# После этого go build -buildmode=plugin НЕ БУДЕТ перекомпилировать stdlib +RUN go install -buildmode=plugin std + +ADD build.sh /usr/local/bin/build +RUN chmod +x /usr/local/bin/build diff --git a/go-builder/build.sh b/go-builder/build.sh new file mode 100644 index 0000000..c904d36 --- /dev/null +++ b/go-builder/build.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -eux + +srcDir=${GOPATH}/src/$(basename ${SRC_PKG}) +trap "rm -rf ${srcDir}" EXIT + +version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; } + +if [ -d ${SRC_PKG} ]; then + echo "Building in directory ${srcDir}" + ln -sf ${SRC_PKG} ${srcDir} +elif [ -f ${SRC_PKG} ]; then + echo "Building file ${SRC_PKG} in ${srcDir}" + mkdir -p ${srcDir} + cp ${SRC_PKG} ${srcDir}/function.go +fi + +cd ${srcDir} + +if [ -f "go.mod" ]; then + go mod download +else + export GO111MODULE="on" + go mod init + go mod tidy +fi + +GOFLAGS="-buildmode=plugin" + +if [ -d "vendor" ] && version_ge ${GOLANG_VERSION} "1.12"; then + GOFLAGS="${GOFLAGS} -mod=vendor" +fi + +go build ${GOFLAGS} -o ${DEPLOY_PKG} .