diff --git a/pkg/validation/config.go b/pkg/validation/config.go index ab30581cd12..a133c590e86 100644 --- a/pkg/validation/config.go +++ b/pkg/validation/config.go @@ -375,7 +375,8 @@ func validateReleaseTagConfiguration(fieldRoot string, input api.ReleaseTagConfi func validateReleaseBuildConfiguration(input *api.ReleaseBuildConfiguration, org, repo string) []error { var validationErrors []error - if len(input.Tests) == 0 && len(input.Images) == 0 { + // Third conjunct is a corner case, the config can e.g. promote its `src` + if len(input.Tests) == 0 && len(input.Images) == 0 && (input.PromotionConfiguration == nil || len(input.PromotionConfiguration.AdditionalImages) == 0) { validationErrors = append(validationErrors, errors.New("you must define at least one test or image build in 'tests' or 'images'")) } diff --git a/pkg/validation/config_test.go b/pkg/validation/config_test.go index d9e4066ffa1..8cc1e392c58 100644 --- a/pkg/validation/config_test.go +++ b/pkg/validation/config_test.go @@ -1092,3 +1092,30 @@ func TestPipelineImages(t *testing.T) { }) } } + +func TestValidateReleaseBuildConfiguration(t *testing.T) { + testCases := []struct { + name string + input *api.ReleaseBuildConfiguration + expected []error + }{ + { + name: "empty images and tests -> error", + input: &api.ReleaseBuildConfiguration{}, + expected: []error{errors.New("you must define at least one test or image build in 'tests' or 'images'")}, + }, + { + name: "empty images and tests -> not error if additional images are promoted", + input: &api.ReleaseBuildConfiguration{ + PromotionConfiguration: &api.PromotionConfiguration{AdditionalImages: map[string]string{"name": "src"}}, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tc.input.Resources = map[string]api.ResourceRequirements{"*": {Requests: map[string]string{"cpu": "1"}}} + err := validateReleaseBuildConfiguration(tc.input, "org", "repo") + testhelper.Diff(t, "error", err, tc.expected, testhelper.EquateErrorMessage) + }) + } +}