Skip to content

Commit 5190205

Browse files
NikhilSharmaWealexellis
authored andcommitted
Add remote-builder flag to publish and up command
Signed-off-by: Nikhil Sharma <nikhilsharma230303@gmail.com>
1 parent d7f8ff9 commit 5190205

File tree

11 files changed

+426
-74
lines changed

11 files changed

+426
-74
lines changed

builder/build.go

Lines changed: 80 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
package builder
55

66
import (
7+
"encoding/json"
78
"fmt"
9+
"io"
810
"io/ioutil"
11+
"log"
12+
"net/http"
913
"os"
1014
"path"
1115
"path/filepath"
@@ -23,7 +27,7 @@ const AdditionalPackageBuildArg = "ADDITIONAL_PACKAGE"
2327

2428
// BuildImage construct Docker image from function parameters
2529
// TODO: refactor signature to a struct to simplify the length of the method header
26-
func BuildImage(image string, handler string, functionName string, language string, nocache bool, squash bool, shrinkwrap bool, buildArgMap map[string]string, buildOptions []string, tagMode schema.BuildFormat, buildLabelMap map[string]string, quietBuild bool, copyExtraPaths []string) error {
30+
func BuildImage(image string, handler string, functionName string, language string, nocache bool, squash bool, shrinkwrap bool, buildArgMap map[string]string, buildOptions []string, tagMode schema.BuildFormat, buildLabelMap map[string]string, quietBuild bool, copyExtraPaths []string, remoteBuilder, payloadSecretPath string) error {
2731

2832
if stack.IsValidTemplate(language) {
2933
pathToTemplateYAML := fmt.Sprintf("./template/%s/template.yml", language)
@@ -63,50 +67,91 @@ func BuildImage(image string, handler string, functionName string, language stri
6367
return nil
6468
}
6569

66-
buildOptPackages, err := getBuildOptionPackages(buildOptions, language, langTemplate.BuildOptions)
67-
if err != nil {
68-
return err
70+
if remoteBuilder != "" {
71+
tempDir, err := os.MkdirTemp(os.TempDir(), "builder-*")
72+
if err != nil {
73+
return fmt.Errorf("failed to create temporary directory for %s, error: %w", functionName, err)
74+
}
75+
defer os.RemoveAll(tempDir)
6976

70-
}
77+
tarPath := path.Join(tempDir, "req.tar")
7178

72-
dockerBuildVal := dockerBuild{
73-
Image: imageName,
74-
NoCache: nocache,
75-
Squash: squash,
76-
HTTPProxy: os.Getenv("http_proxy"),
77-
HTTPSProxy: os.Getenv("https_proxy"),
78-
BuildArgMap: buildArgMap,
79-
BuildOptPackages: buildOptPackages,
80-
BuildLabelMap: buildLabelMap,
81-
}
79+
if err := makeTar(builderConfig{Image: imageName, BuildArgs: buildArgMap}, path.Join("build", functionName), tarPath); err != nil {
80+
return fmt.Errorf("failed to create tar file for %s, error: %w", functionName, err)
81+
}
8282

83-
command, args := getDockerBuildCommand(dockerBuildVal)
83+
res, err := callBuilder(tarPath, tempPath, remoteBuilder, functionName, payloadSecretPath)
84+
if err != nil {
85+
return err
86+
}
87+
defer res.Body.Close()
8488

85-
envs := os.Environ()
86-
if mountSSH {
87-
envs = append(envs, "DOCKER_BUILDKIT=1")
88-
}
89+
data, _ := io.ReadAll(res.Body)
8990

90-
task := v1execute.ExecTask{
91-
Cwd: tempPath,
92-
Command: command,
93-
Args: args,
94-
StreamStdio: !quietBuild,
95-
Env: envs,
96-
}
91+
result := builderResult{}
92+
if err := json.Unmarshal(data, &result); err != nil {
93+
return err
94+
}
9795

98-
res, err := task.Execute()
96+
if !quietBuild {
97+
for _, logMsg := range result.Log {
98+
fmt.Printf("%s\n", logMsg)
99+
}
100+
}
99101

100-
if err != nil {
101-
return err
102-
}
102+
if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
103+
fmt.Println(res.StatusCode)
104+
return fmt.Errorf("%s failure while building or pushing image %s: %s", functionName, imageName, result.Status)
105+
}
103106

104-
if res.ExitCode != 0 {
105-
return fmt.Errorf("[%s] received non-zero exit code from build, error: %s", functionName, res.Stderr)
106-
}
107+
log.Printf("%s success building and pushing image: %s", functionName, result.Image)
107108

108-
fmt.Printf("Image: %s built.\n", imageName)
109+
} else {
109110

111+
buildOptPackages, err := getBuildOptionPackages(buildOptions, language, langTemplate.BuildOptions)
112+
if err != nil {
113+
return err
114+
115+
}
116+
117+
dockerBuildVal := dockerBuild{
118+
Image: imageName,
119+
NoCache: nocache,
120+
Squash: squash,
121+
HTTPProxy: os.Getenv("http_proxy"),
122+
HTTPSProxy: os.Getenv("https_proxy"),
123+
BuildArgMap: buildArgMap,
124+
BuildOptPackages: buildOptPackages,
125+
BuildLabelMap: buildLabelMap,
126+
}
127+
128+
command, args := getDockerBuildCommand(dockerBuildVal)
129+
130+
envs := os.Environ()
131+
if mountSSH {
132+
envs = append(envs, "DOCKER_BUILDKIT=1")
133+
}
134+
135+
task := v1execute.ExecTask{
136+
Cwd: tempPath,
137+
Command: command,
138+
Args: args,
139+
StreamStdio: !quietBuild,
140+
Env: envs,
141+
}
142+
143+
res, err := task.Execute()
144+
145+
if err != nil {
146+
return err
147+
}
148+
149+
if res.ExitCode != 0 {
150+
return fmt.Errorf("[%s] received non-zero exit code from build, error: %s", functionName, res.Stderr)
151+
}
152+
153+
fmt.Printf("Image: %s built.\n", imageName)
154+
}
110155
} else {
111156
return fmt.Errorf("language template: %s not supported, build a custom Dockerfile", language)
112157
}

0 commit comments

Comments
 (0)