Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions pkg/config/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,38 @@ func (p *Prowgen) GetSlackReporterConfigForTest(test, variant string) *SlackRepo
return nil
}

// GetSlackReporterConfigForJobName checks against full job names, allowing excluded_job_patterns
// to work with prefixes like "pull-", "periodic-", etc.
func (p *Prowgen) GetSlackReporterConfigForJobName(fullJobName, testName, variant string) *SlackReporterConfig {
for _, s := range p.SlackReporterConfigs {
if !slices.Contains(s.ExcludedVariants, variant) {
// Check if job is excluded by pattern (using full job name)
isExcluded := false
for _, excludePattern := range s.ExcludedJobPatterns {
if matched, err := regexp.MatchString(excludePattern, fullJobName); err == nil && matched {
isExcluded = true
break
}
}

if !isExcluded {
// Check exact job name matches first (against test name for backward compatibility)
if slices.Contains(s.JobNames, testName) {
return &s
}

// Check regex pattern matches (against test name for backward compatibility)
for _, pattern := range s.JobNamePatterns {
if matched, err := regexp.MatchString(pattern, testName); err == nil && matched {
return &s
}
}
}
}
}
return nil
}

func (p *Prowgen) MergeDefaults(defaults *Prowgen) {
if defaults.Private {
p.Private = true
Expand Down
69 changes: 69 additions & 0 deletions pkg/config/load_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -604,3 +604,72 @@ func TestValidateProwgenSkipOperatorPresubmits(t *testing.T) {
})
}
}

func TestProwgen_MergeDefaults_SlackReporterConfigs(t *testing.T) {
testCases := []struct {
name string
base Prowgen
defaults Prowgen
expected []SlackReporterConfig
}{
{
name: "slack reporter configs are never merged from defaults",
base: Prowgen{},
defaults: Prowgen{
SlackReporterConfigs: []SlackReporterConfig{
{
Channel: "#test-channel",
JobStatesToReport: []prowv1.ProwJobState{"failure"},
JobNamePatterns: []string{".*"},
ExcludedJobPatterns: []string{".*-skip$"},
},
},
},
expected: nil,
},
{
name: "existing slack reporter configs are preserved unchanged",
base: Prowgen{
SlackReporterConfigs: []SlackReporterConfig{
{
Channel: "#existing-channel",
JobStatesToReport: []prowv1.ProwJobState{"error"},
JobNames: []string{"unit"},
},
},
},
defaults: Prowgen{
SlackReporterConfigs: []SlackReporterConfig{
{
Channel: "#default-channel",
JobStatesToReport: []prowv1.ProwJobState{"failure"},
JobNamePatterns: []string{".*"},
ExcludedJobPatterns: []string{".*-skip$"},
},
},
},
expected: []SlackReporterConfig{
{
Channel: "#existing-channel",
JobStatesToReport: []prowv1.ProwJobState{"error"},
JobNames: []string{"unit"},
},
},
},
{
name: "empty base with empty defaults stays empty",
base: Prowgen{},
defaults: Prowgen{},
expected: nil,
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
tc.base.MergeDefaults(&tc.defaults)
if diff := cmp.Diff(tc.base.SlackReporterConfigs, tc.expected); diff != "" {
t.Fatalf("SlackReporterConfigs don't match expected, diff: %v", diff)
}
})
}
}
12 changes: 2 additions & 10 deletions pkg/prowgen/jobbase.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,16 +139,8 @@ func NewProwJobBaseBuilderForTest(configSpec *cioperatorapi.ReleaseBuildConfigur
if testContainsLease(&test) {
p.PodSpec.Add(LeaseClient())
}
if slackReporter := info.Config.GetSlackReporterConfigForTest(test.As, configSpec.Metadata.Variant); slackReporter != nil {
if p.base.ReporterConfig == nil {
p.base.ReporterConfig = &prowv1.ReporterConfig{}
}
p.base.ReporterConfig.Slack = &prowv1.SlackReporterConfig{
Channel: slackReporter.Channel,
JobStatesToReport: slackReporter.JobStatesToReport,
ReportTemplate: slackReporter.ReportTemplate,
}
}
// Note: Slack reporter config is now set in individual job generation functions
// to support full job name matching in excluded_job_patterns

switch {
case test.MultiStageTestConfigurationLiteral != nil:
Expand Down
22 changes: 22 additions & 0 deletions pkg/prowgen/jobbase_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,28 @@ func TestNewProwJobBaseBuilderForTest(t *testing.T) {
},
},
},
{
name: "job excluded by patterns should not have slack reporter config",
test: ciop.TestStepConfiguration{
As: "unit-skip",
Commands: "make unit",
ContainerTestConfiguration: &ciop.ContainerTestConfiguration{From: "src"},
},
info: &ProwgenInfo{
Metadata: ciop.Metadata{Org: "o", Repo: "r", Branch: "b"},
Config: config.Prowgen{
SlackReporterConfigs: []config.SlackReporterConfig{
{
Channel: "some-channel",
JobStatesToReport: []prowv1.ProwJobState{"error"},
ReportTemplate: "some template",
JobNames: []string{"unit-skip", "e2e"},
ExcludedJobPatterns: []string{".*-skip$"},
},
},
},
},
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
Expand Down
52 changes: 42 additions & 10 deletions pkg/prowgen/prowgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,16 +146,7 @@ func GenerateJobs(configSpec *cioperatorapi.ReleaseBuildConfiguration, info *Pro
injectArchitectureLabels(jobBaseGen, configSpec.Images)

jobBaseGen.PodSpec.Add(Promotion(), Targets(imageTargets.UnsortedList()...))
if slackReporter := info.Config.GetSlackReporterConfigForTest(imagesTestName, configSpec.Metadata.Variant); slackReporter != nil {
if jobBaseGen.base.ReporterConfig == nil {
jobBaseGen.base.ReporterConfig = &prowv1.ReporterConfig{}
}
jobBaseGen.base.ReporterConfig.Slack = &prowv1.SlackReporterConfig{
Channel: slackReporter.Channel,
JobStatesToReport: slackReporter.JobStatesToReport,
ReportTemplate: slackReporter.ReportTemplate,
}
}
// Note: Slack reporter config for images postsubmit is now handled in generatePostsubmitForTest
postsubmit := generatePostsubmitForTest(jobBaseGen, info)
postsubmit.MaxConcurrency = 1
if postsubmit.Labels == nil {
Expand Down Expand Up @@ -266,6 +257,19 @@ func generatePresubmitForTest(jobBaseBuilder *prowJobBaseBuilder, name string, i

shortName := info.TestName(name)
base := jobBaseBuilder.Rehearsable(!opts.disableRehearsal).Build(jc.PresubmitPrefix)

// Set slack reporter config using full job name for proper excluded_job_patterns matching
fullJobName := info.JobName(jc.PresubmitPrefix, name)
if slackReporter := info.Config.GetSlackReporterConfigForJobName(fullJobName, name, info.Metadata.Variant); slackReporter != nil {
if base.ReporterConfig == nil {
base.ReporterConfig = &prowv1.ReporterConfig{}
}
base.ReporterConfig.Slack = &prowv1.SlackReporterConfig{
Channel: slackReporter.Channel,
JobStatesToReport: slackReporter.JobStatesToReport,
ReportTemplate: slackReporter.ReportTemplate,
}
}
pipelineOpt := false
if opts.pipelineRunIfChanged != "" {
if base.Annotations == nil {
Expand Down Expand Up @@ -312,6 +316,20 @@ func generatePostsubmitForTest(jobBaseBuilder *prowJobBaseBuilder, info *Prowgen
}

base := jobBaseBuilder.Build(jc.PostsubmitPrefix)

// Set slack reporter config using full job name for proper excluded_job_patterns matching
testName := jobBaseBuilder.testName
fullJobName := info.JobName(jc.PostsubmitPrefix, testName)
if slackReporter := info.Config.GetSlackReporterConfigForJobName(fullJobName, testName, info.Metadata.Variant); slackReporter != nil {
if base.ReporterConfig == nil {
base.ReporterConfig = &prowv1.ReporterConfig{}
}
base.ReporterConfig.Slack = &prowv1.SlackReporterConfig{
Channel: slackReporter.Channel,
JobStatesToReport: slackReporter.JobStatesToReport,
ReportTemplate: slackReporter.ReportTemplate,
}
}
alwaysRun := opts.runIfChanged == "" && opts.skipIfOnlyChanged == ""
pj := &prowconfig.Postsubmit{
JobBase: base,
Expand Down Expand Up @@ -366,6 +384,20 @@ func GeneratePeriodicForTest(jobBaseBuilder *prowJobBaseBuilder, info *ProwgenIn
// We are resetting PathAlias because it will be set on the `ExtraRefs` item
base := jobBaseBuilder.Rehearsable(!opts.DisableRehearsal).PathAlias("").Build(jc.PeriodicPrefix)

// Set slack reporter config using full job name for proper excluded_job_patterns matching
testName := jobBaseBuilder.testName
fullJobName := info.JobName(jc.PeriodicPrefix, testName)
if slackReporter := info.Config.GetSlackReporterConfigForJobName(fullJobName, testName, info.Metadata.Variant); slackReporter != nil {
if base.ReporterConfig == nil {
base.ReporterConfig = &prowv1.ReporterConfig{}
}
base.ReporterConfig.Slack = &prowv1.SlackReporterConfig{
Channel: slackReporter.Channel,
JobStatesToReport: slackReporter.JobStatesToReport,
ReportTemplate: slackReporter.ReportTemplate,
}
}

cron := opts.Cron
if cron == "@daily" {
cron = hashDailyCron(base.Name)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@ presubmits:
labels:
pj-rehearse.openshift.io/can-be-rehearsed: "true"
name: pull-ci-organization-repository-branch-images
reporter_config:
slack:
channel: some-channel
job_states_to_report:
- error
report_template: some template
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
agent: kubernetes
decorate: true
decoration_config:
skip_cloning: true
name: prefix-ci-o-r-b-unit-skip
spec:
containers:
- args:
- --gcs-upload-secret=/secrets/gcs/service-account.json
- --image-import-pull-secret=/etc/pull-secret/.dockerconfigjson
- --report-credentials-file=/etc/report/credentials
- --target=unit-skip
command:
- ci-operator
image: quay-proxy.ci.openshift.org/openshift/ci:ci_ci-operator_latest
imagePullPolicy: Always
name: ""
resources:
requests:
cpu: 10m
volumeMounts:
- mountPath: /secrets/gcs
name: gcs-credentials
readOnly: true
- mountPath: /secrets/manifest-tool
name: manifest-tool-local-pusher
readOnly: true
- mountPath: /etc/pull-secret
name: pull-secret
readOnly: true
- mountPath: /etc/report
name: result-aggregator
readOnly: true
serviceAccountName: ci-operator
volumes:
- name: manifest-tool-local-pusher
secret:
secretName: manifest-tool-local-pusher
- name: pull-secret
secret:
secretName: registry-pull-credentials
- name: result-aggregator
secret:
secretName: result-aggregator
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,6 @@ decorate: true
decoration_config:
skip_cloning: true
name: prefix-ci-o-r-b-unit
reporter_config:
slack:
channel: some-channel
job_states_to_report:
- error
report_template: some template
spec:
containers:
- args:
Expand Down