From 80fd39f2d8e353e57ad15b64a5f9a414aaab953f Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 1 Feb 2026 04:01:40 +0000 Subject: [PATCH] fix(sdk): run Docker containers as current user to fix CI cleanup Docker containers were creating files as root, causing Go test cleanup to fail with "permission denied". Now passes --user flag on Unix systems to run containers as the current user. Co-Authored-By: Claude Opus 4.5 --- pkg/sdk/generators/generator.go | 12 ++++++++++++ pkg/sdk/generators/go.go | 6 +++++- pkg/sdk/generators/php.go | 6 +++++- pkg/sdk/generators/python.go | 6 +++++- pkg/sdk/generators/typescript.go | 6 +++++- 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/pkg/sdk/generators/generator.go b/pkg/sdk/generators/generator.go index eafe1fed..3a37f2ee 100644 --- a/pkg/sdk/generators/generator.go +++ b/pkg/sdk/generators/generator.go @@ -3,6 +3,9 @@ package generators import ( "context" + "fmt" + "os" + "runtime" ) // Options holds common generation options. @@ -65,3 +68,12 @@ func (r *Registry) Languages() []string { } return langs } + +// dockerUserArgs returns Docker --user args for the current user on Unix systems. +// On Windows, Docker handles permissions differently, so no args are returned. +func dockerUserArgs() []string { + if runtime.GOOS == "windows" { + return nil + } + return []string{"--user", fmt.Sprintf("%d:%d", os.Getuid(), os.Getgid())} +} diff --git a/pkg/sdk/generators/go.go b/pkg/sdk/generators/go.go index 344e8ed6..e2c2bc16 100644 --- a/pkg/sdk/generators/go.go +++ b/pkg/sdk/generators/go.go @@ -68,7 +68,9 @@ func (g *GoGenerator) generateDocker(ctx context.Context, opts Options) error { specDir := filepath.Dir(opts.SpecPath) specName := filepath.Base(opts.SpecPath) - cmd := exec.CommandContext(ctx, "docker", "run", "--rm", + args := []string{"run", "--rm"} + args = append(args, dockerUserArgs()...) + args = append(args, "-v", specDir+":/spec", "-v", opts.OutputDir+":/out", "openapitools/openapi-generator-cli", "generate", @@ -77,6 +79,8 @@ func (g *GoGenerator) generateDocker(ctx context.Context, opts Options) error { "-o", "/out", "--additional-properties=packageName="+opts.PackageName, ) + + cmd := exec.CommandContext(ctx, "docker", args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() diff --git a/pkg/sdk/generators/php.go b/pkg/sdk/generators/php.go index 0a5b53ac..6403af37 100644 --- a/pkg/sdk/generators/php.go +++ b/pkg/sdk/generators/php.go @@ -45,7 +45,9 @@ func (g *PHPGenerator) Generate(ctx context.Context, opts Options) error { specDir := filepath.Dir(opts.SpecPath) specName := filepath.Base(opts.SpecPath) - cmd := exec.CommandContext(ctx, "docker", "run", "--rm", + args := []string{"run", "--rm"} + args = append(args, dockerUserArgs()...) + args = append(args, "-v", specDir+":/spec", "-v", opts.OutputDir+":/out", "openapitools/openapi-generator-cli", "generate", @@ -54,6 +56,8 @@ func (g *PHPGenerator) Generate(ctx context.Context, opts Options) error { "-o", "/out", "--additional-properties=invokerPackage="+opts.PackageName, ) + + cmd := exec.CommandContext(ctx, "docker", args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr diff --git a/pkg/sdk/generators/python.go b/pkg/sdk/generators/python.go index 00db9c0a..bd5f91f0 100644 --- a/pkg/sdk/generators/python.go +++ b/pkg/sdk/generators/python.go @@ -61,7 +61,9 @@ func (g *PythonGenerator) generateDocker(ctx context.Context, opts Options) erro specDir := filepath.Dir(opts.SpecPath) specName := filepath.Base(opts.SpecPath) - cmd := exec.CommandContext(ctx, "docker", "run", "--rm", + args := []string{"run", "--rm"} + args = append(args, dockerUserArgs()...) + args = append(args, "-v", specDir+":/spec", "-v", opts.OutputDir+":/out", "openapitools/openapi-generator-cli", "generate", @@ -70,6 +72,8 @@ func (g *PythonGenerator) generateDocker(ctx context.Context, opts Options) erro "-o", "/out", "--additional-properties=packageName="+opts.PackageName, ) + + cmd := exec.CommandContext(ctx, "docker", args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() diff --git a/pkg/sdk/generators/typescript.go b/pkg/sdk/generators/typescript.go index 72d03b4b..c88b9b6e 100644 --- a/pkg/sdk/generators/typescript.go +++ b/pkg/sdk/generators/typescript.go @@ -87,7 +87,9 @@ func (g *TypeScriptGenerator) generateDocker(ctx context.Context, opts Options) specDir := filepath.Dir(opts.SpecPath) specName := filepath.Base(opts.SpecPath) - cmd := exec.CommandContext(ctx, "docker", "run", "--rm", + args := []string{"run", "--rm"} + args = append(args, dockerUserArgs()...) + args = append(args, "-v", specDir+":/spec", "-v", opts.OutputDir+":/out", "openapitools/openapi-generator-cli", "generate", @@ -96,6 +98,8 @@ func (g *TypeScriptGenerator) generateDocker(ctx context.Context, opts Options) "-o", "/out", "--additional-properties=npmName="+opts.PackageName, ) + + cmd := exec.CommandContext(ctx, "docker", args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr