diff --git a/cmd/api/api/builds.go b/cmd/api/api/builds.go index c3b8550..99e73ba 100644 --- a/cmd/api/api/builds.go +++ b/cmd/api/api/builds.go @@ -45,6 +45,7 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe var timeoutSeconds int var isAdminBuild bool var secrets []builds.SecretRef + var buildArgs map[string]string for { part, err := request.Body.NextPart() @@ -137,6 +138,20 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe }, nil } globalCacheKey = string(data) + case "build_args": + data, err := io.ReadAll(part) + if err != nil { + return oapi.CreateBuild400JSONResponse{ + Code: "invalid_request", + Message: "failed to read build_args field", + }, nil + } + if err := json.Unmarshal(data, &buildArgs); err != nil { + return oapi.CreateBuild400JSONResponse{ + Code: "invalid_request", + Message: "build_args must be a JSON object of key-value pairs", + }, nil + } } part.Close() } @@ -153,12 +168,13 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe // Build domain request domainReq := builds.CreateBuildRequest{ - BaseImageDigest: baseImageDigest, - CacheScope: cacheScope, - Dockerfile: dockerfile, - Secrets: secrets, - IsAdminBuild: isAdminBuild, - GlobalCacheKey: globalCacheKey, + BaseImageDigest: baseImageDigest, + CacheScope: cacheScope, + Dockerfile: dockerfile, + Secrets: secrets, + IsAdminBuild: isAdminBuild, + GlobalCacheKey: globalCacheKey, + BuildArgs: buildArgs, } // Apply timeout if provided diff --git a/lib/oapi/oapi.go b/lib/oapi/oapi.go index 935d2d9..3cdd0bb 100644 --- a/lib/oapi/oapi.go +++ b/lib/oapi/oapi.go @@ -822,6 +822,11 @@ type CreateBuildMultipartBody struct { // BaseImageDigest Optional pinned base image digest BaseImageDigest *string `json:"base_image_digest,omitempty"` + // BuildArgs JSON object of build arguments to pass to the Dockerfile. + // These correspond to ARG instructions in the Dockerfile. + // Example: {"NODE_ENV": "production", "APP_VERSION": "1.0.0"} + BuildArgs *string `json:"build_args,omitempty"` + // CacheScope Tenant-specific cache key prefix CacheScope *string `json:"cache_scope,omitempty"` @@ -10704,58 +10709,59 @@ var swaggerSpec = []string{ "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", - "fHrz6f8HAAD//wgwYbc14gAA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/openapi.yaml b/openapi.yaml index d87dedd..0e10400 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -2387,6 +2387,12 @@ paths: Global cache identifier (e.g., "node", "python", "ubuntu", "browser"). When specified, the build will import from cache/global/{key}. Admin builds will also export to this location. + build_args: + type: string + description: | + JSON object of build arguments to pass to the Dockerfile. + These correspond to ARG instructions in the Dockerfile. + Example: {"NODE_ENV": "production", "APP_VERSION": "1.0.0"} responses: 202: description: Build created and queued