From 09ce9c77a8022ccdf624582eab3075bc00ebf2b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Latorre=20Millas?= Date: Mon, 12 Jun 2023 13:33:41 +0200 Subject: [PATCH] adding IsLatestReleaseUsingBuildDefinitionArtifact to check the release definition for the build's latest releaseand if its latest release contains any artifact regarding the build itself. This is in case the Build Definition has changed (ej. reused to target a monorepo) so even the repo is deprecated, the release is not and should not be deleted. This is returned in a property inside the pipeline, in the ToPipeline, it will now contain the Properties collection containing the Property "IsReleaseUsingBuildArtifacts" as "True" or "False" (string). --- .../AzureDevOpsPipelinesClient.cs | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/Tool/src/Boost.AzureDevOps/AzureDevOpsPipelinesClient.cs b/src/Tool/src/Boost.AzureDevOps/AzureDevOpsPipelinesClient.cs index af8e95c..46410a1 100644 --- a/src/Tool/src/Boost.AzureDevOps/AzureDevOpsPipelinesClient.cs +++ b/src/Tool/src/Boost.AzureDevOps/AzureDevOpsPipelinesClient.cs @@ -158,7 +158,8 @@ private Pipeline ToPipeline( private Pipeline ToPipeline( AzureDevOpsConnectedService service, - ReleaseDefinitionShallowReference definition) + ReleaseDefinitionShallowReference definition, + bool isReleaseUsingBuildArtifacts) { return new Pipeline { @@ -169,7 +170,8 @@ private Pipeline ToPipeline( WebUrl = definition.Links.GetLink("web"), Properties = new List { - new("ProjectId", definition.ProjectReference.Id.ToString()) + new("ProjectId", definition.ProjectReference.Id.ToString()), + new("IsReleaseUsingBuildArtifacts", isReleaseUsingBuildArtifacts.ToString()) } }; } @@ -216,16 +218,59 @@ public async Task> GetReleasesAsync( if ( definition is { }) { + bool isReleaseUsingBuildArtifacts = + await IsLatestReleaseUsingBuildDefinitionArtifact(serviceId, teamProjectId, buildDefinitionId, definition.Id); definition.ProjectReference = release.ProjectReference; - return ToPipeline(ClientFactory.Connections[serviceId].Service, definition); + + return ToPipeline( + ClientFactory.Connections[serviceId].Service, + definition, + isReleaseUsingBuildArtifacts); } } return null; + } + + public async Task IsLatestReleaseUsingBuildDefinitionArtifact( + Guid serviceId, + Guid teamProjectId, + int buildDefinitionId, + int ReleaseDefinitionId) + { + ReleaseHttpClient client = ClientFactory.CreateClient(serviceId); + + ReleaseDefinition ReleaseDefinition = + await client.GetReleaseDefinitionAsync( + project: teamProjectId, + definitionId: ReleaseDefinitionId + ); + + if (ReleaseDefinition != null) + { + List latestReleases = + await client.GetReleasesAsync( + project: teamProjectId, + definitionId: ReleaseDefinition.Id, + top: 1); + Release? latestRelease = latestReleases.FirstOrDefault(); + + if (latestRelease != null) + { + // Check if the latest release is using artifacts from the target build definition + Artifact? buildDefinitionArtifact = + latestRelease.Artifacts.FirstOrDefault( + a => a.DefinitionReference.ContainsKey("definition") && + a.DefinitionReference["definition"].Id == buildDefinitionId.ToString()); + + return buildDefinitionArtifact != null; + } + } + return false; } - public async Task> GetRunsAsync( +public async Task> GetRunsAsync( Guid serviceId, Guid projectId, int id,