Skip to content

Commit 15e6cf4

Browse files
author
OpenShift Bot
authored
Merge pull request #12873 from coreydaley/bugzilla_1415946_build_failure_reason_for_docker_build
Merged by openshift-bot
2 parents 774a283 + 2df71df commit 15e6cf4

File tree

5 files changed

+54
-41
lines changed

5 files changed

+54
-41
lines changed

pkg/build/builder/common.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ func retryBuildStatusUpdate(build *api.Build, client client.BuildInterface, sour
193193
latestBuild.Spec.Revision = sourceRev
194194
latestBuild.ResourceVersion = ""
195195
}
196-
196+
latestBuild.Status.Phase = build.Status.Phase
197197
latestBuild.Status.Reason = build.Status.Reason
198198
latestBuild.Status.Message = build.Status.Message
199199
latestBuild.Status.Output.To = build.Status.Output.To

pkg/build/builder/docker.go

+5
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ func (d *DockerBuilder) Build() error {
6868
}
6969
sourceInfo, err := fetchSource(d.dockerClient, buildDir, d.build, initialURLCheckTimeout, os.Stdin, d.gitClient)
7070
if err != nil {
71+
d.build.Status.Phase = api.BuildPhaseFailed
7172
d.build.Status.Reason = api.StatusReasonFetchSourceFailed
7273
d.build.Status.Message = api.StatusMessageFetchSourceFailed
7374
handleBuildStatusUpdate(d.build, d.client, nil)
@@ -119,6 +120,7 @@ func (d *DockerBuilder) Build() error {
119120
)
120121
glog.V(0).Infof("\nPulling image %s ...", imageName)
121122
if err = pullImage(d.dockerClient, imageName, pullAuthConfig); err != nil {
123+
d.build.Status.Phase = api.BuildPhaseFailed
122124
d.build.Status.Reason = api.StatusReasonPullBuilderImageFailed
123125
d.build.Status.Message = api.StatusMessagePullBuilderImageFailed
124126
handleBuildStatusUpdate(d.build, d.client, nil)
@@ -128,6 +130,7 @@ func (d *DockerBuilder) Build() error {
128130
}
129131

130132
if err = d.dockerBuild(buildDir, buildTag, d.build.Spec.Source.Secrets); err != nil {
133+
d.build.Status.Phase = api.BuildPhaseFailed
131134
d.build.Status.Reason = api.StatusReasonDockerBuildFailed
132135
d.build.Status.Message = api.StatusMessageDockerBuildFailed
133136
handleBuildStatusUpdate(d.build, d.client, nil)
@@ -136,6 +139,7 @@ func (d *DockerBuilder) Build() error {
136139

137140
cname := containerName("docker", d.build.Name, d.build.Namespace, "post-commit")
138141
if err := execPostCommitHook(d.dockerClient, d.build.Spec.PostCommit, buildTag, cname); err != nil {
142+
d.build.Status.Phase = api.BuildPhaseFailed
139143
d.build.Status.Reason = api.StatusReasonPostCommitHookFailed
140144
d.build.Status.Message = api.StatusMessagePostCommitHookFailed
141145
handleBuildStatusUpdate(d.build, d.client, nil)
@@ -164,6 +168,7 @@ func (d *DockerBuilder) Build() error {
164168
glog.V(0).Infof("\nPushing image %s ...", pushTag)
165169
digest, err := pushImage(d.dockerClient, pushTag, pushAuthConfig)
166170
if err != nil {
171+
d.build.Status.Phase = api.BuildPhaseFailed
167172
d.build.Status.Reason = api.StatusReasonPushImageToRegistryFailed
168173
d.build.Status.Message = api.StatusMessagePushImageToRegistryFailed
169174
handleBuildStatusUpdate(d.build, d.client, nil)

pkg/build/builder/sti.go

+5
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ func (s *S2IBuilder) Build() error {
116116
// fetch source
117117
sourceInfo, err := fetchSource(s.dockerClient, srcDir, s.build, initialURLCheckTimeout, os.Stdin, s.gitClient)
118118
if err != nil {
119+
s.build.Status.Phase = api.BuildPhaseFailed
119120
s.build.Status.Reason = api.StatusReasonFetchSourceFailed
120121
s.build.Status.Message = api.StatusMessageFetchSourceFailed
121122
handleBuildStatusUpdate(s.build, s.client, nil)
@@ -254,6 +255,7 @@ func (s *S2IBuilder) Build() error {
254255
glog.V(4).Infof("Creating a new S2I builder with build config: %#v\n", describe.Config(config))
255256
builder, buildInfo, err := s.builder.Builder(config, s2ibuild.Overrides{Downloader: nil})
256257
if err != nil {
258+
s.build.Status.Phase = api.BuildPhaseFailed
257259
s.build.Status.Reason, s.build.Status.Message = convertS2IFailureType(
258260
buildInfo.FailureReason.Reason,
259261
buildInfo.FailureReason.Message,
@@ -265,6 +267,7 @@ func (s *S2IBuilder) Build() error {
265267
glog.V(4).Infof("Starting S2I build from %s/%s BuildConfig ...", s.build.Namespace, s.build.Name)
266268
result, err := builder.Build(config)
267269
if err != nil {
270+
s.build.Status.Phase = api.BuildPhaseFailed
268271
s.build.Status.Reason, s.build.Status.Message = convertS2IFailureType(
269272
result.BuildInfo.FailureReason.Reason,
270273
result.BuildInfo.FailureReason.Message,
@@ -276,6 +279,7 @@ func (s *S2IBuilder) Build() error {
276279

277280
cName := containerName("s2i", s.build.Name, s.build.Namespace, "post-commit")
278281
if err = execPostCommitHook(s.dockerClient, s.build.Spec.PostCommit, buildTag, cName); err != nil {
282+
s.build.Status.Phase = api.BuildPhaseFailed
279283
s.build.Status.Reason = api.StatusReasonPostCommitHookFailed
280284
s.build.Status.Message = api.StatusMessagePostCommitHookFailed
281285
handleBuildStatusUpdate(s.build, s.client, nil)
@@ -306,6 +310,7 @@ func (s *S2IBuilder) Build() error {
306310
glog.V(0).Infof("\nPushing image %s ...", pushTag)
307311
digest, err := pushImage(s.dockerClient, pushTag, pushAuthConfig)
308312
if err != nil {
313+
s.build.Status.Phase = api.BuildPhaseFailed
309314
s.build.Status.Reason = api.StatusReasonPushImageToRegistryFailed
310315
s.build.Status.Message = api.StatusMessagePushImageToRegistryFailed
311316
handleBuildStatusUpdate(s.build, s.client, nil)

pkg/build/controller/controller.go

+41-40
Original file line numberDiff line numberDiff line change
@@ -302,55 +302,56 @@ func (bc *BuildPodController) HandlePod(pod *kapi.Pod) error {
302302
nextStatus := build.Status.Phase
303303
currentReason := build.Status.Reason
304304

305-
switch pod.Status.Phase {
306-
case kapi.PodRunning:
307-
// The pod's still running
308-
build.Status.Reason = ""
309-
build.Status.Message = ""
310-
nextStatus = buildapi.BuildPhaseRunning
311-
312-
case kapi.PodPending:
313-
build.Status.Reason = ""
314-
build.Status.Message = ""
315-
nextStatus = buildapi.BuildPhasePending
316-
if secret := build.Spec.Output.PushSecret; secret != nil && currentReason != buildapi.StatusReasonMissingPushSecret {
317-
if _, err := bc.SecretClient.Secrets(build.Namespace).Get(secret.Name); err != nil && errors.IsNotFound(err) {
318-
build.Status.Reason = buildapi.StatusReasonMissingPushSecret
319-
build.Status.Message = buildapi.StatusMessageMissingPushSecret
320-
glog.V(4).Infof("Setting reason for pending build to %q due to missing secret %s/%s", build.Status.Reason, build.Namespace, secret.Name)
305+
if build.Status.Phase != buildapi.BuildPhaseFailed {
306+
switch pod.Status.Phase {
307+
case kapi.PodRunning:
308+
// The pod's still running
309+
build.Status.Reason = ""
310+
build.Status.Message = ""
311+
nextStatus = buildapi.BuildPhaseRunning
312+
313+
case kapi.PodPending:
314+
build.Status.Reason = ""
315+
build.Status.Message = ""
316+
nextStatus = buildapi.BuildPhasePending
317+
if secret := build.Spec.Output.PushSecret; secret != nil && currentReason != buildapi.StatusReasonMissingPushSecret {
318+
if _, err := bc.SecretClient.Secrets(build.Namespace).Get(secret.Name); err != nil && errors.IsNotFound(err) {
319+
build.Status.Reason = buildapi.StatusReasonMissingPushSecret
320+
build.Status.Message = buildapi.StatusMessageMissingPushSecret
321+
glog.V(4).Infof("Setting reason for pending build to %q due to missing secret %s/%s", build.Status.Reason, build.Namespace, secret.Name)
322+
}
321323
}
322-
}
323324

324-
case kapi.PodSucceeded:
325-
build.Status.Reason = ""
326-
build.Status.Message = ""
327-
// Check the exit codes of all the containers in the pod
328-
nextStatus = buildapi.BuildPhaseComplete
329-
if len(pod.Status.ContainerStatuses) == 0 {
330-
// no containers in the pod means something went badly wrong, so the build
331-
// should be failed.
332-
glog.V(2).Infof("Failing build %s/%s because the pod has no containers", build.Namespace, build.Name)
333-
nextStatus = buildapi.BuildPhaseFailed
334-
} else {
335-
for _, info := range pod.Status.ContainerStatuses {
336-
if info.State.Terminated != nil && info.State.Terminated.ExitCode != 0 {
337-
nextStatus = buildapi.BuildPhaseFailed
338-
break
325+
case kapi.PodSucceeded:
326+
build.Status.Reason = ""
327+
build.Status.Message = ""
328+
// Check the exit codes of all the containers in the pod
329+
nextStatus = buildapi.BuildPhaseComplete
330+
if len(pod.Status.ContainerStatuses) == 0 {
331+
// no containers in the pod means something went badly wrong, so the build
332+
// should be failed.
333+
glog.V(2).Infof("Failing build %s/%s because the pod has no containers", build.Namespace, build.Name)
334+
nextStatus = buildapi.BuildPhaseFailed
335+
} else {
336+
for _, info := range pod.Status.ContainerStatuses {
337+
if info.State.Terminated != nil && info.State.Terminated.ExitCode != 0 {
338+
nextStatus = buildapi.BuildPhaseFailed
339+
break
340+
}
339341
}
340342
}
341-
}
342343

343-
case kapi.PodFailed:
344-
nextStatus = buildapi.BuildPhaseFailed
344+
case kapi.PodFailed:
345+
nextStatus = buildapi.BuildPhaseFailed
345346

346-
default:
347-
build.Status.Reason = ""
348-
build.Status.Message = ""
347+
default:
348+
build.Status.Reason = ""
349+
build.Status.Message = ""
350+
}
349351
}
350-
351352
// Update the build object when it progress to a next state or the reason for
352353
// the current state changed.
353-
if (!hasBuildPodNameAnnotation(build) || build.Status.Phase != nextStatus) && !buildutil.IsBuildComplete(build) {
354+
if (!hasBuildPodNameAnnotation(build) || build.Status.Phase != nextStatus || build.Status.Phase == buildapi.BuildPhaseFailed) && !buildutil.IsBuildComplete(build) {
354355
setBuildPodNameAnnotation(build, pod.Name)
355356
reason := ""
356357
if len(build.Status.Reason) > 0 {

pkg/build/registry/build/strategy.go

+2
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,13 @@ type detailsStrategy struct {
9494
func (detailsStrategy) PrepareForUpdate(ctx kapi.Context, obj, old runtime.Object) {
9595
newBuild := obj.(*api.Build)
9696
oldBuild := old.(*api.Build)
97+
phase := newBuild.Status.Phase
9798
revision := newBuild.Spec.Revision
9899
message := newBuild.Status.Message
99100
reason := newBuild.Status.Reason
100101
outputTo := newBuild.Status.Output.To
101102
*newBuild = *oldBuild
103+
newBuild.Status.Phase = phase
102104
newBuild.Spec.Revision = revision
103105
newBuild.Status.Reason = reason
104106
newBuild.Status.Message = message

0 commit comments

Comments
 (0)