fix(builder/go1.23): add require sless/fn/handler to server/go.mod at build time

go.work replace rule requires explicit require directive in server/go.mod.
Patch appended at kaniko build time - no base image rebuild needed.
This commit is contained in:
Naeel
2026-03-22 17:28:40 +03:00
parent 088493b7e7
commit c762047234
5 changed files with 556 additions and 32 deletions
+19 -11
View File
@@ -70,9 +70,9 @@ func runtimeBaseImage(runtime string) (string, error) {
case "nodejs20":
return "naeel/sless-runtime-nodejs20:v0.1.2", nil
case "go1.23":
// Go использует builder-образ (содержит golang:1.23 + server.go + go.mod/go.sum с pgx/v5).
// Конечный образ multi-stage — alpine без компилятора.
return "naeel/sless-runtime-go1.23:v0.1.2", nil
// Go использует builder-образ (содержит golang:1.23 + server/ + go.mod/go.sum с pgx/v5).
// v0.1.3: server/ субдиректория + go.work позволяет пользовательский go.mod с любыми зависимостями.
return "naeel/sless-runtime-go1.23:v0.1.3", nil
default:
return "", fmt.Errorf("unsupported runtime: %q (supported: python3.11, nodejs20, go1.23)", runtime)
}
@@ -90,18 +90,26 @@ func generateDockerfile(runtime string, hasRequirements bool, hasPackageJSON boo
switch runtime {
case "go1.23":
// Go: multi-stage build.
// base-образ содержит: server.go (package main) + go.mod (module sless/fn).
// kaniko копирует пользовательский код в handler/ (package handler).
// go build видит: /app/server.go + /app/handler/*.go под одним модулем sless/fn.
// Если у пользователя есть go.mod — он кладётся в /app/handler/go.mod (игнорируется).
// COPY . /app/handler/ — пользовательские файлы лежат в корне tar-контекста (без prefix).
// kaniko не умеет переименовывать пути при COPY, поэтому копируем всё "." в handler/.
// Go: multi-stage build с go.work (v0.1.3+).
// base-образ содержит: /app/server/ (module sless/fn/server, package main).
// kaniko копирует пользовательский код в /app/handler/.
// Генерируем go.mod для handler если его нет (module sless/fn/handler).
// Генерируем go.work: use ./server + use ./handler + replace sless/fn/handler => ./handler.
// replace позволяет server.go импортировать sless/fn/handler независимо от имени модуля пользователя.
// GOFLAGS=-mod=mod: позволяет go build подтягивать зависимости из handler/go.mod через GOPROXY.
goModStep := ""
if !hasGoMod {
// Пользователь не предоставил go.mod — генерируем минимальный
goModStep = "RUN printf 'module sless/fn/handler\\n\\ngo 1.23\\n' > /app/handler/go.mod\n"
}
content := fmt.Sprintf(
"FROM %s AS builder\n"+
"WORKDIR /app\n"+
"COPY . /app/handler/\n"+
"RUN CGO_ENABLED=0 go build -o /server .\n"+
goModStep+
"RUN printf 'go 1.23\\n\\nuse ./server\\nuse ./handler\\n\\nreplace sless/fn/handler => ./handler\\n' > /app/go.work\n"+ // server/go.mod не содержит require sless/fn/handler — Go требует явного require даже при replace в go.work.
// Патчим server/go.mod в момент kaniko-сборки (не меняет базовый образ).
"RUN printf '\\nrequire sless/fn/handler v0.0.0\\n' >> /app/server/go.mod\n"+"RUN CGO_ENABLED=0 go build -o /server ./server\n"+
"FROM alpine:3.20\n"+
"COPY --from=builder /server /server\n"+
"EXPOSE 8080\n"+