public DataChangesResult ProcessBuildDrops(Guid collectionId) { var trackingTimestamp = GetTrackingTimestamp(collectionId); var buildDetailSpec = new BuildDetailSpec { MinFinishTime = trackingTimestamp, DefinitionFilter = new BuildDefinitionSpec { FullPath = string.Format(@"\{0}\{0}", BuildConstants.Star) }, // all build definitions in all team projects BuildNumber = BuildConstants.Star, QueryOrder = BuildQueryOrder.FinishTimeAscending, InformationTypes = { InformationTypes.BuildProject } }; using (var buildReader = _buildServer.QueryBuilds(new[] {buildDetailSpec})) { foreach (var result in buildReader.CurrentEnumerable<BuildQueryResult>()) { while (result.Builds.MoveNext()) { if (_warehouseInterupt.IsWarehouseHostCancelled || _warehouseInterupt.IsWarehouseSchemaLockRequested) { return DataChangesResult.DataChangesPending; } var buildDetail = result.Builds.Current; if (!string.IsNullOrEmpty(buildDetail.DropLocation)) { var folderSize = _calculator.Calculate(buildDetail.DropLocation); var buildFinish = buildDetail.FinishTime.ToUniversalTime(); trackingTimestamp = trackingTimestamp < buildFinish ? buildFinish : trackingTimestamp; SaveBuildDropSize(collectionId, buildDetail.Uri, folderSize, buildDetail.DropLocation); } SaveTrackingValue(collectionId, trackingTimestamp); } } } return DataChangesResult.NoChangesPending; }
private BuildQueryEventArgs QueryBuilds(IEnumerable<BuildDefinition> buildDefinitions) { using (BuildServiceSoapClient soapClient = new BuildServiceSoapClient(GetBinding(Protocol, "BuildServiceSoap"), GetBuildEndpointAddress())) { List<BuildDetailSpec> buildDetailSpecs = new List<BuildDetailSpec>(); List<BuildQueueSpec> buildQueueSpecs = new List<BuildQueueSpec>(); //Do queries foreach (BuildDefinition definition in buildDefinitions) { BuildDetailSpec buildDetailSpec = new BuildDetailSpec { BuildNumber = "*", DefinitionPath = definition.FullPath, DefinitionSpec = new BuildDefinitionSpec { FullPath = definition.FullPath }, MaxBuildsPerDefinition = 1, MinChangedTime = DateTime.MinValue, MinFinishTime = DateTime.MinValue, QueryOrder = BuildQueryOrder.FinishTimeDescending }; buildDetailSpecs.Add(buildDetailSpec); } //Generate agent specs foreach (TeamProject project in Projects) { foreach (BuildAgent agent in project.BuildAgents) { buildQueueSpecs.Add(new BuildQueueSpec { AgentSpec = new BuildAgentSpec { FullPath = agent.FullPath, MachineName = agent.MachineName, Port = agent.Port }, CompletedAge = 300, DefinitionSpec = new BuildDefinitionSpec { FullPath = "\\" + project.ProjectName + "\\*" }, Options = QueryOptions.All, StatusFlags = QueueStatus.Completed | QueueStatus.InProgress | QueueStatus.Queued }); } } try { ReadOnlyCollection<BuildQueueQueryResult> queueResults = new List<BuildQueueQueryResult>(soapClient.QueryBuildQueue(buildQueueSpecs.ToArray())). AsReadOnly(); ReadOnlyCollection<BuildQueryResult> buildResults = new List<BuildQueryResult>(soapClient.QueryBuilds(buildDetailSpecs.ToArray())).AsReadOnly(); try { soapClient.Close(); } catch (Exception) { soapClient.Abort(); } return new BuildQueryEventArgs { BuildQueryResults = buildResults, BuildQueueQueryResults = queueResults }; } catch { return null; } } }