feat: move distribution builds to platform Docker builder

This commit is contained in:
npc0-hue
2026-07-30 19:25:50 +08:00
parent 1e004dc9ec
commit e614a17fe3
45 changed files with 4492 additions and 294 deletions
+30
View File
@@ -4,12 +4,20 @@ import (
"bufio"
"os"
"path/filepath"
"strconv"
"strings"
)
const defaultAddr = ":8080"
const defaultDataDir = ".platform-data"
const defaultStorageBackend = "file"
const defaultBuilderDockerBinary = "docker"
// defaultBuilderImage names an explicit toolchain version rather than a
// floating tag such as latest. Operators who want digest pinning override
// PLATFORM_BUILDER_IMAGE with an image@sha256:... reference.
const defaultBuilderImage = "browser-platform-distribution-builder:1.0.0"
const defaultBuilderTimeoutSeconds = 1800
type Config struct {
Addr string
@@ -24,6 +32,11 @@ type Config struct {
BootstrapAdminPassword string
SecretEnvelopeKey string
AIProviderMode string
BuilderDockerBinary string
BuilderImage string
BuilderSourceDir string
BuilderWorkspaceDir string
BuilderTimeoutSeconds int
}
func Load() Config {
@@ -54,6 +67,10 @@ func Load() Config {
storageBackend = defaultStorageBackend
}
logBodyBackend := strings.TrimSpace(os.Getenv("PLATFORM_LOG_BODY_BACKEND"))
builderWorkspaceDir := strings.TrimSpace(os.Getenv("PLATFORM_BUILDER_WORKSPACE_DIR"))
if builderWorkspaceDir == "" {
builderWorkspaceDir = filepath.Join(dataDir, "distribution-builds")
}
return Config{
Addr: addr,
@@ -68,9 +85,22 @@ func Load() Config {
BootstrapAdminPassword: os.Getenv("PLATFORM_BOOTSTRAP_ADMIN_PASSWORD"),
SecretEnvelopeKey: os.Getenv("PLATFORM_SECRET_ENVELOPE_KEY"),
AIProviderMode: defaultString(strings.TrimSpace(os.Getenv("PLATFORM_AI_PROVIDER_MODE")), "live"),
BuilderDockerBinary: defaultString(strings.TrimSpace(os.Getenv("PLATFORM_BUILDER_DOCKER_BINARY")), defaultBuilderDockerBinary),
BuilderImage: defaultString(strings.TrimSpace(os.Getenv("PLATFORM_BUILDER_IMAGE")), defaultBuilderImage),
BuilderSourceDir: strings.TrimSpace(os.Getenv("PLATFORM_BUILDER_SOURCE_DIR")),
BuilderWorkspaceDir: builderWorkspaceDir,
BuilderTimeoutSeconds: defaultPositiveInt(strings.TrimSpace(os.Getenv("PLATFORM_BUILDER_TIMEOUT_SECONDS")), defaultBuilderTimeoutSeconds),
}
}
func defaultPositiveInt(value string, fallback int) int {
parsed, err := strconv.Atoi(value)
if err != nil || parsed <= 0 {
return fallback
}
return parsed
}
func defaultString(value, fallback string) string {
if value == "" {
return fallback
+21
View File
@@ -18,6 +18,11 @@ func TestLoadUsesDefaultAddress(t *testing.T) {
t.Setenv("PLATFORM_BOOTSTRAP_ADMIN_EMAIL", "")
t.Setenv("PLATFORM_BOOTSTRAP_ADMIN_PASSWORD", "")
t.Setenv("PLATFORM_SECRET_ENVELOPE_KEY", "")
t.Setenv("PLATFORM_BUILDER_DOCKER_BINARY", "")
t.Setenv("PLATFORM_BUILDER_IMAGE", "")
t.Setenv("PLATFORM_BUILDER_SOURCE_DIR", "")
t.Setenv("PLATFORM_BUILDER_WORKSPACE_DIR", "")
t.Setenv("PLATFORM_BUILDER_TIMEOUT_SECONDS", "")
cfg := Load()
if cfg.Addr != defaultAddr {
@@ -29,6 +34,9 @@ func TestLoadUsesDefaultAddress(t *testing.T) {
if cfg.MetadataPath != filepath.Join(".platform-data", "metadata.json") || cfg.LogDir != filepath.Join(".platform-data", "logs") {
t.Fatalf("unexpected default storage paths: %+v", cfg)
}
if cfg.BuilderDockerBinary != defaultBuilderDockerBinary || cfg.BuilderImage != defaultBuilderImage || cfg.BuilderSourceDir != "" || cfg.BuilderWorkspaceDir != filepath.Join(".platform-data", "distribution-builds") || cfg.BuilderTimeoutSeconds != defaultBuilderTimeoutSeconds {
t.Fatalf("unexpected default builder config: %+v", cfg)
}
}
func TestLoadUsesConfiguredAddress(t *testing.T) {
@@ -42,6 +50,11 @@ func TestLoadUsesConfiguredAddress(t *testing.T) {
t.Setenv("PLATFORM_BOOTSTRAP_ADMIN_EMAIL", "admin@example.test")
t.Setenv("PLATFORM_BOOTSTRAP_ADMIN_PASSWORD", "configured-secret")
t.Setenv("PLATFORM_SECRET_ENVELOPE_KEY", "configured-envelope-key-at-least-32-bytes")
t.Setenv("PLATFORM_BUILDER_DOCKER_BINARY", "/usr/local/bin/docker")
t.Setenv("PLATFORM_BUILDER_IMAGE", "registry.example.test/distribution-builder:2.0.0")
t.Setenv("PLATFORM_BUILDER_SOURCE_DIR", "/srv/run-source")
t.Setenv("PLATFORM_BUILDER_WORKSPACE_DIR", "/srv/distribution-builds")
t.Setenv("PLATFORM_BUILDER_TIMEOUT_SECONDS", "900")
cfg := Load()
if cfg.Addr != ":18080" {
@@ -50,6 +63,9 @@ func TestLoadUsesConfiguredAddress(t *testing.T) {
if cfg.StorageBackend != "mysql" || cfg.MySQLDSN != "platform:platform@tcp(127.0.0.1:3306)/platform?parseTime=true" || cfg.DataDir != "/tmp/platform-data" || cfg.MetadataPath != "/tmp/platform-metadata.json" || cfg.LogDir != "/tmp/platform-logs" || cfg.LogBodyBackend != "file" || cfg.BootstrapAdminEmail != "admin@example.test" || cfg.BootstrapAdminPassword != "configured-secret" || cfg.SecretEnvelopeKey != "configured-envelope-key-at-least-32-bytes" {
t.Fatalf("unexpected configured storage: %+v", cfg)
}
if cfg.BuilderDockerBinary != "/usr/local/bin/docker" || cfg.BuilderImage != "registry.example.test/distribution-builder:2.0.0" || cfg.BuilderSourceDir != "/srv/run-source" || cfg.BuilderWorkspaceDir != "/srv/distribution-builds" || cfg.BuilderTimeoutSeconds != 900 {
t.Fatalf("unexpected configured builder: %+v", cfg)
}
}
func TestLoadReadsPlatformEnvFile(t *testing.T) {
@@ -106,6 +122,11 @@ func clearPlatformEnv(t *testing.T) {
"PLATFORM_BOOTSTRAP_ADMIN_EMAIL",
"PLATFORM_BOOTSTRAP_ADMIN_PASSWORD",
"PLATFORM_SECRET_ENVELOPE_KEY",
"PLATFORM_BUILDER_DOCKER_BINARY",
"PLATFORM_BUILDER_IMAGE",
"PLATFORM_BUILDER_SOURCE_DIR",
"PLATFORM_BUILDER_WORKSPACE_DIR",
"PLATFORM_BUILDER_TIMEOUT_SECONDS",
} {
t.Setenv(key, "")
if err := os.Unsetenv(key); err != nil {