...
1<#
2.SYNOPSIS
3Update docs.microsoft.com CI configuration with provided metadata
4
5.DESCRIPTION
6Update docs.microsoft.com CI configuration with metadata in the Azure/azure-sdk
7metadata CSV file and information in the docs.microsoft.com repo's own /metadata
8folder. The docs.microsoft.com repo's /metadata folder allows onboarding of
9packages which have not released to a central package manager.
10
11* Use packages in the Azure/azure-sdk metadata CSV where New == true and
12 Hide != true
13* Add metadata from files in the metadata/ folder to the CSV metadata
14* Onboard new packages, update existing tracked packages, leave other packages
15 in place. (This is implemented on a per-language basis by
16 $UpdateDocsMsPackagesFn)
17
18.PARAMETER DocRepoLocation
19Location of the docs.microsoft.com reference docs repo.
20
21.PARAMETER PackageSourceOverride
22Optional parameter to supply a different package source (useful for daily dev
23docs generation from pacakges which are not published to the default feed). This
24variable is meant to be used in the domain-specific business logic in
25&$UpdateDocsMsPackagesFn
26
27.PARAMETER ImageId
28Optional The docker image for package validation in format of '$containerRegistry/$imageName:$tag'.
29e.g. azuresdkimages.azurecr.io/jsrefautocr:latest
30
31#>
32param (
33 [Parameter(Mandatory = $true)]
34 [string] $DocRepoLocation, # the location of the cloned doc repo
35
36 [Parameter(Mandatory = $false)]
37 [string] $PackageSourceOverride,
38
39 [Parameter(Mandatory = $false)]
40 [string] $ImageId
41)
42
43. (Join-Path $PSScriptRoot common.ps1)
44
45function GetDocsMetadataForMoniker($moniker) {
46 $searchPath = Join-Path $DocRepoLocation 'metadata' $moniker
47 if (!(Test-Path $searchPath)) {
48 return @()
49 }
50 $paths = Get-ChildItem -Path $searchPath -Filter *.json
51
52 $metadata = @()
53 foreach ($path in $paths) {
54 $fileContents = Get-Content $path -Raw
55 $fileObject = ConvertFrom-Json -InputObject $fileContents
56 $versionGa = ''
57 $versionPreview = ''
58 if ($moniker -eq 'latest') {
59 $versionGa = $fileObject.Version
60 } else {
61 $versionPreview = $fileObject.Version
62 }
63
64 $entry = @{
65 Package = $fileObject.Name;
66 VersionGA = $versionGa;
67 VersionPreview = $versionPreview;
68 RepoPath = $fileObject.ServiceDirectory;
69 Type = $fileObject.SdkType;
70 New = $fileObject.IsNewSdk;
71 }
72 if ($fileObject.PSObject.Members.Name -contains "Group")
73 {
74 $entry.Add("GroupId", $fileObject.Group)
75 }
76 $metadata += $entry
77 }
78
79 return $metadata
80}
81function GetDocsMetadata() {
82 # Read metadata from CSV
83 $csvMetadata = (Get-CSVMetadata).Where({ $_.New -eq 'true' -and $_.Hide -ne 'true' })
84
85 # Read metadata from docs repo
86 $metadataByPackage = @{}
87 foreach ($package in GetDocsMetadataForMoniker 'latest') {
88 if ($metadataByPackage.ContainsKey($package.Package)) {
89 LogWarning "Duplicate package in latest metadata: $($package.Package)"
90 }
91 Write-Host "Adding latest package: $($package.Package)"
92 $metadataByPackage[$package.Package] = $package
93 }
94
95 foreach ($package in GetDocsMetadataForMoniker 'preview') {
96 if ($metadataByPackage.ContainsKey($package.Package)) {
97 # Merge VersionPreview of each object
98 Write-Host "Merging preview package version for $($package.Package))"
99 $metadataByPackage[$package.Package].VersionPreview = $package.VersionPreview
100 } else {
101 Write-Host "Adding preview package: $($package.Package)"
102 $metadataByPackage[$package.Package] = $package
103 }
104 }
105
106 # Override CSV metadata version information before returning
107 $outputMetadata = @()
108 foreach ($item in $csvMetadata) {
109 if ($metadataByPackage.ContainsKey($item.Package)) {
110 Write-Host "Overriding CSV metadata from docs repo for $($item.Package)"
111 $matchingPackage = $metadataByPackage[$item.Package]
112
113 # Only update the version from metadata present in the docs repo IF there
114 # is a specified version. The absence of package metadata in the docs repo
115 # (e.g. no GA version) does not imply that the CSV metadata is incorrect.
116 if ($matchingPackage.VersionGA) {
117 $item.VersionGA = $matchingPackage.VersionGA
118 }
119 if ($matchingPackage.VersionPreview) {
120 $item.VersionPreview = $matchingPackage.VersionPreview
121 }
122 }
123 $outputMetadata += $item
124 }
125
126 # Add entries present in the docs repo which are not present in CSV. These are
127 # usually packages which have not yet published a preview or GA version.
128 foreach ($item in $metadataByPackage.Values) {
129 $matchingPackagesInCsvMetadata = $csvMetadata.Where({ $_.Package -eq $item.Package })
130 if (!$matchingPackagesInCsvMetadata) {
131 Write-Host "Adding package from docs metadata that is not found in CSV metadata: $($item.Package)"
132 $outputMetadata += $item
133 }
134 }
135
136 return $outputMetadata
137}
138
139if ($UpdateDocsMsPackagesFn -and (Test-Path "Function:$UpdateDocsMsPackagesFn")) {
140
141 try {
142 $docsMetadata = GetDocsMetadata
143 &$UpdateDocsMsPackagesFn -DocsRepoLocation $DocRepoLocation -DocsMetadata $docsMetadata -PackageSourceOverride $PackageSourceOverride -DocValidationImageId $ImageId
144 } catch {
145 LogError "Exception while updating docs.ms packages"
146 LogError $_
147 LogError $_.ScriptStackTrace
148 exit 1
149 }
150
151} else {
152 LogError "The function for '$UpdateFn' was not found.`
153 Make sure it is present in eng/scripts/Language-Settings.ps1 and referenced in eng/common/scripts/common.ps1.`
154 See https://github.com/Azure/azure-sdk-tools/blob/main/doc/common/common_engsys.md#code-structure"
155 exit 1
156}
157
158# Exit 0 so DevOps doesn't fail the build when the last command called by the
159# domain-specific function exited with a non-zero exit code.
160exit 0
View as plain text