private void MonitorBuilds(object state) { if (!_isBackgroundProcessRunning) { _isBackgroundProcessRunning = true; List <BuildDefinitionItem> crashedBuilds = new List <BuildDefinitionItem>(); foreach (var buildItem in BuildList) { BuildRunItem newLastRun = null; // get last run for particular build //var details = buildItem.TFSBuildDefInstance.QueryBuilds(); IBuildDetailSpec spec = BuildServer.CreateBuildDetailSpec("*"); spec.InformationTypes = null; // for speed improvement //spec.MinFinishTime = DateTime.Now.AddDays(-21); //to get only builds of last 3 weeks spec.MaxBuildsPerDefinition = 1; //get only one build per build definintion spec.QueryOrder = BuildQueryOrder.FinishTimeDescending; //get the latest build only spec.QueryOptions = QueryOptions.All; spec.DefinitionSpec.Name = buildItem.Name; var details = BuildServer.QueryBuilds(spec).Builds; if (details != null) { newLastRun = GetBuildRunInfo(details); //check that status changed if (newLastRun != null && buildItem.LastRun != null && ( newLastRun.BuildNumber != buildItem.LastRun.BuildNumber || newLastRun.BuildStatus != buildItem.LastRun.BuildStatus ) ) { buildItem.LastRun = newLastRun; crashedBuilds.Add(buildItem); } } } if (BuildStatusChanged != null) { BuildStatusChanged(this, new BuildStatusChangedEventArgs() { BuildDefinitions = crashedBuilds.ToArray() }); } _isBackgroundProcessRunning = false; } }
private static BuildRunItem GetBuildRunInfo(IBuildDetail[] details) { BuildRunItem newLastRun = null; var lastRunTFS = details.FirstOrDefault(); if (lastRunTFS != null) { newLastRun = new TFSBuildRunItem() { BuildNumber = lastRunTFS.BuildNumber, StartTime = lastRunTFS.StartTime, FinishTime = lastRunTFS.FinishTime, BuildStatus = (BuildStatusType)((int)lastRunTFS.Status), //TODO: implement proper conversion CompilationStatus = (BuildCompilationStatusType)((int)lastRunTFS.CompilationStatus), //TODO: implement proper conversion TriggeredBy = new RepositoryUser() { Name = lastRunTFS.RequestedBy }, LastChangedBy = new RepositoryUser() { Name = lastRunTFS.LastChangedBy }, CommittedBy = new RepositoryUser() { Name = lastRunTFS.RequestedFor }, Revision = lastRunTFS.SourceGetVersion, TFSBuildLastDetails = lastRunTFS }; //int changeId = InformationNodeConverters.GetChangesetId(lastRunTFS.Information); //if (changeId > 0) //{ // //check who last changed build // Changeset verItem = TeamVersionControl.GetChangeset(changeId); // newLastRun.CommittedBy = new RepositoryUser() { Name = verItem.Committer }; //} } return(newLastRun); }