public async Task <List <TfsRestProjectCollection> > GetBuildDefinitionsGrouped(string url, string username, string password) { var resultProjectCollections = new List <TfsRestProjectCollection>(); TfsConnectionDetails connection = new TfsConnectionDetails(url, username, password); var projectCollections = await _tfsJsonService.GetProjectCollections(connection); foreach (var projectCollection in projectCollections) { //substitue the project name with DefaultCollection as defined in VSO REST API documenation projectCollection.Name = SubstituteName(url, projectCollection.Name); var resultProjectCollection = new TfsRestProjectCollection(projectCollection); var projects = await _tfsJsonService.GetProjects(connection, projectCollection.Name); foreach (var project in projects) { var resultProject = new TfsRestProject(project); resultProjectCollection.Projects.Add(resultProject); var buildDefinitions = await GetBuildDefinitions(connection, projectCollection, project); resultProject.BuildDefinitions = buildDefinitions; } resultProjectCollections.Add(resultProjectCollection); } return(resultProjectCollections); }
private async Task <List <T> > GetFromTfs <T>(TfsConnectionDetails connection, string api, Dictionary <string, string> queryParams) { HttpClientHandler handler = new HttpClientHandler() { AllowAutoRedirect = true, Credentials = connection.AsNetworkConnection() }; HttpClient httpClient = new HttpClient(handler) { BaseAddress = connection.GetBaseAddress() }; httpClient.DefaultRequestHeaders.Accept.Clear(); var credentialsBase64Encoded = connection.Base64EncodeCredentials(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentialsBase64Encoded); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var queryParamsAsString = string.Concat(queryParams.Select(i => "&" + i.Key + "=" + i.Value)); var buildDefinitionsStr = await httpClient.GetStringAsync(api + "?api-version=2.0" + queryParamsAsString); var jsonWrapper = JsonConvert.DeserializeObject <TfsJsonWrapper <T> >(buildDefinitionsStr); return(jsonWrapper.Value); }
private async Task <string> GetCommentOnce(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection) { var comments = await _tfsJsonService.GetComments(tfsJsonBuild, connection, projectCollection); var firstComment = comments.FirstOrDefault(); var message = firstComment?.Message; return(message); }
public async Task FetchNewComments(List <TfsJsonBuild> projects, TfsConnectionDetails connection, Func <TfsJsonBuild, Task <string> > getCommentFunc) { var unCachedDefinitions = projects.Where(i => !_commentsCache.ContainsKey(i.Definition.Id)); var newlyChangedBuilds = projects.Where(i => _commentsCache.ContainsKey(i.Definition.Id) && _commentsCache[i.Definition.Id].Item1 != i.Id); var allInvalidCaches = unCachedDefinitions.Concat(newlyChangedBuilds); var commentRetrievalTasks = allInvalidCaches.Select(tfsJsonBuild => FetchAndSaveComment(getCommentFunc, tfsJsonBuild)); // perform all comment retrievals in parallel await Task.WhenAll(commentRetrievalTasks); }
public async Task FetchNewComments(List<TfsJsonBuild> projects, TfsConnectionDetails connection, Func<TfsJsonBuild, Task<string>> getCommentFunc) { var unCachedDefinitions = projects.Where(i => !_commentsCache.ContainsKey(i.Definition.Id)); var newlyChangedBuilds = projects.Where(i => _commentsCache.ContainsKey(i.Definition.Id) && _commentsCache[i.Definition.Id].Item1 != i.Id); var allInvalidCaches = unCachedDefinitions.Concat(newlyChangedBuilds); var commentRetrievalTasks = allInvalidCaches.Select(tfsJsonBuild => FetchAndSaveComment(getCommentFunc, tfsJsonBuild)); // perform all comment retrievals in parallel await Task.WhenAll(commentRetrievalTasks); }
public async Task<IEnumerable<TfsRestBuildStatus>> GetBuildsStatuses(CiEntryPointSetting ciEntryPointSetting, BuildDefinitionSetting[] watchedBuildDefinitions) { var connection = new TfsConnectionDetails(ciEntryPointSetting); var buildDefinitionsByProjectCollection = watchedBuildDefinitions.GroupBy(bd => bd.Parent); List<TfsRestBuildStatus> resultingBuildStatuses = new List<TfsRestBuildStatus>(); foreach (var buildDefinitionGroup in buildDefinitionsByProjectCollection) { var projectCollection = buildDefinitionGroup.Key; var buildQueryParams = GetBuildQueryParams(buildDefinitionGroup.ToArray()); var projects = await _tfsJsonService.GetBuildsStatuses(connection, buildQueryParams, projectCollection); await _commentsCache.FetchNewComments(projects, connection, tfsJsonBuilds => GetComment(tfsJsonBuilds, connection, projectCollection)); var buildStatuses = projects.Select(i => new TfsRestBuildStatus(i, _commentsCache)); resultingBuildStatuses.AddRange(buildStatuses); } return resultingBuildStatuses; }
private async Task<string> GetComment(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection) { var message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection); if (tfsJsonBuild.Definition.Type == "xaml" && message == null) { // old style xaml builds don't get associated with a commit immediately for some annoying reason, so keep trying for 2 minutes const int maxRetries = 12; for (int i = 0; i < maxRetries && message == null; i++) { _log.Debug("Comment was null for a xaml build definition, so delaying and checking for a comment again in 10 seconds"); await Task.Delay(10000); message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection); } } return message?.Trim(); }
private async Task <string> GetComment(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection) { var message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection); if (tfsJsonBuild.Definition.Type == "xaml" && message == null) { // old style xaml builds don't get associated with a commit immediately for some annoying reason, so keep trying for 2 minutes const int maxRetries = 12; for (int i = 0; i < maxRetries && message == null; i++) { _log.Debug("Comment was null for a xaml build definition, so delaying and checking for a comment again in 10 seconds"); await Task.Delay(10000); message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection); } } return(message?.Trim()); }
public async Task <IEnumerable <TfsRestBuildStatus> > GetBuildsStatuses(CiEntryPointSetting ciEntryPointSetting, BuildDefinitionSetting[] watchedBuildDefinitions) { var connection = new TfsConnectionDetails(ciEntryPointSetting); var buildDefinitionsByProjectCollection = watchedBuildDefinitions.GroupBy(bd => bd.Parent); List <TfsRestBuildStatus> resultingBuildStatuses = new List <TfsRestBuildStatus>(); foreach (var buildDefinitionGroup in buildDefinitionsByProjectCollection) { var projectCollection = buildDefinitionGroup.Key; var buildQueryParams = GetBuildQueryParams(buildDefinitionGroup.ToArray()); var projects = await _tfsJsonService.GetBuildsStatuses(connection, buildQueryParams, projectCollection); await _commentsCache.FetchNewComments(projects, connection, tfsJsonBuilds => GetComment(tfsJsonBuilds, connection, projectCollection)); var buildStatuses = projects.Select(i => new TfsRestBuildStatus(i, _commentsCache)); resultingBuildStatuses.AddRange(buildStatuses); } return(resultingBuildStatuses); }
public async Task<List<TfsRestProjectCollection>> GetBuildDefinitionsGrouped(string url, string username, string password) { TfsConnectionDetails connection = new TfsConnectionDetails(url, username, password); var projectCollections = await _tfsJsonService.GetProjectCollections(connection); var resultProjectCollections = new List<TfsRestProjectCollection>(); foreach (var projectCollection in projectCollections) { var resultProjectCollection = new TfsRestProjectCollection(projectCollection); var projects = await _tfsJsonService.GetProjects(connection, projectCollection.Name); foreach (var project in projects) { var resultProject = new TfsRestProject(project); resultProjectCollection.Projects.Add(resultProject); var buildDefinitions = await GetBuildDefinitions(connection, projectCollection, project); resultProject.BuildDefinitions = buildDefinitions; } resultProjectCollections.Add(resultProjectCollection); } return resultProjectCollections; }
public async Task <List <TfsJsonProjectCollection> > GetProjectCollections(TfsConnectionDetails connection) { return(await GetFromTfs <TfsJsonProjectCollection>(connection, "_apis/projectcollections", new Dictionary <string, string>())); }
public async Task <List <TfsJsonComment> > GetComments(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection) { var comments = await GetFromTfs <TfsJsonComment>(connection, $"{projectCollection}/_apis/build/builds/{tfsJsonBuild.Id}/changes", new Dictionary <string, string>()); return(comments); }
public async Task <List <TfsJsonBuildDefinition> > GetBuildDefinitions(TfsConnectionDetails connection, string projectCollection, string project) { return(await GetFromTfs <TfsJsonBuildDefinition>(connection, $"{projectCollection}/{project}/_apis/build/definitions", new Dictionary <string, string>())); }
public async Task <List <TfsJsonBuild> > GetBuildsStatuses(TfsConnectionDetails connection, Dictionary <string, string> queryParams, string projectCollection) { return(await GetFromTfs <TfsJsonBuild>(connection, $"{projectCollection}/_apis/build/builds", queryParams)); }
private async Task <List <TfsRestBuildDefinition> > GetBuildDefinitions(TfsConnectionDetails connection, TfsJsonProjectCollection projectCollection, TfsJsonProject project) { var tfsJsonBuildDefinitions = await _tfsJsonService.GetBuildDefinitions(connection, projectCollection.Name, project.Name); return(tfsJsonBuildDefinitions.Select(i => new TfsRestBuildDefinition(i, project, projectCollection)).ToList()); }
private async Task<List<TfsRestBuildDefinition>> GetBuildDefinitions(TfsConnectionDetails connection, TfsJsonProjectCollection projectCollection, TfsJsonProject project) { var tfsJsonBuildDefinitions = await _tfsJsonService.GetBuildDefinitions(connection, projectCollection.Name, project.Name); return tfsJsonBuildDefinitions.Select(i => new TfsRestBuildDefinition(i, project, projectCollection)).ToList(); }
private async Task<string> GetCommentOnce(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection) { var comments = await _tfsJsonService.GetComments(tfsJsonBuild, connection, projectCollection); var firstComment = comments.FirstOrDefault(); var message = firstComment?.Message; return message; }