Cache Go modules in platform builder

This commit is contained in:
npc0-hue
2026-08-20 10:01:26 +08:00
parent 7fec2da040
commit 585c32746e
10 changed files with 52 additions and 8 deletions
+22 -5
View File
@@ -52,6 +52,7 @@ type DockerDistributionBuilderConfig struct {
Image string
SourceDir string
WorkspaceDir string
CacheDir string
Timeout time.Duration
PlatformURL string
CommandRunner func(ctx context.Context, name string, args ...string) ([]byte, error)
@@ -198,6 +199,10 @@ func (builder *DockerDistributionBuilder) BuildWithProgress(input domain.Distrib
if err != nil {
return nil, validationError("platform builder workspace directory is invalid")
}
cacheDir, err := builder.cacheDir(workspaceDir)
if err != nil {
return nil, validationError("platform builder cache directory is invalid")
}
// Workspaces stay isolated per plugin and per job as required by
// run-build-download-flow.
jobDir := filepath.Join(workspaceDir, sanitizeIDPart(input.PluginID), sanitizeIDPart(input.JobID))
@@ -207,7 +212,9 @@ func (builder *DockerDistributionBuilder) BuildWithProgress(input domain.Distrib
outputDir := filepath.Join(jobDir, "output")
inputDir := filepath.Join(jobDir, "input")
buildDir := filepath.Join(jobDir, "build")
for _, directory := range []string{outputDir, inputDir, buildDir} {
goBuildCacheDir := filepath.Join(cacheDir, "go-build")
goModCacheDir := filepath.Join(cacheDir, "go-mod")
for _, directory := range []string{outputDir, inputDir, buildDir, goBuildCacheDir, goModCacheDir} {
if err := os.MkdirAll(directory, 0o700); err != nil {
return nil, err
}
@@ -256,7 +263,7 @@ func (builder *DockerDistributionBuilder) BuildWithProgress(input domain.Distrib
}
ctx, cancel := context.WithTimeout(context.Background(), builder.config.Timeout)
defer cancel()
args := builder.containerArgs(input, sourceDir, inputDir, buildDir, outputDir, outputName)
args := builder.containerArgs(input, sourceDir, inputDir, buildDir, outputDir, goBuildCacheDir, goModCacheDir, outputName)
reportBuilderProgress(progress, 18, "git_sync: platform builder container starting")
output, err := builder.runBuildCommand(ctx, args, progress)
if err != nil {
@@ -283,6 +290,14 @@ func (builder *DockerDistributionBuilder) BuildWithProgress(input domain.Distrib
return packageClientManagerDistribution(input.PackageFormat, outputName, binary, configPayload)
}
func (builder *DockerDistributionBuilder) cacheDir(workspaceDir string) (string, error) {
configured := strings.TrimSpace(builder.config.CacheDir)
if configured == "" {
configured = filepath.Join(workspaceDir, "_cache")
}
return filepath.Abs(configured)
}
func (builder *DockerDistributionBuilder) runBuildCommand(ctx context.Context, args []string, progress func(DistributionBuildProgress)) ([]byte, error) {
if builder.config.CommandStream == nil {
return builder.config.CommandRunner(ctx, builder.config.DockerBinary, args...)
@@ -410,7 +425,7 @@ cp config.yaml /workspace/output/config.yaml
progress 88 'package_finalize: client-manager package inputs written'
`
func (builder *DockerDistributionBuilder) containerArgs(input domain.DistributionBuildInput, sourceDir string, inputDir string, buildDir string, outputDir string, outputName string) []string {
func (builder *DockerDistributionBuilder) containerArgs(input domain.DistributionBuildInput, sourceDir string, inputDir string, buildDir string, outputDir string, goBuildCacheDir string, goModCacheDir string, outputName string) []string {
platformURL := strings.TrimSpace(input.PlatformURL)
if platformURL == "" {
platformURL = strings.TrimSpace(builder.config.PlatformURL)
@@ -424,11 +439,13 @@ func (builder *DockerDistributionBuilder) containerArgs(input domain.Distributio
"-v", inputDir + ":/workspace/input:ro",
"-v", buildDir + ":/workspace/build",
"-v", outputDir + ":/workspace/output",
"-v", goBuildCacheDir + ":/workspace/cache/go-build",
"-v", goModCacheDir + ":/workspace/cache/go-mod",
"-e", "CGO_ENABLED=0",
"-e", "GOOS=" + input.TargetOS,
"-e", "GOARCH=" + input.TargetArch,
"-e", "GOCACHE=/tmp/go-build",
"-e", "GOMODCACHE=/tmp/go-mod",
"-e", "GOCACHE=/workspace/cache/go-build",
"-e", "GOMODCACHE=/workspace/cache/go-mod",
"-e", "COMPONENT_KIND=" + string(input.ComponentKind),
"-e", "SERVER_INSTANCE_ID=" + input.ServerInstanceID,
"-e", "PLUGIN_ID=" + input.PluginID,