| ... | ... |
@@ -59,3 +59,19 @@ func hasBuildConfigAnnotation(build Build, annotationName, annotationValue strin |
| 59 | 59 |
value, ok := build.Annotations[annotationName] |
| 60 | 60 |
return ok && value == annotationValue |
| 61 | 61 |
} |
| 62 |
+ |
|
| 63 |
+// FindTriggerPolicy retrieves the BuildTrigger(s) of a given type from a build configuration. |
|
| 64 |
+// Returns nil if no matches are found. |
|
| 65 |
+func FindTriggerPolicy(triggerType BuildTriggerType, config *BuildConfig) (buildTriggers []BuildTriggerPolicy) {
|
|
| 66 |
+ for _, specTrigger := range config.Spec.Triggers {
|
|
| 67 |
+ if specTrigger.Type == triggerType {
|
|
| 68 |
+ buildTriggers = append(buildTriggers, specTrigger) |
|
| 69 |
+ } |
|
| 70 |
+ } |
|
| 71 |
+ return buildTriggers |
|
| 72 |
+} |
|
| 73 |
+ |
|
| 74 |
+func HasTriggerType(triggerType BuildTriggerType, bc *BuildConfig) bool {
|
|
| 75 |
+ matches := FindTriggerPolicy(triggerType, bc) |
|
| 76 |
+ return len(matches) > 0 |
|
| 77 |
+} |
| ... | ... |
@@ -42,13 +42,7 @@ type BuildConfigController struct {
|
| 42 | 42 |
func (c *BuildConfigController) HandleBuildConfig(bc *buildapi.BuildConfig) error {
|
| 43 | 43 |
glog.V(4).Infof("Handling BuildConfig %s/%s", bc.Namespace, bc.Name)
|
| 44 | 44 |
|
| 45 |
- hasChangeTrigger := false |
|
| 46 |
- for _, trigger := range bc.Spec.Triggers {
|
|
| 47 |
- if trigger.Type == buildapi.ConfigChangeBuildTriggerType {
|
|
| 48 |
- hasChangeTrigger = true |
|
| 49 |
- break |
|
| 50 |
- } |
|
| 51 |
- } |
|
| 45 |
+ hasChangeTrigger := buildapi.HasTriggerType(buildapi.ConfigChangeBuildTriggerType, bc) |
|
| 52 | 46 |
|
| 53 | 47 |
if !hasChangeTrigger {
|
| 54 | 48 |
return nil |
| ... | ... |
@@ -50,12 +50,9 @@ func GitRefMatches(eventRef, configRef string, buildSource *buildapi.BuildSource |
| 50 | 50 |
// FindTriggerPolicy retrieves the BuildTrigger of a given type from a build |
| 51 | 51 |
// configuration |
| 52 | 52 |
func FindTriggerPolicy(triggerType buildapi.BuildTriggerType, config *buildapi.BuildConfig) (buildTriggers []buildapi.BuildTriggerPolicy, err error) {
|
| 53 |
- err = ErrHookNotEnabled |
|
| 54 |
- for _, specTrigger := range config.Spec.Triggers {
|
|
| 55 |
- if specTrigger.Type == triggerType {
|
|
| 56 |
- buildTriggers = append(buildTriggers, specTrigger) |
|
| 57 |
- err = nil |
|
| 58 |
- } |
|
| 53 |
+ buildTriggers = buildapi.FindTriggerPolicy(triggerType, config) |
|
| 54 |
+ if len(buildTriggers) == 0 {
|
|
| 55 |
+ err = ErrHookNotEnabled |
|
| 59 | 56 |
} |
| 60 | 57 |
return buildTriggers, err |
| 61 | 58 |
} |
| ... | ... |
@@ -20,6 +20,7 @@ import ( |
| 20 | 20 |
"github.com/spf13/cobra" |
| 21 | 21 |
"github.com/spf13/pflag" |
| 22 | 22 |
|
| 23 |
+ "k8s.io/client-go/1.4/pkg/util/wait" |
|
| 23 | 24 |
"k8s.io/kubernetes/pkg/api" |
| 24 | 25 |
"k8s.io/kubernetes/pkg/api/meta" |
| 25 | 26 |
"k8s.io/kubernetes/pkg/api/unversioned" |
| ... | ... |
@@ -463,14 +464,31 @@ func NewFactory(clientConfig kclientcmd.ClientConfig) *Factory {
|
| 463 | 463 |
if err != nil {
|
| 464 | 464 |
return nil, err |
| 465 | 465 |
} |
| 466 |
- builds, err := oc.Builds(t.Namespace).List(api.ListOptions{})
|
|
| 467 |
- if err != nil {
|
|
| 468 |
- return nil, err |
|
| 469 |
- } |
|
| 470 |
- builds.Items = buildapi.FilterBuilds(builds.Items, buildapi.ByBuildConfigPredicate(t.Name)) |
|
| 466 |
+ |
|
| 467 |
+ hasConfigChangeTrigger := buildapi.HasTriggerType(buildapi.ConfigChangeBuildTriggerType, t) |
|
| 468 |
+ |
|
| 469 |
+ var builds *buildapi.BuildList |
|
| 470 |
+ err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
|
|
| 471 |
+ builds, err = oc.Builds(t.Namespace).List(api.ListOptions{})
|
|
| 472 |
+ if err != nil {
|
|
| 473 |
+ return false, err |
|
| 474 |
+ } |
|
| 475 |
+ builds.Items = buildapi.FilterBuilds(builds.Items, buildapi.ByBuildConfigPredicate(t.Name)) |
|
| 476 |
+ if len(builds.Items) > 0 || !hasConfigChangeTrigger {
|
|
| 477 |
+ return true, nil |
|
| 478 |
+ } |
|
| 479 |
+ // Wait for timeout before giving up on the first build from configchange trigger |
|
| 480 |
+ return false, nil |
|
| 481 |
+ }) |
|
| 482 |
+ |
|
| 471 | 483 |
if len(builds.Items) == 0 {
|
| 472 | 484 |
return nil, fmt.Errorf("no builds found for %q", t.Name)
|
| 473 | 485 |
} |
| 486 |
+ |
|
| 487 |
+ if err != nil {
|
|
| 488 |
+ return nil, fmt.Errorf("error finding build for %q: %v", t.Name, err)
|
|
| 489 |
+ } |
|
| 490 |
+ |
|
| 474 | 491 |
if bopts.Version != nil {
|
| 475 | 492 |
// If a version has been specified, try to get the logs from that build. |
| 476 | 493 |
desired := buildutil.BuildNameForConfigVersion(t.Name, int(*bopts.Version)) |