in metrics/metrics/platform_significance.go [55:116]
func collectPipelineResults(buildResult data.DataSet) (map[string]*pipelineStats, error) {
stats := make(map[string]*pipelineStats)
for _, row := range buildResult.GetData().Data {
values, err := toString(row)
if err != nil {
return nil, fmt.Errorf("Could not process build_success results: %v", err)
}
pipeline := values[0]
if _, ok := stats[pipeline]; !ok {
stats[pipeline] = &pipelineStats{}
}
passed := true
canceled := false
failures := make([]int, 0)
missingData := 0
for i := 1; i < len(values); i += 1 {
if values[i] == "" {
// Count the columns without data. If all columns have no data, this means that the setup step failed or was canceled.
// Otherwise missing data means that the respective platform is not part of a given pipeline.
missingData += 1
} else if values[i] != passingState {
passed = false
if values[i] == canceledState {
canceled = true
break
} else if values[i] == failedState {
failures = append(failures, i)
}
}
}
stats[pipeline].totalBuilds += 1
if missingData == len(values)-1 {
stats[pipeline].setupFailed += 1
} else if canceled {
stats[pipeline].canceledBuilds += 1
} else if passed {
stats[pipeline].passingBuilds += 1
} else if len(failures) > 1 {
stats[pipeline].multiPlatformFailures += 1
} else if len(failures) == 1 {
// TODO(fweikert): improve data struct?
id := fmt.Sprintf("%s/%s/%d", row[0], row[1], row[2])
switch failures[0] {
case 1:
stats[pipeline].linuxFailures += 1
log.Printf("Linux only: %s\n", id)
case 2:
stats[pipeline].macosFailures += 1
log.Printf("MacOS only: %s\n", id)
case 3:
stats[pipeline].windowsFailures += 1
log.Printf("Windows only: %s\n", id)
case 4:
stats[pipeline].rbeFailures += 1
log.Printf("RBE only: %s\n", id)
}
}
}
return stats, nil
}