From da64bc97674f2c2a9e75247d4be6a52bd1f5706b Mon Sep 17 00:00:00 2001 From: George Price Date: Wed, 19 Feb 2025 14:41:01 -0500 Subject: [PATCH 1/8] proper upgrade --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3b8c1ee..527039b 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/fatih/color v1.18.0 github.com/h2non/filetype v1.1.3 github.com/hashicorp/go-cleanhttp v0.5.2 - github.com/hathora/cloud-sdk-go/hathoracloud v0.0.0-20250122221419-b680f9dc502e + github.com/hathora/cloud-sdk-go/hathoracloud v0.3.0 github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 github.com/stretchr/testify v1.10.0 github.com/urfave/cli/v3 v3.0.0-alpha9 diff --git a/go.sum b/go.sum index 5ee0372..a034487 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hathora/cloud-sdk-go/hathoracloud v0.0.0-20250122221419-b680f9dc502e h1:qUMPXUCAO6KUjUsdPdSVRlrzoR/e7g8s40rUKjzWodo= -github.com/hathora/cloud-sdk-go/hathoracloud v0.0.0-20250122221419-b680f9dc502e/go.mod h1:scOHgTK/ylPtgg39LsTpuUlmwop7tsGlLEP7vBd0Tlk= +github.com/hathora/cloud-sdk-go/hathoracloud v0.3.0 h1:FCTvoKp1lz4LncY8SETkjzc128lxY0yAuXfLEN4PQds= +github.com/hathora/cloud-sdk-go/hathoracloud v0.3.0/go.mod h1:scOHgTK/ylPtgg39LsTpuUlmwop7tsGlLEP7vBd0Tlk= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= From 5eae5ddf0a9876db9c3e24c11e123e7a78fb552d Mon Sep 17 00:00:00 2001 From: James Ranson Date: Wed, 28 May 2025 16:34:17 -0600 Subject: [PATCH 2/8] update dependencies; bump go 1.23 => 1.24 Signed-off-by: James Ranson --- .gitignore | 1 + go.mod | 10 ++++++---- go.sum | 12 ++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index da28c2a..286cfa4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # golang, rust **/bin/ +vendor # jvm **/target/ diff --git a/go.mod b/go.mod index 527039b..dc9d4b7 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,20 @@ module github.com/hathora/ci -go 1.23 +go 1.24.0 + +toolchain go1.24.3 require ( github.com/dustin/go-humanize v1.0.1 github.com/fatih/color v1.18.0 github.com/h2non/filetype v1.1.3 github.com/hashicorp/go-cleanhttp v0.5.2 - github.com/hathora/cloud-sdk-go/hathoracloud v0.3.0 + github.com/hathora/cloud-sdk-go/hathoracloud v0.3.20 github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 github.com/stretchr/testify v1.10.0 github.com/urfave/cli/v3 v3.0.0-alpha9 go.uber.org/zap v1.27.0 - golang.org/x/sync v0.10.0 + golang.org/x/sync v0.14.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -24,5 +26,5 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.29.0 // indirect + golang.org/x/sys v0.33.0 // indirect ) diff --git a/go.sum b/go.sum index a034487..a834a6f 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hathora/cloud-sdk-go/hathoracloud v0.3.0 h1:FCTvoKp1lz4LncY8SETkjzc128lxY0yAuXfLEN4PQds= -github.com/hathora/cloud-sdk-go/hathoracloud v0.3.0/go.mod h1:scOHgTK/ylPtgg39LsTpuUlmwop7tsGlLEP7vBd0Tlk= +github.com/hathora/cloud-sdk-go/hathoracloud v0.3.20 h1:HkPz8vue5M4Qkff7ACYbhDQqwtXEqvCMnjEXP7cerVo= +github.com/hathora/cloud-sdk-go/hathoracloud v0.3.20/go.mod h1:scOHgTK/ylPtgg39LsTpuUlmwop7tsGlLEP7vBd0Tlk= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -32,11 +32,11 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 4167ac8b28f10aebeea5aa98d82571f0ee36fa0c Mon Sep 17 00:00:00 2001 From: James Ranson Date: Wed, 28 May 2025 19:35:14 -0600 Subject: [PATCH 3/8] revert go to 1.23 for api server parity Signed-off-by: James Ranson --- go.mod | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index dc9d4b7..92c6475 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/hathora/ci -go 1.24.0 +go 1.23.0 -toolchain go1.24.3 +toolchain go1.23.9 require ( github.com/dustin/go-humanize v1.0.1 From 9a8ede227fb0ec8cd10ac634b56d43ac80342fdf Mon Sep 17 00:00:00 2001 From: James Ranson Date: Wed, 28 May 2025 19:45:25 -0600 Subject: [PATCH 4/8] support external registry builds Signed-off-by: James Ranson --- internal/commands/build.go | 168 +++++++++++++++++++++++++++++++- internal/commands/build_test.go | 21 ++++ internal/commands/common.go | 1 + 3 files changed, 189 insertions(+), 1 deletion(-) diff --git a/internal/commands/build.go b/internal/commands/build.go index 688a507..bc8b197 100644 --- a/internal/commands/build.go +++ b/internal/commands/build.go @@ -103,6 +103,24 @@ var Build = &cli.Command{ return build.Output.Write(created, os.Stdout) }, }, + { + Name: dockerCommandName, + Usage: "create a build using a docker image in an external registry", + Flags: subcommandFlags(buildTagFlag, buildIDFlag, registryImageFlag, registryFQDNFlag, registryAuthFlag), + Action: func(ctx context.Context, cmd *cli.Command) error { + build, err := CreateRegistryBuildConfigFrom(cmd) + if err != nil { + //nolint:errcheck + cli.ShowSubcommandHelp(cmd) + return err + } + created, err := doBuildCreateFromExternalRegstry(ctx, build.SDK, build.BuildTag, build.BuildID, build.Image, build.Registry, build.RegistryAuth) + if err != nil { + return err + } + return build.Output.Write(created, os.Stdout) + }, + }, { Name: deleteCommandName, Aliases: []string{"delete-build"}, @@ -132,6 +150,83 @@ var Build = &cli.Command{ }, } +func newRegistryConfig(registry, image, auth string) components.RegistryConfig { + out := components.RegistryConfig{ + Image: image, + } + if registry != "" { + out.RegistryURL = sdk.String(registry) + } + if auth != "" { + out.Auth = sdk.String(auth) + } + return out +} + +// ParseRegistryAndImage returns the parsed registry hostname and image reference. +// This allows for the registry to be part of the image or separate, and either work. +func ParseRegistryAndImage(registry, image, auth string) components.RegistryConfig { + if registry != "" || !strings.Contains(image, "/") { + return newRegistryConfig(registry, image, auth) + } + parts := strings.SplitN(image, "/", 2) + for _, b := range parts[0] { + if b == ':' || b == '.' { + // per docker urlparse rules, this indicates the image reference is + // actually an image url with parts[0] being the registry hostname + // and parts[1] being the image reference + return newRegistryConfig(parts[0], parts[1], auth) + } + } + // at this point, it's a docker hub assumed image with a namespace in the + return newRegistryConfig(registry, image, auth) +} + +func doBuildCreateFromExternalRegstry(ctx context.Context, + hathora *sdk.HathoraCloud, buildTag, buildId, image, registry, + token string) (*components.BuildV3, error) { + cfg := ParseRegistryAndImage(registry, image, token) + + var params components.CreateBuildV3Params + if buildTag != "" { + params.BuildTag = sdk.String(buildTag) + } + if buildId != "" { + params.BuildID = sdk.String(buildId) + } + createRes, err := hathora.BuildsV3.CreateBuildRegistry(ctx, params, nil) + if err != nil { + return nil, fmt.Errorf("failed to create build: %w", err) + } + + runRes, err := hathora.BuildsV3.RunBuildRegistry( + ctx, + createRes.BuildID, + cfg, + nil, + ) + if err != nil { + return nil, fmt.Errorf("failed to run build: %w", err) + } + + zap.L().Debug("streaming build output to console...") + err = output.StreamOutput(runRes, os.Stderr) + if err != nil { + zap.L().Error("failed to stream output to console", zap.Error(err)) + } + + infoRes, err := hathora.BuildsV3.GetBuild( + ctx, + createRes.BuildID, + nil, + ) + if err != nil { + return nil, fmt.Errorf("failed to retrieve build info: %w", err) + } + + return infoRes, nil +} + func doBuildCreate(ctx context.Context, hathora *sdk.HathoraCloud, buildTag, buildId, filePath string, hideUploadProgress bool) (*components.BuildV3, error) { file, err := archive.RequireTGZ(filePath) if err != nil { @@ -298,6 +393,39 @@ var ( Category: "Build:", Persistent: true, } + + registryImageFlag = &cli.StringFlag{ + Name: "image", + Required: true, + Aliases: []string{"i"}, + Sources: cli.NewValueSourceChain( + cli.EnvVar(buildFlagEnvVar("IMAGE")), + altsrc.ConfigFile(configFlag.Name, "build.image_url"), + ), + Category: "Build:", + Usage: "the docker `` tag or url for the external image", + } + + registryFQDNFlag = &cli.StringFlag{ + Name: "registry", + Aliases: []string{"r"}, + Sources: cli.NewValueSourceChain( + cli.EnvVar(buildFlagEnvVar("REGISTRY")), + altsrc.ConfigFile(configFlag.Name, "build.registry"), + ), + Category: "Build:", + Usage: "optional `` FQDN hosting the server image; can be in the image flag instead", + } + + registryAuthFlag = &cli.StringFlag{ + Name: "auth", + Sources: cli.NewValueSourceChain( + cli.EnvVar(buildFlagEnvVar("REGISTRY_AUTH")), + altsrc.ConfigFile(configFlag.Name, "build.auth"), + ), + Category: "Build:", + Usage: "optional `` credential for authenticating with a private registry", + } ) var ( @@ -336,7 +464,7 @@ func BuildConfigFrom(cmd *cli.Command) (*BuildConfig, error) { return ConfigFromCLI[*BuildConfig](buildConfigKey, cmd) } -var ( +const ( createBuildConfigKey = "commands.CreateBuildConfig.DI" ) @@ -372,6 +500,44 @@ func CreateBuildConfigFrom(cmd *cli.Command) (*CreateBuildConfig, error) { return ConfigFromCLI[*CreateBuildConfig](createBuildConfigKey, cmd) } +const ( + createRegistryBuildConfigKey = "commands.CreateRegistryBuildConfig.DI" +) + +type CreateRegistryBuildConfig struct { + *BuildConfig + BuildTag string + BuildID string + Image string + Registry string + RegistryAuth string +} + +var _ LoadableConfig = (*CreateRegistryBuildConfig)(nil) + +func (c *CreateRegistryBuildConfig) Load(cmd *cli.Command) error { + build, err := BuildConfigFrom(cmd) + if err != nil { + return err + } + c.BuildConfig = build + c.BuildTag = cmd.String(buildTagFlag.Name) + c.BuildID = cmd.String(buildIDFlag.Name) + c.Image = cmd.String(registryImageFlag.Name) + c.Registry = cmd.String(registryFQDNFlag.Name) + c.RegistryAuth = cmd.String(registryAuthFlag.Name) + c.Log = c.Log.With(zap.String("build.tag", c.BuildTag)).With(zap.String("build.id", c.BuildID)) + return nil +} + +func (c *CreateRegistryBuildConfig) New() LoadableConfig { + return &CreateRegistryBuildConfig{} +} + +func CreateRegistryBuildConfigFrom(cmd *cli.Command) (*CreateRegistryBuildConfig, error) { + return ConfigFromCLI[*CreateRegistryBuildConfig](createRegistryBuildConfigKey, cmd) +} + var ( oneBuildConfigKey = "commands.OneBuildConfig.DI" ) diff --git a/internal/commands/build_test.go b/internal/commands/build_test.go index ac15c93..a6825f6 100644 --- a/internal/commands/build_test.go +++ b/internal/commands/build_test.go @@ -274,3 +274,24 @@ func Test_Integration_BuildCommands_GlobalArgs(t *testing.T) { }) } } + +func TestParseRegistryAndImage(t *testing.T) { + out := commands.ParseRegistryAndImage("", "private.repo/namespace/image:tag", "") + if out.RegistryURL == nil { + t.Error("expected non-nil registry") + } else if *out.RegistryURL != "private.repo" { + t.Errorf("expected private.repo got %s", *out.RegistryURL) + } + if out.Image != "namespace/image:tag" { + t.Errorf("expected namespace/image:tag got %s", out.Image) + } + out = commands.ParseRegistryAndImage("private.repo", "namespace/image:tag", "") + if out.RegistryURL == nil { + t.Error("expected non-nil registry") + } else if *out.RegistryURL != "private.repo" { + t.Errorf("expected private.repo got %s", *out.RegistryURL) + } + if out.Image != "namespace/image:tag" { + t.Errorf("expected namespace/image:tag got %s", out.Image) + } +} diff --git a/internal/commands/common.go b/internal/commands/common.go index 65b840f..b71d0ac 100644 --- a/internal/commands/common.go +++ b/internal/commands/common.go @@ -22,6 +22,7 @@ var ( infoCommandName = "info" listCommandName = "list" createCommandName = "create" + dockerCommandName = "create-docker" deleteCommandName = "delete" latestCommandName = "latest" ) From 94e1a4837b556cff302565455adff47087d24c6d Mon Sep 17 00:00:00 2001 From: James Ranson Date: Wed, 28 May 2025 20:00:56 -0600 Subject: [PATCH 5/8] adjust tests for updated sdk responses Signed-off-by: James Ranson --- internal/output/text_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/output/text_test.go b/internal/output/text_test.go index 7e57ab1..d608d51 100644 --- a/internal/output/text_test.go +++ b/internal/output/text_test.go @@ -202,8 +202,8 @@ func Test_BuildTextOutput(t *testing.T) { FinishedAt: nil, }, expect: [][]string{ - {"BuildID", "BuildTag", "CreatedAt", "Status", "ImageSize", "StartedAt", "FinishedAt", "ContentHash", "OrgID", "ShareURL"}, - {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null"}, + {"BuildID", "BuildTag", "CreatedAt", "Status", "ImageSize", "StartedAt", "FinishedAt", "ContentHash", "ExpiredAt", "OrgID", "ShareURL"}, + {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null", "null"}, }, }, { @@ -219,8 +219,8 @@ func Test_BuildTextOutput(t *testing.T) { FinishedAt: nil, }, expect: [][]string{ - {"BuildID", "BuildTag", "CreatedAt", "Status", "ImageSize", "StartedAt", "FinishedAt", "ContentHash", "OrgID", "ShareURL"}, - {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null"}, + {"BuildID", "BuildTag", "CreatedAt", "Status", "ImageSize", "StartedAt", "FinishedAt", "ContentHash", "ExpiredAt", "OrgID", "ShareURL"}, + {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null", "null"}, }, }, { @@ -248,9 +248,9 @@ func Test_BuildTextOutput(t *testing.T) { }, }, expect: [][]string{ - {"BuildID", "BuildTag", "CreatedAt", "Status", "ImageSize", "StartedAt", "FinishedAt", "ContentHash", "OrgID", "ShareURL"}, - {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null"}, - {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null"}, + {"BuildID", "BuildTag", "CreatedAt", "Status", "ImageSize", "StartedAt", "FinishedAt", "ContentHash", "ExpiredAt", "OrgID", "ShareURL"}, + {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null", "null"}, + {"bld-1", "v1.0.0", "2021-01-01T00:00:00Z", "status", "2.0", "KiB", "2021-01-01T00:00:00Z", "null", "null", "null", "null"}, }, }, } From 0a4f80c4643654a4287f00532796f960655a9af1 Mon Sep 17 00:00:00 2001 From: Zach Graziano Date: Wed, 4 Jun 2025 11:14:00 -0400 Subject: [PATCH 6/8] Return error if build fails (#72) --- internal/commands/build.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/commands/build.go b/internal/commands/build.go index 688a507..5763ee4 100644 --- a/internal/commands/build.go +++ b/internal/commands/build.go @@ -100,6 +100,10 @@ var Build = &cli.Command{ return err } + if created.Status == components.BuildStatusFailed { + return fmt.Errorf("Build failed") + } + return build.Output.Write(created, os.Stdout) }, }, From 2638021b016fc58b92167574ccee94b8ceaf13e1 Mon Sep 17 00:00:00 2001 From: James Ranson Date: Wed, 4 Jun 2025 14:15:35 -0600 Subject: [PATCH 7/8] update dockerCommandName Signed-off-by: James Ranson --- internal/commands/common.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/commands/common.go b/internal/commands/common.go index b71d0ac..fab2a85 100644 --- a/internal/commands/common.go +++ b/internal/commands/common.go @@ -22,7 +22,7 @@ var ( infoCommandName = "info" listCommandName = "list" createCommandName = "create" - dockerCommandName = "create-docker" + dockerCommandName = "create-with-registry" deleteCommandName = "delete" latestCommandName = "latest" ) From b6f3b94ffae5bcc062b180e15119d11137c5d6ed Mon Sep 17 00:00:00 2001 From: James Ranson Date: Tue, 17 Jun 2025 11:50:28 -0600 Subject: [PATCH 8/8] reduce min memory 1024 -> 512 (MB) Signed-off-by: James Ranson --- internal/commands/deployment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/commands/deployment.go b/internal/commands/deployment.go index e5fc15a..cb7f810 100644 --- a/internal/commands/deployment.go +++ b/internal/commands/deployment.go @@ -31,7 +31,7 @@ var ( minCPU = 0.25 maxCPUDecimalPlaces = 2 maxCPU = float64(4) - minMemoryMB = float64(1024) + minMemoryMB = float64(512) maxMemoryMB = float64(8192) )