diff --git a/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 b/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 index 9a46e2c126f1..cd91bbbfe93e 100644 --- a/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 +++ b/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 @@ -1015,3 +1015,61 @@ function UpdateValidationStatus($pkgvalidationDetails, $BuildDefinition, $Pipeli Write-Host "[$($workItem.id)]$LanguageDisplayName - $pkgName($versionMajorMinor) - Updated" return $true } + + +function Get-LanguageDevOpsName($LanguageShort) +{ + switch ($LanguageShort.ToLower()) + { + "net" { return "Dotnet" } + "js" { return "JavaScript" } + "java" { return "Java" } + "go" { return "Go" } + "python" { return "Python" } + default { return $null } + } +} + +function Get-ReleasePlanForPackage($packageName) +{ + $devopsFieldLanguage = Get-LanguageDevOpsName -LanguageShort $LanguageShort + if (!$devopsFieldLanguage) + { + Write-Host "Unsupported language to check release plans, language [$LanguageShort]" + return $null + } + + $prStatusFieldName = "SDKPullRequestStatusFor$($devopsFieldLanguage)" + $packageNameFieldName = "$($devopsFieldLanguage) Package Name" + $fields = @() + $fields += "System.ID" + $fields += "System.State" + $fields += "System.AssignedTo" + $fields += "System.Parent" + $fields += "System.Tags" + + $fieldList = ($fields | ForEach-Object { "[$_]"}) -join ", " + $query = "SELECT ${fieldList} FROM WorkItems WHERE [Work Item Type] = 'Release Plan' AND [${packageNameFieldName}] = '${packageName}'" + $query += " AND [${prStatusFieldName}] = 'merged'" + $query += " AND [System.State] IN ('In Progress') ORDER BY [System.CreatedDate]" + $workItems = Invoke-Query $fields $query + return $workItems +} + +function Update-ReleaseStatusInReleasePlan($releasePlanWorkItemId, $status, $version) +{ + $devopsFieldLanguage = Get-LanguageDevOpsName -LanguageShort $LanguageShort + if (!$devopsFieldLanguage) + { + Write-Host "Unsupported language to check release plans, language [$LanguageShort]" + return $null + } + + $fields = @() + $fields += "`"ReleaseStatusFor$($devopsFieldLanguage)=$status`"" + $fields += "`"ReleasedVersionFor$($devopsFieldLanguage)=$version`"" + + Write-Host "Updating Release Plan [$releasePlanWorkItemId] with status [$status] for language [$LanguageShort]." + $workItem = UpdateWorkItem -id $releasePlanWorkItemId -fields $fields + Write-Host "Updated release status for [$LanguageShort] in Release Plan [$releasePlanWorkItemId]" +} \ No newline at end of file diff --git a/eng/common/scripts/Mark-ReleasePlanCompletion.ps1 b/eng/common/scripts/Mark-ReleasePlanCompletion.ps1 new file mode 100644 index 000000000000..c8998dbc124f --- /dev/null +++ b/eng/common/scripts/Mark-ReleasePlanCompletion.ps1 @@ -0,0 +1,56 @@ +param( + [Parameter(Mandatory = $true)] + [string]$PackageName, + + [Parameter(Mandatory = $true)] + [string]$PackageVersion, + + [Parameter(Mandatory = $false)] + [int]$MaxCount = 5 +) + +<# +.SYNOPSIS + Marks release plan completion by identifying pull requests that changed files in a given path. + +.DESCRIPTION + This script helps to mark release plan completion by finding the active release plans for a package name + +.PARAMETER PackageName + The package name being released (required) + +.PARAMETER PackageVersion + The package version being released (required) + +.PARAMETER MaxCount + Maximum number of recent pull request merges to check (default: 5) + +#> + +Set-StrictMode -Version 3 +. (Join-Path $PSScriptRoot common.ps1) +. (Join-Path $PSScriptRoot Helpers DevOps-WorkItem-Helpers.ps1) + +$AzureDevOpsOrganization = "azure-sdk" +$AzureDevOpsProject = "Release" +# Check Azure DevOps Release Plan work items if LanguageShort is available +Write-Host "Checking active release plan work items for package: $PackageName" +$workItems = Get-ReleasePlanForPackage $PackageName +if(!$workItems) +{ + Write-Host "No active release plans found for package name: $PackageName." + exit 0 +} + +$activeReleasePlan = $workItems +if($workItems.Count -gt 1 -and ($workItems -is [System.Array])) +{ + $concatenatedIds = ($workItems | Select-Object -ExpandProperty id) -join ',' + Write-Host "Multiple release plans found for package name: $PackageName with work item IDs: $concatenatedIds. Using the first release plan to update release status." + $activeReleasePlan = $workItems[0] +} +# Update release status +Write-Host "Release plan work item ID: $($activeReleasePlan["id"])" +Write-Host "Marking release completion for package, name: $PackageName version: $PackageVersion" +Update-ReleaseStatusInReleasePlan $activeReleasePlan.id "Released" $PackageVersion +Write-Host "Successfully marked release completion for package, name: $PackageName version: $PackageVersion."