Skip to content

Commit 36e9098

Browse files
committed
do s2i git cloning up front, not in s2i itself
1 parent 3b52b42 commit 36e9098

File tree

2 files changed

+48
-96
lines changed

2 files changed

+48
-96
lines changed

pkg/build/builder/docker.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"os/exec"
88
"path/filepath"
99
"strings"
10-
"time"
1110

1211
dockercmd "github.com/docker/docker/builder/dockerfile/command"
1312
"github.com/docker/docker/builder/dockerfile/parser"
@@ -39,7 +38,6 @@ type DockerBuilder struct {
3938
gitClient GitClient
4039
tar tar.Tar
4140
build *api.Build
42-
urlTimeout time.Duration
4341
client client.BuildInterface
4442
cgLimits *s2iapi.CGroupLimits
4543
}
@@ -51,7 +49,6 @@ func NewDockerBuilder(dockerClient DockerClient, buildsClient client.BuildInterf
5149
build: build,
5250
gitClient: gitClient,
5351
tar: tar.New(s2iutil.NewFileSystem()),
54-
urlTimeout: initialURLCheckTimeout,
5552
client: buildsClient,
5653
cgLimits: cgLimits,
5754
}
@@ -70,7 +67,7 @@ func (d *DockerBuilder) Build() error {
7067
if err != nil {
7168
return err
7269
}
73-
sourceInfo, err := fetchSource(d.dockerClient, buildDir, d.build, d.urlTimeout, os.Stdin, d.gitClient)
70+
sourceInfo, err := fetchSource(d.dockerClient, buildDir, d.build, initialURLCheckTimeout, os.Stdin, d.gitClient)
7471
if err != nil {
7572
d.build.Status.Reason = api.StatusReasonFetchSourceFailed
7673
d.build.Status.Message = api.StatusMessageFetchSourceFailed

pkg/build/builder/sti.go

Lines changed: 47 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@ import (
44
"bytes"
55
"errors"
66
"fmt"
7-
"io"
87
"io/ioutil"
98
"net/url"
109
"os"
1110
"path/filepath"
1211
"strings"
13-
"time"
1412

1513
utilruntime "k8s.io/kubernetes/pkg/util/runtime"
1614

@@ -57,10 +55,9 @@ func (_ runtimeConfigValidator) ValidateConfig(config *s2iapi.Config) []validati
5755

5856
// S2IBuilder performs an STI build given the build object
5957
type S2IBuilder struct {
60-
builder builderFactory
61-
validator validator
62-
gitClient GitClient
63-
58+
builder builderFactory
59+
validator validator
60+
gitClient GitClient
6461
dockerClient DockerClient
6562
dockerSocket string
6663
build *api.Build
@@ -98,10 +95,6 @@ func (s *S2IBuilder) Build() error {
9895
return errors.New("the source to image builder must be used with the source strategy")
9996
}
10097

101-
contextDir := filepath.Clean(s.build.Spec.Source.ContextDir)
102-
if contextDir == "." || contextDir == "/" {
103-
contextDir = ""
104-
}
10598
buildDir, err := ioutil.TempDir("", "s2i-build")
10699
if err != nil {
107100
return err
@@ -110,20 +103,6 @@ func (s *S2IBuilder) Build() error {
110103
if err = os.MkdirAll(srcDir, os.ModePerm); err != nil {
111104
return err
112105
}
113-
tmpDir := filepath.Join(buildDir, "tmp")
114-
if err = os.MkdirAll(tmpDir, os.ModePerm); err != nil {
115-
return err
116-
}
117-
118-
download := &downloader{
119-
s: s,
120-
in: os.Stdin,
121-
timeout: initialURLCheckTimeout,
122-
123-
dir: srcDir,
124-
contextDir: contextDir,
125-
tmpDir: tmpDir,
126-
}
127106

128107
var push bool
129108
// if there is no output target, set one up so the docker build logic
@@ -134,20 +113,34 @@ func (s *S2IBuilder) Build() error {
134113
push = true
135114
}
136115
pushTag := s.build.Status.OutputDockerImageReference
137-
git := s.build.Spec.Source.Git
138-
139-
var ref string
140-
if s.build.Spec.Revision != nil && s.build.Spec.Revision.Git != nil &&
141-
len(s.build.Spec.Revision.Git.Commit) != 0 {
142-
ref = s.build.Spec.Revision.Git.Commit
143-
} else if git != nil && len(git.Ref) != 0 {
144-
ref = git.Ref
145-
}
146116

147-
sourceURI := &url.URL{
148-
Scheme: "file",
149-
Path: srcDir,
150-
Fragment: ref,
117+
// fetch source
118+
sourceInfo, err := fetchSource(s.dockerClient, srcDir, s.build, initialURLCheckTimeout, os.Stdin, s.gitClient)
119+
if err != nil {
120+
s.build.Status.Reason = api.StatusReasonFetchSourceFailed
121+
s.build.Status.Message = api.StatusMessageFetchSourceFailed
122+
if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil {
123+
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
124+
}
125+
return err
126+
}
127+
if len(s.build.Spec.Source.ContextDir) > 0 {
128+
contextDir := filepath.Clean(s.build.Spec.Source.ContextDir)
129+
if contextDir == "." || contextDir == "/" {
130+
contextDir = ""
131+
}
132+
if sourceInfo != nil {
133+
sourceInfo.ContextDir = s.build.Spec.Source.ContextDir
134+
}
135+
srcDir = filepath.Join(srcDir, s.build.Spec.Source.ContextDir)
136+
}
137+
download := &downloader{}
138+
if sourceInfo != nil {
139+
download.sourceInfo = &sourceInfo.SourceInfo
140+
revision := updateBuildRevision(s.build, sourceInfo)
141+
if updateErr := retryBuildStatusUpdate(s.build, s.client, revision); updateErr != nil {
142+
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
143+
}
151144
}
152145

153146
injections := s2iapi.VolumeList{}
@@ -176,10 +169,12 @@ func (s *S2IBuilder) Build() error {
176169
incremental = *s.build.Spec.Strategy.SourceStrategy.Incremental
177170
}
178171
config := &s2iapi.Config{
179-
WorkingDir: buildDir,
180-
DockerConfig: &s2iapi.DockerConfig{Endpoint: s.dockerSocket},
181-
DockerCfgPath: os.Getenv(dockercfg.PullAuthType),
182-
LabelNamespace: api.DefaultDockerLabelNamespace,
172+
// Save some processing time by not cleaning up (the container will go away anyway)
173+
PreserveWorkingDir: true,
174+
WorkingDir: buildDir,
175+
DockerConfig: &s2iapi.DockerConfig{Endpoint: s.dockerSocket},
176+
DockerCfgPath: os.Getenv(dockercfg.PullAuthType),
177+
LabelNamespace: api.DefaultDockerLabelNamespace,
183178

184179
ScriptsURL: s.build.Spec.Strategy.SourceStrategy.Scripts,
185180

@@ -191,11 +186,13 @@ func (s *S2IBuilder) Build() error {
191186
Labels: buildLabels(s.build),
192187
DockerNetworkMode: getDockerNetworkMode(),
193188

194-
Source: sourceURI.String(),
195-
Tag: buildTag,
196-
ContextDir: s.build.Spec.Source.ContextDir,
189+
Source: srcDir,
190+
ForceCopy: true,
191+
Injections: injections,
192+
193+
Tag: buildTag,
194+
197195
CGroupLimits: s.cgLimits,
198-
Injections: injections,
199196
ScriptDownloadProxyConfig: scriptDownloadProxyConfig,
200197
BlockOnBuild: true,
201198
}
@@ -321,57 +318,15 @@ func (s *S2IBuilder) Build() error {
321318
}
322319

323320
type downloader struct {
324-
s *S2IBuilder
325-
in io.Reader
326-
timeout time.Duration
327-
328-
dir string
329-
contextDir string
330-
tmpDir string
321+
sourceInfo *s2iapi.SourceInfo
331322
}
332323

324+
// Download no-ops (because we already downloaded the source to the right location)
325+
// and returns the previously computed sourceInfo for the source.
333326
func (d *downloader) Download(config *s2iapi.Config) (*s2iapi.SourceInfo, error) {
334-
var targetDir string
335-
if len(d.contextDir) > 0 {
336-
targetDir = d.tmpDir
337-
} else {
338-
targetDir = d.dir
339-
}
340-
341-
// fetch source
342-
sourceInfo, err := fetchSource(d.s.dockerClient, targetDir, d.s.build, d.timeout, d.in, d.s.gitClient)
343-
if err != nil {
344-
d.s.build.Status.Reason = api.StatusReasonFetchSourceFailed
345-
d.s.build.Status.Message = api.StatusMessageFetchSourceFailed
346-
if updateErr := retryBuildStatusUpdate(d.s.build, d.s.client, nil); updateErr != nil {
347-
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
348-
}
349-
return nil, err
350-
}
351-
if sourceInfo != nil {
352-
revision := updateBuildRevision(d.s.build, sourceInfo)
353-
if updateErr := retryBuildStatusUpdate(d.s.build, d.s.client, revision); updateErr != nil {
354-
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
355-
}
356-
}
357-
if sourceInfo != nil {
358-
sourceInfo.ContextDir = config.ContextDir
359-
}
327+
config.WorkingSourceDir = config.Source
360328

361-
// if a context dir is provided, move the context dir contents into the src location
362-
if len(d.contextDir) > 0 {
363-
srcDir := filepath.Join(targetDir, d.contextDir)
364-
if err := os.Remove(d.dir); err != nil {
365-
return nil, err
366-
}
367-
if err := os.Rename(srcDir, d.dir); err != nil {
368-
return nil, err
369-
}
370-
}
371-
if sourceInfo != nil {
372-
return &sourceInfo.SourceInfo, nil
373-
}
374-
return nil, nil
329+
return d.sourceInfo, nil
375330
}
376331

377332
// buildEnvVars returns a map with build metadata to be inserted into Docker

0 commit comments

Comments
 (0)