feat: backend service

This commit is contained in:
Ilia Denisov
2026-05-06 10:14:55 +03:00
committed by GitHub
parent 3e2622757e
commit f446c6a2ac
1486 changed files with 49720 additions and 266401 deletions
+91
View File
@@ -0,0 +1,91 @@
package testenv
import (
"context"
"fmt"
"os/exec"
"path/filepath"
"runtime"
"sync"
"testing"
"time"
)
const (
BackendImage = "galaxy/backend:integration"
GatewayImage = "galaxy/gateway:integration"
GameImage = "galaxy/game:integration"
)
var (
backendOnce sync.Once
backendErr error
gatewayOnce sync.Once
gatewayErr error
gameOnce sync.Once
gameErr error
)
// EnsureBackendImage builds galaxy/backend:integration once per
// process. Subsequent calls reuse the result.
func EnsureBackendImage(t *testing.T) {
t.Helper()
backendOnce.Do(func() {
backendErr = buildImage(BackendImage, "backend/Dockerfile")
})
if backendErr != nil {
t.Skipf("build %s: %v", BackendImage, backendErr)
}
}
// EnsureGatewayImage builds galaxy/gateway:integration once per
// process.
func EnsureGatewayImage(t *testing.T) {
t.Helper()
gatewayOnce.Do(func() {
gatewayErr = buildImage(GatewayImage, "gateway/Dockerfile")
})
if gatewayErr != nil {
t.Skipf("build %s: %v", GatewayImage, gatewayErr)
}
}
// EnsureGameImage builds galaxy/game:integration once per process.
func EnsureGameImage(t *testing.T) {
t.Helper()
gameOnce.Do(func() {
gameErr = buildImage(GameImage, "game/Dockerfile")
})
if gameErr != nil {
t.Skipf("build %s: %v", GameImage, gameErr)
}
}
func buildImage(tag, dockerfile string) error {
root, err := workspaceRoot()
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
defer cancel()
cmd := exec.CommandContext(ctx, "docker", "build",
"-t", tag,
"-f", filepath.Join(root, dockerfile),
root,
)
out, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("docker build %s: %v\n%s", tag, err, string(out))
}
return nil
}
func workspaceRoot() (string, error) {
_, file, _, ok := runtime.Caller(0)
if !ok {
return "", fmt.Errorf("runtime.Caller failed")
}
// integration/testenv/images.go → workspace root
return filepath.Dir(filepath.Dir(filepath.Dir(file))), nil
}