code: func CIService(c context.Context) (*ui.CIService, error) {
  	result := &ui.CIService{Name: "Buildbot"}
  	masters, err := buildstore.AllMasters(c, true)
  	if err != nil {
  		return nil, err
  	}
  
  	// Add each builder from each master m into the result.
  	for _, m := range masters {
  		ml := ui.BuilderGroup{Name: m.Name}
  		// Sort the builder listing.
  		builders := make([]string, 0, len(m.Builders))
  		for b := range m.Builders {
  			builders = append(builders, b)
  		}
  		sort.Strings(builders)
  		for _, b := range builders {
  			// Go templates escapes this for us, and also
  			// slashes are not allowed in builder names.
  			ml.Builders = append(ml.Builders, *ui.NewLink(
  				b, fmt.Sprintf("/buildbot/%s/%s", m.Name, b),
  				fmt.Sprintf("buildbot builder %s on master %s", b, m.Name)))
  		}
  		result.BuilderGroups = append(result.BuilderGroups, ml)
  	}
  	return result, nil
  }
docs: // CIService returns a *ui.CIService containing all known masters and builders.