// MarkVersionCompleted updates the status of a completed version to reflect its correct state by // checking the status of its individual builds. func MarkVersionCompleted(versionId string, finishTime time.Time) error { status := evergreen.VersionSucceeded // Find the statuses for all builds in the version so we can figure out the version's status builds, err := build.Find( build.ByVersion(versionId).WithFields(build.StatusKey), ) if err != nil { return err } for _, b := range builds { if !b.IsFinished() { return nil } if b.Status != evergreen.BuildSucceeded { status = evergreen.VersionFailed } } return version.UpdateOne( bson.M{version.IdKey: versionId}, bson.M{"$set": bson.M{ version.FinishTimeKey: finishTime, version.StatusKey: status, }}, ) }
func MarkVersionStarted(versionId string, startTime time.Time) error { return version.UpdateOne( bson.M{version.IdKey: versionId}, bson.M{"$set": bson.M{ version.StartTimeKey: startTime, version.StatusKey: evergreen.VersionStarted, }}, ) }
// Given the patch version and a list of build variants, creates new builds // with the patch's tasks. func AddNewBuildsForPatch(p *patch.Patch, patchVersion *version.Version, project *Project, buildVariants []string) (*version.Version, error) { // compute a list of the newly added build variants var newVariants []string for _, variant := range buildVariants { if !util.SliceContains(p.BuildVariants, variant) { newVariants = append(newVariants, variant) } } // update the patch if err := p.AddBuildVariants(buildVariants); err != nil { return nil, err } newBuildIds := make([]string, 0) newBuildStatuses := make([]version.BuildStatus, 0) tt := BuildTaskIdTable(project, patchVersion) for _, buildVariant := range newVariants { evergreen.Logger.Logf(slogger.INFO, "Creating build for version %v, buildVariant %v, activated = %v", patchVersion.Id, buildVariant, p.Activated) buildId, err := CreateBuildFromVersion( project, patchVersion, tt, buildVariant, p.Activated, p.Tasks) if err != nil { return nil, err } newBuildIds = append(newBuildIds, buildId) newBuildStatuses = append(newBuildStatuses, version.BuildStatus{ BuildVariant: buildVariant, BuildId: buildId, Activated: p.Activated, }, ) patchVersion.BuildIds = append(patchVersion.BuildIds, buildId) } err := version.UpdateOne( bson.M{version.IdKey: patchVersion.Id}, bson.M{ "$push": bson.M{ version.BuildIdsKey: bson.M{"$each": newBuildIds}, version.BuildVariantsKey: bson.M{"$each": newBuildStatuses}, }, }, ) if err != nil { return nil, err } return patchVersion, nil }
// Given a patch version and a list of variant/task pairs, creates the set of new builds that // do not exist yet out of the set of pairs. No tasks are added for builds which already exist // (see AddNewTasksForPatch). func AddNewBuildsForPatch(p *patch.Patch, patchVersion *version.Version, project *Project, pairs TVPairSet) error { tt := NewPatchTaskIdTable(project, patchVersion, pairs) newBuildIds := make([]string, 0) newBuildStatuses := make([]version.BuildStatus, 0) existingBuilds, err := build.Find(build.ByVersion(patchVersion.Id).WithFields(build.BuildVariantKey, build.IdKey)) if err != nil { return err } variantsProcessed := map[string]bool{} for _, b := range existingBuilds { variantsProcessed[b.BuildVariant] = true } for _, pair := range pairs { if _, ok := variantsProcessed[pair.Variant]; ok { // skip variant that was already processed continue } variantsProcessed[pair.Variant] = true // Extract the unique set of task names for the variant we're about to create taskNames := pairs.TaskNames(pair.Variant) if len(taskNames) == 0 { continue } buildId, err := CreateBuildFromVersion(project, patchVersion, tt, pair.Variant, p.Activated, taskNames) evergreen.Logger.Logf(slogger.INFO, "Creating build for version %v, buildVariant %v, activated = %v", patchVersion.Id, pair.Variant, p.Activated) if err != nil { return err } newBuildIds = append(newBuildIds, buildId) newBuildStatuses = append(newBuildStatuses, version.BuildStatus{ BuildVariant: pair.Variant, BuildId: buildId, Activated: p.Activated, }, ) } return version.UpdateOne( bson.M{version.IdKey: patchVersion.Id}, bson.M{ "$push": bson.M{ version.BuildIdsKey: bson.M{"$each": newBuildIds}, version.BuildVariantsKey: bson.M{"$each": newBuildStatuses}, }, }, ) return nil }