func handleTrigger()

in cmd/testmatrix/main.go [193:247]


func handleTrigger(
	ctx context.Context,
	projectId string,
	trigger *cloudbuild.BuildTrigger,
	cloudbuildService *cloudbuild.Service,
	storageClient *storage.Client,
) (*result, error) {
	if !triggerNameRe.MatchString(trigger.Name) {
		log.Printf("Skipping trigger %v which doesn't match regex", trigger.Name)
		return nil, nil
	}
	res := &result{
		RepoName: trigger.Github.Name,
		Platform: trigger.Tags[1],
		Statuses: make(map[string]status),
	}

	// fetch the latest successful build
	listRes, err := cloudbuildService.Projects.Builds.List(projectId).
		Context(ctx).
		Filter(fmt.Sprintf(`trigger_id="%v" AND status="SUCCESS"`, trigger.Id)).
		PageSize(1).
		Do()
	if err != nil {
		return nil, err
	}
	if len(listRes.Builds) == 0 {
		log.Printf("trigger %v had no successful builds, skipping the trigger", trigger.Name)
		return res, nil
	}

	build := listRes.Builds[0]
	reader, err := storageClient.Bucket(strings.TrimPrefix(build.LogsBucket, "gs://")).
		Object(fmt.Sprintf("log-%v.txt", build.Id)).
		NewReader(ctx)
	if err != nil {
		return nil, err
	}
	defer reader.Close()

	scanner := bufio.NewScanner(reader)
	for scanner.Scan() {
		line := scanner.Text()
		if passMatches := scenarioPassRe.FindStringSubmatch(line); passMatches != nil {
			res.Statuses[passMatches[1]] = pass
		} else if skipMatches := scenarioSkipRe.FindStringSubmatch(line); skipMatches != nil {
			res.Statuses[skipMatches[1]] = skip
		}
	}
	if err := scanner.Err(); err != nil {
		return nil, err
	}

	return res, nil
}