@@ -121,17 +121,14 @@ type BuildConfigReactor struct {
121
121
func (r * BuildConfigReactor ) ImageChanged (obj interface {}, tagRetriever trigger.TagRetriever ) error {
122
122
bc := obj .(* buildapi.BuildConfig )
123
123
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
130
126
for _ , t := range bc .Spec .Triggers {
131
127
p := t .ImageChange
132
128
if p == nil || (p .From != nil && p .From .Kind != "ImageStreamTag" ) {
133
129
continue
134
130
}
131
+ var from * kapi.ObjectReference
135
132
if p .From != nil {
136
133
from = p .From
137
134
} else {
@@ -141,43 +138,64 @@ func (r *BuildConfigReactor) ImageChanged(obj interface{}, tagRetriever trigger.
141
138
if len (namespace ) == 0 {
142
139
namespace = bc .Namespace
143
140
}
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 ]
145
145
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 {
146
155
continue
147
156
}
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 )
152
161
}
153
- }
162
+ fired [ * from ] = latest
154
163
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
+ }
158
181
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 {
168
184
Message : buildapi .BuildTriggerCauseImageMsg ,
169
185
ImageChangeBuild : & buildapi.ImageChangeCause {
170
- ImageID : id ,
186
+ ImageID : latest ,
171
187
FromRef : from ,
172
188
},
173
- },
174
- },
175
- TriggeredByImage : & kapi.ObjectReference {
176
- Kind : "DockerImage" ,
177
- Name : ref ,
178
- },
179
- From : from ,
189
+ })
190
+ }
180
191
}
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 )
181
199
_ , err := r .Instantiator .Instantiate (bc .Namespace , request )
182
200
return err
183
201
}
0 commit comments