Skip to content

Commit 3da8558

Browse files
weltekialexellis
authored andcommitted
Fix build options support for remote builds
Additional packages defined through build options were ignored when using a remote builder. Signed-off-by: Han Verstraete (OpenFaaS Ltd) <[email protected]>
1 parent 2651490 commit 3da8558

File tree

3 files changed

+203
-92
lines changed

3 files changed

+203
-92
lines changed

builder/build.go

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"os"
1616
"path"
1717
"path/filepath"
18+
"slices"
1819
"sort"
1920
"strings"
2021

@@ -75,6 +76,13 @@ func BuildImage(image string, handler string, functionName string, language stri
7576

7677
imageName := schema.BuildImageName(tagFormat, image, version, branch)
7778

79+
buildOptPackages, err := getBuildOptionPackages(buildOptions, language, langTemplate.BuildOptions)
80+
if err != nil {
81+
return err
82+
83+
}
84+
buildArgMap = appendAdditionalPackages(buildArgMap, buildOptPackages)
85+
7886
fmt.Printf("Building: %s with %s template. Please wait..\n", imageName, language)
7987

8088
if remoteBuilder != "" {
@@ -129,23 +137,15 @@ func BuildImage(image string, handler string, functionName string, language stri
129137
}
130138

131139
} else {
132-
133-
buildOptPackages, err := getBuildOptionPackages(buildOptions, language, langTemplate.BuildOptions)
134-
if err != nil {
135-
return err
136-
137-
}
138-
139140
dockerBuildVal := dockerBuild{
140-
Image: imageName,
141-
NoCache: nocache,
142-
Squash: squash,
143-
HTTPProxy: os.Getenv("http_proxy"),
144-
HTTPSProxy: os.Getenv("https_proxy"),
145-
BuildArgMap: buildArgMap,
146-
BuildOptPackages: buildOptPackages,
147-
BuildLabelMap: buildLabelMap,
148-
ForcePull: forcePull,
141+
Image: imageName,
142+
NoCache: nocache,
143+
Squash: squash,
144+
HTTPProxy: os.Getenv("http_proxy"),
145+
HTTPSProxy: os.Getenv("https_proxy"),
146+
BuildArgMap: buildArgMap,
147+
BuildLabelMap: buildLabelMap,
148+
ForcePull: forcePull,
149149
}
150150

151151
command, args := getDockerBuildCommand(dockerBuildVal)
@@ -280,7 +280,7 @@ func hashFolder(contextPath string) (string, error) {
280280
}
281281

282282
func getDockerBuildCommand(build dockerBuild) (string, []string) {
283-
flagSlice := buildFlagSlice(build.NoCache, build.Squash, build.HTTPProxy, build.HTTPSProxy, build.BuildArgMap, build.BuildOptPackages, build.BuildLabelMap, build.ForcePull)
283+
flagSlice := buildFlagSlice(build.NoCache, build.Squash, build.HTTPProxy, build.HTTPSProxy, build.BuildArgMap, build.BuildLabelMap, build.ForcePull)
284284
args := []string{"build"}
285285
args = append(args, flagSlice...)
286286

@@ -292,15 +292,14 @@ func getDockerBuildCommand(build dockerBuild) (string, []string) {
292292
}
293293

294294
type dockerBuild struct {
295-
Image string
296-
Version string
297-
NoCache bool
298-
Squash bool
299-
HTTPProxy string
300-
HTTPSProxy string
301-
BuildArgMap map[string]string
302-
BuildOptPackages []string
303-
BuildLabelMap map[string]string
295+
Image string
296+
Version string
297+
NoCache bool
298+
Squash bool
299+
HTTPProxy string
300+
HTTPSProxy string
301+
BuildArgMap map[string]string
302+
BuildLabelMap map[string]string
304303

305304
// Platforms for use with buildx and publish command
306305
Platforms string
@@ -336,7 +335,7 @@ func pathInScope(path string, scope string) (string, error) {
336335
return "", fmt.Errorf("forbidden path appears to be outside of the build context: %s (%s)", path, abs)
337336
}
338337

339-
func buildFlagSlice(nocache bool, squash bool, httpProxy string, httpsProxy string, buildArgMap map[string]string, buildOptionPackages []string, buildLabelMap map[string]string, forcePull bool) []string {
338+
func buildFlagSlice(nocache bool, squash bool, httpProxy string, httpsProxy string, buildArgMap map[string]string, buildLabelMap map[string]string, forcePull bool) []string {
340339

341340
var spaceSafeBuildFlags []string
342341

@@ -356,16 +355,7 @@ func buildFlagSlice(nocache bool, squash bool, httpProxy string, httpsProxy stri
356355
}
357356

358357
for k, v := range buildArgMap {
359-
360-
if k != AdditionalPackageBuildArg {
361-
spaceSafeBuildFlags = append(spaceSafeBuildFlags, "--build-arg", fmt.Sprintf("%s=%s", k, v))
362-
} else {
363-
buildOptionPackages = append(buildOptionPackages, strings.Split(v, " ")...)
364-
}
365-
}
366-
if len(buildOptionPackages) > 0 {
367-
buildOptionPackages = deDuplicate(buildOptionPackages)
368-
spaceSafeBuildFlags = append(spaceSafeBuildFlags, "--build-arg", fmt.Sprintf("%s=%s", AdditionalPackageBuildArg, strings.Join(buildOptionPackages, " ")))
358+
spaceSafeBuildFlags = append(spaceSafeBuildFlags, "--build-arg", fmt.Sprintf("%s=%s", k, v))
369359
}
370360

371361
for k, v := range buildLabelMap {
@@ -379,6 +369,32 @@ func buildFlagSlice(nocache bool, squash bool, httpProxy string, httpsProxy stri
379369
return spaceSafeBuildFlags
380370
}
381371

372+
// appendAdditionalPackages appends additional packages to the ADDITIONAL_PACKAGE build arg.
373+
// If the ADDITIONAL_PACKAGE build arg is not present, it is created.
374+
// If the ADDITIONAL_PACKAGE build arg is present, the packages are appended to the list.
375+
func appendAdditionalPackages(buildArgs map[string]string, additionalPackages []string) map[string]string {
376+
for k, v := range buildArgs {
377+
if k == AdditionalPackageBuildArg {
378+
packages := strings.Split(v, " ")
379+
for i := range packages {
380+
packages[i] = strings.TrimSpace(packages[i])
381+
}
382+
383+
// Remove empty strings
384+
packages = slices.DeleteFunc(packages, func(s string) bool {
385+
return len(s) == 0
386+
})
387+
388+
additionalPackages = append(additionalPackages, packages...)
389+
}
390+
}
391+
additionalPackages = deDuplicate(additionalPackages)
392+
sort.Strings(additionalPackages)
393+
buildArgs[AdditionalPackageBuildArg] = strings.Join(additionalPackages, " ")
394+
395+
return buildArgs
396+
}
397+
382398
func ensureHandlerPath(handler string) error {
383399
if _, err := os.Stat(handler); err != nil {
384400
return err
@@ -432,7 +448,6 @@ func getPackages(availableBuildOptions []stack.BuildOption, requestedBuildOption
432448
}
433449

434450
func deDuplicate(buildOptPackages []string) []string {
435-
436451
seenPackages := map[string]bool{}
437452
retPackages := []string{}
438453

0 commit comments

Comments
 (0)