Skip to content

Commit 19872e4

Browse files
Report multiple build causes for image change triggers
Improve tests
1 parent 3cae5f5 commit 19872e4

File tree

3 files changed

+342
-32
lines changed

3 files changed

+342
-32
lines changed

pkg/image/controller/trigger/image_trigger_controller_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ func TestTriggerControllerSyncBuildConfigResource(t *testing.T) {
258258
{
259259
Message: "Image change",
260260
ImageChangeBuild: &buildapi.ImageChangeCause{
261+
ImageID: "image/result:1",
261262
FromRef: &kapi.ObjectReference{Kind: "ImageStreamTag", Name: "stream:2", Namespace: "other"},
262263
},
263264
},
@@ -277,6 +278,7 @@ func TestTriggerControllerSyncBuildConfigResource(t *testing.T) {
277278
{
278279
Message: "Image change",
279280
ImageChangeBuild: &buildapi.ImageChangeCause{
281+
ImageID: "image/result:1",
280282
FromRef: &kapi.ObjectReference{Kind: "ImageStreamTag", Name: "stream:" + imageapi.DefaultImageTag, Namespace: "other"},
281283
},
282284
},

pkg/image/trigger/buildconfigs/buildconfigs.go

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,14 @@ type BuildConfigReactor struct {
121121
func (r *BuildConfigReactor) ImageChanged(obj interface{}, tagRetriever trigger.TagRetriever) error {
122122
bc := obj.(*buildapi.BuildConfig)
123123

124-
var (
125-
changed bool
126-
id string
127-
from *kapi.ObjectReference
128-
ref string
129-
)
124+
var request *buildapi.BuildRequest
125+
var fired map[kapi.ObjectReference]string
130126
for _, t := range bc.Spec.Triggers {
131127
p := t.ImageChange
132128
if p == nil || (p.From != nil && p.From.Kind != "ImageStreamTag") {
133129
continue
134130
}
131+
var from *kapi.ObjectReference
135132
if p.From != nil {
136133
from = p.From
137134
} else {
@@ -141,43 +138,64 @@ func (r *BuildConfigReactor) ImageChanged(obj interface{}, tagRetriever trigger.
141138
if len(namespace) == 0 {
142139
namespace = bc.Namespace
143140
}
144-
latest, _, found := tagRetriever.ImageStreamTag(namespace, from.Name)
141+
142+
// lookup the source if we haven't already retrieved it
143+
var newSource bool
144+
latest, found := fired[*from]
145145
if !found {
146+
latest, _, found = tagRetriever.ImageStreamTag(namespace, from.Name)
147+
if !found {
148+
continue
149+
}
150+
newSource = true
151+
}
152+
153+
// LastTriggeredImageID is an image ref, despite the name
154+
if latest == p.LastTriggeredImageID {
146155
continue
147156
}
148-
if latest != p.LastTriggeredImageID {
149-
changed = true
150-
ref = latest
151-
break
157+
158+
// prevent duplicate build trigger causes
159+
if fired == nil {
160+
fired = make(map[kapi.ObjectReference]string)
152161
}
153-
}
162+
fired[*from] = latest
154163

155-
if !changed {
156-
return nil
157-
}
164+
if request == nil {
165+
request = &buildapi.BuildRequest{
166+
ObjectMeta: metav1.ObjectMeta{
167+
Name: bc.Name,
168+
Namespace: bc.Namespace,
169+
},
170+
}
171+
}
172+
if request.TriggeredByImage == nil {
173+
request.TriggeredByImage = &kapi.ObjectReference{
174+
Kind: "DockerImage",
175+
Name: latest,
176+
}
177+
}
178+
if request.From == nil {
179+
request.From = from
180+
}
158181

159-
// instantiate new build
160-
glog.V(4).Infof("Running build for BuildConfig %s/%s", bc.Namespace, bc.Name)
161-
request := &buildapi.BuildRequest{
162-
ObjectMeta: metav1.ObjectMeta{
163-
Name: bc.Name,
164-
Namespace: bc.Namespace,
165-
},
166-
TriggeredBy: []buildapi.BuildTriggerCause{
167-
{
182+
if newSource {
183+
request.TriggeredBy = append(request.TriggeredBy, buildapi.BuildTriggerCause{
168184
Message: buildapi.BuildTriggerCauseImageMsg,
169185
ImageChangeBuild: &buildapi.ImageChangeCause{
170-
ImageID: id,
186+
ImageID: latest,
171187
FromRef: from,
172188
},
173-
},
174-
},
175-
TriggeredByImage: &kapi.ObjectReference{
176-
Kind: "DockerImage",
177-
Name: ref,
178-
},
179-
From: from,
189+
})
190+
}
180191
}
192+
193+
if request == nil {
194+
return nil
195+
}
196+
197+
// instantiate new build
198+
glog.V(4).Infof("Requesting build for BuildConfig based on image triggers %s/%s: %#v", bc.Namespace, bc.Name, request)
181199
_, err := r.Instantiator.Instantiate(bc.Namespace, request)
182200
return err
183201
}

0 commit comments

Comments
 (0)