Skip to content

Commit 3856a1a

Browse files
author
OpenShift Bot
authored
Merge pull request #12234 from bparees/gitclone
Merged by openshift-bot
2 parents 07050d7 + b4be35c commit 3856a1a

File tree

4 files changed

+66
-118
lines changed

4 files changed

+66
-118
lines changed

pkg/build/builder/docker.go

+1-4
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

+51-96
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 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 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
}
@@ -256,7 +253,7 @@ func (s *S2IBuilder) Build() error {
256253
buildInfo.FailureReason.Message,
257254
)
258255
if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil {
259-
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
256+
utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr))
260257
}
261258
return err
262259
}
@@ -270,7 +267,7 @@ func (s *S2IBuilder) Build() error {
270267
)
271268

272269
if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil {
273-
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
270+
utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr))
274271
}
275272
return err
276273
}
@@ -280,7 +277,7 @@ func (s *S2IBuilder) Build() error {
280277
s.build.Status.Reason = api.StatusReasonPostCommitHookFailed
281278
s.build.Status.Message = api.StatusMessagePostCommitHookFailed
282279
if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil {
283-
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
280+
utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr))
284281
}
285282
return err
286283
}
@@ -311,7 +308,7 @@ func (s *S2IBuilder) Build() error {
311308
s.build.Status.Reason = api.StatusReasonPushImageToRegistryFailed
312309
s.build.Status.Message = api.StatusMessagePushImageToRegistryFailed
313310
if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil {
314-
utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr))
311+
utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr))
315312
}
316313
return reportPushFailure(err, authPresent, pushAuthConfig)
317314
}
@@ -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

pkg/build/builder/sti_test.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,7 @@ func makeBuild() *api.Build {
7474
return &api.Build{
7575
Spec: api.BuildSpec{
7676
CommonSpec: api.CommonSpec{
77-
Source: api.BuildSource{
78-
Git: &api.GitBuildSource{
79-
URI: "http://localhost/123",
80-
}},
77+
Source: api.BuildSource{},
8178
Strategy: api.BuildStrategy{
8279
SourceStrategy: &api.SourceBuildStrategy{
8380
Env: append([]kapi.EnvVar{},
@@ -184,6 +181,7 @@ func TestBuildEnvVars(t *testing.T) {
184181
mockBuild := makeBuild()
185182
mockBuild.Name = "openshift-test-1-build"
186183
mockBuild.Namespace = "openshift-demo"
184+
mockBuild.Spec.Source.Git = &api.GitBuildSource{URI: "http://localhost/123"}
187185
resultedEnvList := buildEnvVars(mockBuild)
188186
if !reflect.DeepEqual(expectedEnvList, resultedEnvList) {
189187
t.Errorf("Expected EnvironmentList to match: %#v, got %#v", expectedEnvList, resultedEnvList)

test/extended/builds/failure_status.go

+12-14
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,16 @@ var _ = g.Describe("[builds][Slow] update failure status", func() {
1717

1818
var (
1919
// convert the s2i failure cases to our own StatusReason
20-
reasonAssembleFailed = buildapi.StatusReason(s2istatus.ReasonAssembleFailed)
21-
messageAssembleFailed = string(s2istatus.ReasonMessageAssembleFailed)
22-
reasonFetchSourceFailed = buildapi.StatusReason(s2istatus.ReasonFetchSourceFailed)
23-
messageFetchSourceFailed = string(s2istatus.ReasonMessageFetchSourceFailed)
24-
postCommitHookFixture = exutil.FixturePath("testdata", "statusfail-postcommithook.yaml")
25-
fetchDockerSrc = exutil.FixturePath("testdata", "statusfail-fetchsourcedocker.yaml")
26-
fetchS2ISrc = exutil.FixturePath("testdata", "statusfail-fetchsources2i.yaml")
27-
builderImageFixture = exutil.FixturePath("testdata", "statusfail-fetchbuilderimage.yaml")
28-
pushToRegistryFixture = exutil.FixturePath("testdata", "statusfail-pushtoregistry.yaml")
29-
failedAssembleFixture = exutil.FixturePath("testdata", "statusfail-failedassemble.yaml")
30-
binaryBuildDir = exutil.FixturePath("testdata", "statusfail-assemble")
31-
oc = exutil.NewCLI("update-buildstatus", exutil.KubeConfigPath())
20+
reasonAssembleFailed = buildapi.StatusReason(s2istatus.ReasonAssembleFailed)
21+
messageAssembleFailed = string(s2istatus.ReasonMessageAssembleFailed)
22+
postCommitHookFixture = exutil.FixturePath("testdata", "statusfail-postcommithook.yaml")
23+
fetchDockerSrc = exutil.FixturePath("testdata", "statusfail-fetchsourcedocker.yaml")
24+
fetchS2ISrc = exutil.FixturePath("testdata", "statusfail-fetchsources2i.yaml")
25+
builderImageFixture = exutil.FixturePath("testdata", "statusfail-fetchbuilderimage.yaml")
26+
pushToRegistryFixture = exutil.FixturePath("testdata", "statusfail-pushtoregistry.yaml")
27+
failedAssembleFixture = exutil.FixturePath("testdata", "statusfail-failedassemble.yaml")
28+
binaryBuildDir = exutil.FixturePath("testdata", "statusfail-assemble")
29+
oc = exutil.NewCLI("update-buildstatus", exutil.KubeConfigPath())
3230
)
3331

3432
g.JustBeforeEach(func() {
@@ -80,8 +78,8 @@ var _ = g.Describe("[builds][Slow] update failure status", func() {
8078

8179
build, err := oc.Client().Builds(oc.Namespace()).Get(br.Build.Name)
8280
o.Expect(err).NotTo(o.HaveOccurred())
83-
o.Expect(build.Status.Reason).To(o.Equal(reasonFetchSourceFailed))
84-
o.Expect(build.Status.Message).To(o.Equal(messageFetchSourceFailed))
81+
o.Expect(build.Status.Reason).To(o.Equal(buildapi.StatusReasonFetchSourceFailed))
82+
o.Expect(build.Status.Message).To(o.Equal(buildapi.StatusMessageFetchSourceFailed))
8583
})
8684
})
8785

0 commit comments

Comments
 (0)