private void EnsureVersionBelongsToLinkedDefinition(ArtifactDefinition artifactDefinition, BuildHttpClient buildClient, XamlBuildHttpClient xamlBuildClient) { var buildArtifactDetails = artifactDefinition.Details as BuildArtifactDetails; if (buildArtifactDetails != null && buildArtifactDetails.DefintionId > 0) { var buildId = Convert.ToInt32(artifactDefinition.Version, CultureInfo.InvariantCulture); TeamFoundation.Build.WebApi.Build build = null; try { build = buildClient.GetBuildAsync(buildArtifactDetails.Project, buildId).Result; } catch (AggregateException ex) { if (ex.InnerException != null && ex.InnerException is BuildNotFoundException) { build = xamlBuildClient.GetBuildAsync(buildArtifactDetails.Project, buildId).Result; } } if (build != null && build.Definition.Id != buildArtifactDetails.DefintionId) { string errorMessage = StringUtil.Loc("RMBuildNotFromLinkedDefinition", artifactDefinition.Name, buildArtifactDetails.DefinitionName); throw new ArtifactDownloadException(errorMessage); } } }
public static string GetWebLink(this TeamFoundation.Build.WebApi.Build build) => ((ReferenceLink)build.Links.Links["web"]).Href;
public override async Task ExecuteAsync() { StringBuilder notificationMarkdown = new(); string buildUrl = string.Empty; Dictionary <string, TaskResult?> taskResults = Options.TaskNames .ToDictionary(name => name, name => (TaskResult?)null); Dictionary <string, string> buildParameters = new(); BuildResult overallResult = BuildResult.Succeeded; BuildReason buildReason = BuildReason.None; string? correlatedQueueNotificationUrl = null; if (!Options.IsDryRun) { (Uri baseUrl, VssCredentials credentials) = Options.AzdoOptions.GetConnectionDetails(); using (IVssConnection connection = _connectionFactory.Create(baseUrl, credentials)) using (IProjectHttpClient projectHttpClient = connection.GetProjectHttpClient()) using (IBuildHttpClient buildClient = connection.GetBuildHttpClient()) { TeamProject project = await projectHttpClient.GetProjectAsync(Options.AzdoOptions.Project); TeamFoundation.Build.WebApi.Build build = await buildClient.GetBuildAsync(project.Id, Options.BuildId); buildUrl = build.GetWebLink(); buildReason = build.Reason; // Get the build's queue-time parameters if (build.Parameters is not null) { JObject parametersJson = JsonConvert.DeserializeObject <JObject>(build.Parameters); foreach (KeyValuePair <string, JToken?> pair in parametersJson) { buildParameters.Add(pair.Key, pair.Value?.ToString() ?? string.Empty); } } overallResult = await GetBuildTaskResultsAsync(taskResults, buildClient, project); correlatedQueueNotificationUrl = await GetCorrelatedQueueNotificationUrlAsync(); } } notificationMarkdown.AppendLine($"# Publish Results"); notificationMarkdown.AppendLine(); WriteSummaryMarkdown(notificationMarkdown, buildUrl, overallResult, buildReason, correlatedQueueNotificationUrl); notificationMarkdown.AppendLine(); WriteTaskStatusesMarkdown(taskResults, notificationMarkdown); notificationMarkdown.AppendLine(); WriteBuildParameters(buildParameters, notificationMarkdown); notificationMarkdown.AppendLine(); WriteImagesMarkdown(notificationMarkdown); await _notificationService.PostAsync( $"Publish Result - {Options.SourceRepo}/{Options.SourceBranch}", notificationMarkdown.ToString(), new string[] { NotificationLabels.Publish, NotificationLabels.GetRepoLocationLabel(Options.SourceRepo, Options.SourceBranch) }.AppendIf(NotificationLabels.Failure, () => overallResult == BuildResult.Failed), Options.GitOptions.GetRepoUrl().ToString(), Options.GitOptions.AuthToken, Options.IsDryRun); }