Skip to content

Commit eef8ad6

Browse files
Sync eng/common directory with azure-sdk-tools for PR 7855 (#34857)
* Pipeline template to validate package and update package work item * Changes to restructure validations * Additional fixes as per comments * Remove explicit exit code * Set erroractionpreference for change log check --------- Co-authored-by: Praveen Kuttappan <[email protected]>
1 parent 8ba087e commit eef8ad6

File tree

7 files changed

+447
-34
lines changed

7 files changed

+447
-34
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
parameters:
2+
ArtifactPath: $(Build.ArtifactStagingDirectory)
3+
Artifacts: []
4+
ConfigFileDir: $(Build.ArtifactStagingDirectory)/PackageInfo
5+
6+
steps:
7+
- ${{ if and(ne(variables['Skip.PackageValidation'], 'true'), eq(variables['System.TeamProject'], 'internal')) }}:
8+
- pwsh: |
9+
echo "##vso[task.setvariable variable=SetAsReleaseBuild]false"
10+
displayName: "Set as release build"
11+
condition: and(succeeded(), eq(variables['SetAsReleaseBuild'], ''))
12+
13+
- task: Powershell@2
14+
inputs:
15+
filePath: $(Build.SourcesDirectory)/eng/common/scripts/Validate-All-Packages.ps1
16+
arguments: >
17+
-ArtifactList ('${{ convertToJson(parameters.Artifacts) }}' | ConvertFrom-Json | Select-Object Name)
18+
-ArtifactPath ${{ parameters.ArtifactPath }}
19+
-RepoRoot $(Build.SourcesDirectory)
20+
-APIKey $(azuresdk-apiview-apikey)
21+
-ConfigFileDir '${{ parameters.ConfigFileDir }}'
22+
-BuildDefinition $(System.CollectionUri)$(System.TeamProject)/_build?definitionId=$(System.DefinitionId)
23+
-PipelineUrl $(System.CollectionUri)$(System.TeamProject)/_build/results?buildId=$(Build.BuildId)
24+
-Devops_pat '$(azuresdk-azure-sdk-devops-release-work-item-pat)'
25+
-IsReleaseBuild $$(SetAsReleaseBuild)
26+
pwsh: true
27+
workingDirectory: $(Pipeline.Workspace)
28+
displayName: Validate packages and update work items
29+
continueOnError: true
30+
condition: >-
31+
and(
32+
succeededOrFailed(),
33+
not(endsWith(variables['Build.Repository.Name'], '-pr'))
34+
)

eng/common/scripts/ChangeLog-Operations.ps1

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,27 @@ function Confirm-ChangeLogEntry {
138138
[Parameter(Mandatory = $true)]
139139
[String]$VersionString,
140140
[boolean]$ForRelease = $false,
141-
[Switch]$SantizeEntry
141+
[Switch]$SantizeEntry,
142+
[PSCustomObject]$ChangeLogStatus = $null
142143
)
143144

145+
if (!$ChangeLogStatus) {
146+
$ChangeLogStatus = [PSCustomObject]@{
147+
IsValid = $false
148+
Message = ""
149+
}
150+
}
151+
else {
152+
# Do not stop the script on error when status object is passed as param
153+
$ErrorActionPreference = 'Continue'
154+
}
144155
$changeLogEntries = Get-ChangeLogEntries -ChangeLogLocation $ChangeLogLocation
145156
$changeLogEntry = $changeLogEntries[$VersionString]
146157

147158
if (!$changeLogEntry) {
148-
LogError "ChangeLog[${ChangeLogLocation}] does not have an entry for version ${VersionString}."
159+
$ChangeLogStatus.Message = "ChangeLog[${ChangeLogLocation}] does not have an entry for version ${VersionString}."
160+
$ChangeLogStatus.IsValid = $false
161+
LogError "$($ChangeLogStatus.Message)"
149162
return $false
150163
}
151164

@@ -161,24 +174,28 @@ function Confirm-ChangeLogEntry {
161174
Write-Host "-----"
162175

163176
if ([System.String]::IsNullOrEmpty($changeLogEntry.ReleaseStatus)) {
164-
LogError "Entry does not have a correct release status. Please ensure the status is set to a date '($CHANGELOG_DATE_FORMAT)' or '$CHANGELOG_UNRELEASED_STATUS' if not yet released. See https://aka.ms/azsdk/guideline/changelogs for more info."
177+
$ChangeLogStatus.Message = "Entry does not have a release status. Please ensure the status is set to a date '($CHANGELOG_DATE_FORMAT)' or '$CHANGELOG_UNRELEASED_STATUS' if not yet released. See https://aka.ms/azsdk/guideline/changelogs for more info."
178+
$ChangeLogStatus.IsValid = $false
179+
LogError "$($ChangeLogStatus.Message)"
165180
return $false
166181
}
167182

168183
if ($ForRelease -eq $True)
169184
{
170185
LogDebug "Verifying as a release build because ForRelease parameter is set to true"
171-
return Confirm-ChangeLogForRelease -changeLogEntry $changeLogEntry -changeLogEntries $changeLogEntries
186+
return Confirm-ChangeLogForRelease -changeLogEntry $changeLogEntry -changeLogEntries $changeLogEntries -ChangeLogStatus $ChangeLogStatus
172187
}
173188

174189
# If the release status is a valid date then verify like its about to be released
175190
$status = $changeLogEntry.ReleaseStatus.Trim().Trim("()")
176191
if ($status -as [DateTime])
177192
{
178193
LogDebug "Verifying as a release build because the changelog entry has a valid date."
179-
return Confirm-ChangeLogForRelease -changeLogEntry $changeLogEntry -changeLogEntries $changeLogEntries
194+
return Confirm-ChangeLogForRelease -changeLogEntry $changeLogEntry -changeLogEntries $changeLogEntries -ChangeLogStatus $ChangeLogStatus
180195
}
181196

197+
$ChangeLogStatus.Message = "ChangeLog[${ChangeLogLocation}] has an entry for version ${VersionString}."
198+
$ChangeLogStatus.IsValid = $true
182199
return $true
183200
}
184201

@@ -338,41 +355,53 @@ function Confirm-ChangeLogForRelease {
338355
[Parameter(Mandatory = $true)]
339356
$changeLogEntry,
340357
[Parameter(Mandatory = $true)]
341-
$changeLogEntries
358+
$changeLogEntries,
359+
$ChangeLogStatus = $null
342360
)
343361

362+
if (!$ChangeLogStatus) {
363+
$ChangeLogStatus = [PSCustomObject]@{
364+
IsValid = $false
365+
Message = ""
366+
}
367+
}
344368
$entries = Sort-ChangeLogEntries -changeLogEntries $changeLogEntries
345369

346-
$isValid = $true
370+
$ChangeLogStatus.IsValid = $true
347371
if ($changeLogEntry.ReleaseStatus -eq $CHANGELOG_UNRELEASED_STATUS) {
348-
LogError "Entry has no release date set. Please ensure to set a release date with format '$CHANGELOG_DATE_FORMAT'. See https://aka.ms/azsdk/guideline/changelogs for more info."
349-
$isValid = $false
372+
$ChangeLogStatus.Message = "Entry has no release date set. Please ensure to set a release date with format '$CHANGELOG_DATE_FORMAT'. See https://aka.ms/azsdk/guideline/changelogs for more info."
373+
$ChangeLogStatus.IsValid = $false
374+
LogError "$($ChangeLogStatus.Message)"
350375
}
351376
else {
352377
$status = $changeLogEntry.ReleaseStatus.Trim().Trim("()")
353378
try {
354379
$releaseDate = [DateTime]$status
355380
if ($status -ne ($releaseDate.ToString($CHANGELOG_DATE_FORMAT)))
356381
{
357-
LogError "Date must be in the format $($CHANGELOG_DATE_FORMAT). See https://aka.ms/azsdk/guideline/changelogs for more info."
358-
$isValid = $false
382+
$ChangeLogStatus.Message = "Date must be in the format $($CHANGELOG_DATE_FORMAT). See https://aka.ms/azsdk/guideline/changelogs for more info."
383+
$ChangeLogStatus.IsValid = $false
384+
LogError "$($ChangeLogStatus.Message)"
359385
}
360386

361387
if (@($entries.ReleaseStatus)[0] -ne $changeLogEntry.ReleaseStatus)
362388
{
363-
LogError "Invalid date [ $status ]. The date for the changelog being released must be the latest in the file."
364-
$isValid = $false
389+
$ChangeLogStatus.Message = "Invalid date [ $status ]. The date for the changelog being released must be the latest in the file."
390+
$ChangeLogStatus.IsValid = $false
391+
LogError "$($ChangeLogStatus.Message)"
365392
}
366393
}
367394
catch {
368-
LogError "Invalid date [ $status ] passed as status for Version [$($changeLogEntry.ReleaseVersion)]. See https://aka.ms/azsdk/guideline/changelogs for more info."
369-
$isValid = $false
395+
$ChangeLogStatus.Message = "Invalid date [ $status ] passed as status for Version [$($changeLogEntry.ReleaseVersion)]. See https://aka.ms/azsdk/guideline/changelogs for more info."
396+
$ChangeLogStatus.IsValid = $false
397+
LogError "$($ChangeLogStatus.Message)"
370398
}
371399
}
372400

373401
if ([System.String]::IsNullOrWhiteSpace($changeLogEntry.ReleaseContent)) {
374-
LogError "Entry has no content. Please ensure to provide some content of what changed in this version. See https://aka.ms/azsdk/guideline/changelogs for more info."
375-
$isValid = $false
402+
$ChangeLogStatus.Message = "Entry has no content. Please ensure to provide some content of what changed in this version. See https://aka.ms/azsdk/guideline/changelogs for more info."
403+
$ChangeLogStatus.IsValid = $false
404+
LogError "$($ChangeLogStatus.Message)"
376405
}
377406

378407
$foundRecommendedSection = $false
@@ -391,12 +420,14 @@ function Confirm-ChangeLogForRelease {
391420
}
392421
if ($emptySections.Count -gt 0)
393422
{
394-
LogError "The changelog entry has the following sections with no content ($($emptySections -join ', ')). Please ensure to either remove the empty sections or add content to the section."
395-
$isValid = $false
423+
$ChangeLogStatus.Message = "The changelog entry has the following sections with no content ($($emptySections -join ', ')). Please ensure to either remove the empty sections or add content to the section."
424+
$ChangeLogStatus.IsValid = $false
425+
LogError "$($ChangeLogStatus.Message)"
396426
}
397427
if (!$foundRecommendedSection)
398428
{
399-
LogWarning "The changelog entry did not contain any of the recommended sections ($($RecommendedSectionHeaders -join ', ')), please add at least one. See https://aka.ms/azsdk/guideline/changelogs for more info."
429+
$ChangeLogStatus.Message = "The changelog entry did not contain any of the recommended sections ($($RecommendedSectionHeaders -join ', ')), please add at least one. See https://aka.ms/azsdk/guideline/changelogs for more info."
430+
LogWarning "$($ChangeLogStatus.Message)"
400431
}
401-
return $isValid
432+
return $ChangeLogStatus.IsValid
402433
}

eng/common/scripts/Helpers/ApiView-Helpers.ps1

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
function MapLanguageName($language)
1+
function MapLanguageToRequestParam($language)
22
{
33
$lang = $language
44
# Update language name to match those in API cosmos DB. Cosmos SQL is case sensitive and handling this within the query makes it slow.
55
if($lang -eq 'javascript'){
66
$lang = "JavaScript"
77
}
88
elseif ($lang -eq "dotnet"){
9-
$lang = "C#"
9+
$lang = "C%23"
1010
}
1111
elseif ($lang -eq "java"){
1212
$lang = "Java"
@@ -23,17 +23,12 @@ function MapLanguageName($language)
2323
function Check-ApiReviewStatus($packageName, $packageVersion, $language, $url, $apiKey, $apiApprovalStatus = $null, $packageNameStatus = $null)
2424
{
2525
# Get API view URL and API Key to check status
26-
Write-Host "Checking API review status"
27-
$lang = MapLanguageName -language $language
26+
Write-Host "Checking API review status for package: ${packageName}"
27+
$lang = MapLanguageToRequestParam -language $language
2828
if ($lang -eq $null) {
2929
return
3030
}
3131
$headers = @{ "ApiKey" = $apiKey }
32-
$body = @{
33-
language = $lang
34-
packageName = $packageName
35-
packageVersion = $packageVersion
36-
}
3732

3833
if (!$apiApprovalStatus) {
3934
$apiApprovalStatus = [PSCustomObject]@{
@@ -51,7 +46,10 @@ function Check-ApiReviewStatus($packageName, $packageVersion, $language, $url, $
5146

5247
try
5348
{
54-
$response = Invoke-WebRequest $url -Method 'GET' -Headers $headers -Body $body
49+
$requestUrl = "${url}?language=${lang}&packageName=${packageName}&packageVersion=${packageVersion}"
50+
Write-Host "Request to APIView: [${requestUrl}]"
51+
$response = Invoke-WebRequest $requestUrl -Method 'GET' -Headers $headers
52+
Write-Host "Response: $($response.StatusCode)"
5553
Process-ReviewStatusCode -statusCode $response.StatusCode -packageName $packageName -apiApprovalStatus $apiApprovalStatus -packageNameStatus $packageNameStatus
5654
if ($apiApprovalStatus.IsApproved) {
5755
Write-Host $($apiApprovalStatus.Details)

eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,4 +985,46 @@ function UpdatePackageVersions($pkgWorkItem, $plannedVersions, $shippedVersions)
985985
-Uri "https://dev.azure.com/azure-sdk/_apis/wit/workitems/${id}?api-version=6.0" `
986986
-Headers (Get-DevOpsRestHeaders) -Body $body -ContentType "application/json-patch+json" | ConvertTo-Json -Depth 10 | ConvertFrom-Json -AsHashTable
987987
return $response
988+
}
989+
990+
function UpdateValidationStatus($pkgvalidationDetails, $BuildDefinition, $PipelineUrl)
991+
{
992+
$pkgName = $pkgValidationDetails.Name
993+
$versionString = $pkgValidationDetails.Version
994+
995+
$parsedNewVersion = [AzureEngSemanticVersion]::new($versionString)
996+
$versionMajorMinor = "" + $parsedNewVersion.Major + "." + $parsedNewVersion.Minor
997+
$workItem = FindPackageWorkItem -lang $LanguageDisplayName -packageName $pkgName -version $versionMajorMinor -includeClosed $true -outputCommand $false
998+
999+
if (!$workItem)
1000+
{
1001+
Write-Host"No work item found for package [$pkgName]."
1002+
return $false
1003+
}
1004+
1005+
$changeLogStatus = $pkgValidationDetails.ChangeLogValidation.Status
1006+
$changeLogDetails = $pkgValidationDetails.ChangeLogValidation.Message
1007+
$apiReviewStatus = $pkgValidationDetails.APIReviewValidation.Status
1008+
$apiReviewDetails = $pkgValidationDetails.APIReviewValidation.Message
1009+
$packageNameStatus = $pkgValidationDetails.PackageNameValidation.Status
1010+
$packageNameDetails = $pkgValidationDetails.PackageNameValidation.Message
1011+
1012+
$fields = @()
1013+
$fields += "`"PackageVersion=${versionString}`""
1014+
$fields += "`"ChangeLogStatus=${changeLogStatus}`""
1015+
$fields += "`"ChangeLogValidationDetails=${changeLogDetails}`""
1016+
$fields += "`"APIReviewStatus=${apiReviewStatus}`""
1017+
$fields += "`"APIReviewStatusDetails=${apiReviewDetails}`""
1018+
$fields += "`"PackageNameApprovalStatus=${packageNameStatus}`""
1019+
$fields += "`"PackageNameApprovalDetails=${packageNameDetails}`""
1020+
if ($BuildDefinition) {
1021+
$fields += "`"PipelineDefinition=$BuildDefinition`""
1022+
}
1023+
if ($PipelineUrl) {
1024+
$fields += "`"LatestPipelineRun=$PipelineUrl`""
1025+
}
1026+
1027+
$workItem = UpdateWorkItem -id $workItem.id -fields $fields
1028+
Write-Host "[$($workItem.id)]$LanguageDisplayName - $pkgName($versionMajorMinor) - Updated"
1029+
return $true
9881030
}

eng/common/scripts/Update-DevOps-Release-WorkItem.ps1

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ param(
1515
[string]$packageNewLibrary = "true",
1616
[string]$relatedWorkItemId = $null,
1717
[string]$tag = $null,
18-
[string]$devops_pat = $env:DEVOPS_PAT
18+
[string]$devops_pat = $env:DEVOPS_PAT,
19+
[bool]$inRelease = $true
1920
)
2021
#Requires -Version 6.0
2122
Set-StrictMode -Version 3
@@ -97,8 +98,11 @@ Write-Host " PackageDisplayName: $($workItem.fields['Custom.PackageDisplayName'
9798
Write-Host " ServiceName: $($workItem.fields['Custom.ServiceName'])"
9899
Write-Host " PackageType: $($workItem.fields['Custom.PackageType'])"
99100
Write-Host ""
100-
Write-Host "Marking item [$($workItem.id)]$($workItem.fields['System.Title']) as '$state' for '$releaseType'"
101-
$updatedWI = UpdatePackageWorkItemReleaseState -id $workItem.id -state "In Release" -releaseType $releaseType -outputCommand $false
101+
if ($inRelease)
102+
{
103+
Write-Host "Marking item [$($workItem.id)]$($workItem.fields['System.Title']) as '$state' for '$releaseType'"
104+
$updatedWI = UpdatePackageWorkItemReleaseState -id $workItem.id -state "In Release" -releaseType $releaseType -outputCommand $false
105+
}
102106
$updatedWI = UpdatePackageVersions $workItem -plannedVersions $plannedVersions
103107

104108
Write-Host "Release tracking item is at https://dev.azure.com/azure-sdk/Release/_workitems/edit/$($updatedWI.id)/"
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
[CmdletBinding()]
2+
Param (
3+
[Parameter(Mandatory=$True)]
4+
[array]$ArtifactList,
5+
[Parameter(Mandatory=$True)]
6+
[string]$ArtifactPath,
7+
[Parameter(Mandatory=$True)]
8+
[string]$RepoRoot,
9+
[Parameter(Mandatory=$True)]
10+
[string]$APIKey,
11+
[string]$ConfigFileDir,
12+
[string]$BuildDefinition,
13+
[string]$PipelineUrl,
14+
[string]$APIViewUri = "https://apiview.dev/AutoReview/GetReviewStatus",
15+
[string]$Devops_pat = $env:DEVOPS_PAT,
16+
[bool] $IsReleaseBuild = $false
17+
)
18+
19+
Set-StrictMode -Version 3
20+
. (Join-Path $PSScriptRoot common.ps1)
21+
22+
function ProcessPackage($PackageName, $ConfigFileDir)
23+
{
24+
Write-Host "Artifact path: $($ArtifactPath)"
25+
Write-Host "Package Name: $($PackageName)"
26+
Write-Host "Config File directory: $($ConfigFileDir)"
27+
28+
&$EngCommonScriptsDir/Validate-Package.ps1 `
29+
-PackageName $PackageName `
30+
-ArtifactPath $ArtifactPath `
31+
-RepoRoot $RepoRoot `
32+
-APIViewUri $APIViewUri `
33+
-APIKey $APIKey `
34+
-BuildDefinition $BuildDefinition `
35+
-PipelineUrl $PipelineUrl `
36+
-ConfigFileDir $ConfigFileDir `
37+
-Devops_pat $Devops_pat
38+
if ($LASTEXITCODE -ne 0) {
39+
Write-Error "Failed to validate package $PackageName"
40+
exit 1
41+
}
42+
}
43+
44+
# Check if package config file is present. This file has package version, SDK type etc info.
45+
if (-not $ConfigFileDir) {
46+
$ConfigFileDir = Join-Path -Path $ArtifactPath "PackageInfo"
47+
}
48+
foreach ($artifact in $ArtifactList)
49+
{
50+
Write-Host "Processing $($artifact.name)"
51+
ProcessPackage -PackageName $artifact.name -ConfigFileDir $ConfigFileDir
52+
}

0 commit comments

Comments
 (0)