Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions eng/common/pipelines/templates/steps/validate-all-packages.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
parameters:
ArtifactPath: $(Build.ArtifactStagingDirectory)
Artifacts: []
ConfigFileDir: $(Build.ArtifactStagingDirectory)/PackageInfo
- name: ArtifactPath
type: string
default: $(Build.ArtifactStagingDirectory)
- name: Artifacts
type: object
default: []
- name: ConfigFileDir
type: string
default: $(Build.ArtifactStagingDirectory)/PackageInfo
- name: PackageInfoFiles
type: object
default: []

steps:
- ${{ if and(ne(variables['Skip.PackageValidation'], 'true'), and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'internal'))) }}:
- pwsh: |
echo "##vso[task.setvariable variable=SetAsReleaseBuild]false"
displayName: "Set as release build"
condition: and(succeeded(), eq(variables['SetAsReleaseBuild'], ''))
condition: and(succeededOrFailed(), eq(variables['SetAsReleaseBuild'], ''))
- task: AzureCLI@2
inputs:
Expand All @@ -24,7 +33,8 @@ steps:
-ConfigFileDir '${{ parameters.ConfigFileDir }}' `
-BuildDefinition $(System.CollectionUri)$(System.TeamProject)/_build?definitionId=$(System.DefinitionId) `
-PipelineUrl $(System.CollectionUri)$(System.TeamProject)/_build/results?buildId=$(Build.BuildId) `
-IsReleaseBuild $$(SetAsReleaseBuild)
-IsReleaseBuild $$(SetAsReleaseBuild) `
-PackageInfoFiles ('${{ convertToJson(parameters.PackageInfoFiles) }}' | ConvertFrom-Json -NoEnumerate)
workingDirectory: $(Pipeline.Workspace)
displayName: Validate packages and update work items
continueOnError: true
Expand Down
148 changes: 137 additions & 11 deletions eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@

. (Join-Path $PSScriptRoot .. SemVer.ps1)

$ReleaseDevOpsOrgParameters = @("--organization", "https://dev.azure.com/azure-sdk")
$ReleaseDevOpsCommonParameters = $ReleaseDevOpsOrgParameters + @("--output", "json")
$ReleaseDevOpsCommonParametersWithProject = $ReleaseDevOpsCommonParameters + @("--project", "Release")

# This is used to determine whether or not the az login and azure-devops extension
# install have already been completed.
$global:AzLoginAndDevOpsExtensionInstallComplete = $false
$global:HasDevOpsAccess = $false

function Get-DevOpsRestHeaders()
{
# Get a temp access token from the logged in az cli user for azure devops resource
Expand All @@ -17,17 +24,44 @@ function Get-DevOpsRestHeaders()
return $headers
}

# Function was created from the same code being in Update-DevOps-Release-WorkItem.ps1
# and Validate-Package.ps1. The global variable is used to prevent az commands from
# being rerun multiple times
function CheckAzLoginAndDevOpsExtensionInstall()
{
if (-not $global:AzLoginAndDevOpsExtensionInstallComplete) {
az account show *> $null
if (!$?) {
Write-Host 'Running az login...'
az login *> $null
}

az extension show -n azure-devops *> $null
if (!$?){
az extension add --name azure-devops
} else {
# Force update the extension to the latest version if it was already installed
# this is needed to ensure we have the authentication issue fixed from earlier versions
az extension update -n azure-devops *> $null
}
$global:AzLoginAndDevOpsExtensionInstallComplete = $true
}
}

function CheckDevOpsAccess()
{
# Dummy test query to validate permissions
$query = "SELECT [System.ID] FROM WorkItems WHERE [Work Item Type] = 'Package' AND [Package] = 'azure-sdk-template'"
if (-not $global:HasDevOpsAccess) {
# Dummy test query to validate permissions
$query = "SELECT [System.ID] FROM WorkItems WHERE [Work Item Type] = 'Package' AND [Package] = 'azure-sdk-template'"

$response = Invoke-RestMethod -Method POST `
-Uri "https://dev.azure.com/azure-sdk/Release/_apis/wit/wiql/?api-version=6.0" `
-Headers (Get-DevOpsRestHeaders) -Body "{ ""query"": ""$query"" }" -ContentType "application/json" | ConvertTo-Json -Depth 10 | ConvertFrom-Json -AsHashTable
$response = Invoke-RestMethod -Method POST `
-Uri "https://dev.azure.com/azure-sdk/Release/_apis/wit/wiql/?api-version=6.0" `
-Headers (Get-DevOpsRestHeaders) -Body "{ ""query"": ""$query"" }" -ContentType "application/json" | ConvertTo-Json -Depth 10 | ConvertFrom-Json -AsHashTable

if ($response -isnot [HashTable] -or !$response.ContainsKey("workItems")) {
throw "Failed to run test query against Azure DevOps. Please ensure you are logged into the public azure cloud. Consider running 'az logout' and then 'az login'."
if ($response -isnot [HashTable] -or !$response.ContainsKey("workItems")) {
throw "Failed to run test query against Azure DevOps. Please ensure you are logged into the public azure cloud. Consider running 'az logout' and then 'az login'."
}
$global:HasDevOpsAccess = $true
}
}

Expand Down Expand Up @@ -1018,7 +1052,7 @@ function UpdateValidationStatus($pkgvalidationDetails, $BuildDefinition, $Pipeli

function Get-LanguageDevOpsName($LanguageShort)
{
switch ($LanguageShort.ToLower())
switch ($LanguageShort.ToLower())
{
"net" { return "Dotnet" }
"js" { return "JavaScript" }
Expand Down Expand Up @@ -1057,7 +1091,7 @@ function Get-ReleasePlanForPackage($packageName)
}

function Update-ReleaseStatusInReleasePlan($releasePlanWorkItemId, $status, $version)
{
{
$devopsFieldLanguage = Get-LanguageDevOpsName -LanguageShort $LanguageShort
if (!$devopsFieldLanguage)
{
Expand Down Expand Up @@ -1170,7 +1204,7 @@ function Get-TriagesForCPEXAttestation()
$query += " AND [Custom.ProductType] IN ('Feature', 'Offering', 'Sku')"

$workItems = Invoke-Query $fields $query
return $workItems
return $workItems
}

function Update-AttestationStatusInWorkItem($workItemId, $fieldName, $status)
Expand All @@ -1181,4 +1215,96 @@ function Update-AttestationStatusInWorkItem($workItemId, $fieldName, $status)
$workItem = UpdateWorkItem -id $workItemId -fields $fields
Write-Host "Updated attestation status for [$fieldName] in Work Item [$workItemId]"
return $true
}
}

# This function was originally the entirety of what was in Update-DevOps-Release-WorkItem.ps1
# and has been converted to a function.
function Update-DevOpsReleaseWorkItem {
param(
[Parameter(Mandatory=$true)]
[string]$language,
[Parameter(Mandatory=$true)]
[string]$packageName,
[Parameter(Mandatory=$true)]
[string]$version,
[string]$plannedDate,
[string]$serviceName = $null,
[string]$packageDisplayName = $null,
[string]$packageRepoPath = "NA",
[string]$packageType = "client",
[string]$packageNewLibrary = "true",
[string]$relatedWorkItemId = $null,
[string]$tag = $null,
[bool]$inRelease = $true
)

if (!(Get-Command az -ErrorAction SilentlyContinue)) {
Write-Error 'You must have the Azure CLI installed: https://aka.ms/azure-cli'
return $false
}

CheckAzLoginAndDevOpsExtensionInstall

CheckDevOpsAccess

$parsedNewVersion = [AzureEngSemanticVersion]::new($version)
$state = "In Release"
$releaseType = $parsedNewVersion.VersionType
$versionMajorMinor = "" + $parsedNewVersion.Major + "." + $parsedNewVersion.Minor

$packageInfo = [PSCustomObject][ordered]@{
Package = $packageName
DisplayName = $packageDisplayName
ServiceName = $serviceName
RepoPath = $packageRepoPath
Type = $packageType
New = $packageNewLibrary
};

if (!$plannedDate) {
$plannedDate = Get-Date -Format "MM/dd/yyyy"
}

$plannedVersions = @(
[PSCustomObject][ordered]@{
Type = $releaseType
Version = $version
Date = $plannedDate
}
)
$ignoreReleasePlannerTests = $true
if ($tag -and $tag.Contains("Release Planner App Test")) {
$ignoreReleasePlannerTests = $false
}

$workItem = FindOrCreateClonePackageWorkItem $language $packageInfo $versionMajorMinor -allowPrompt $true -outputCommand $false -relatedId $relatedWorkItemId -tag $tag -ignoreReleasePlannerTests $ignoreReleasePlannerTests

if (!$workItem) {
Write-Host "Something failed as we don't have a work-item so exiting."
return $false
}

Write-Host "Updated or created a release work item for a package release with the following properties:"
Write-Host " Language: $($workItem.fields['Custom.Language'])"
Write-Host " Version: $($workItem.fields['Custom.PackageVersionMajorMinor'])"
Write-Host " Package: $($workItem.fields['Custom.Package'])"
if ($workItem.fields['System.AssignedTo']) {
Write-Host " AssignedTo: $($workItem.fields['System.AssignedTo']["uniqueName"])"
}
else {
Write-Host " AssignedTo: unassigned"
}
Write-Host " PackageDisplayName: $($workItem.fields['Custom.PackageDisplayName'])"
Write-Host " ServiceName: $($workItem.fields['Custom.ServiceName'])"
Write-Host " PackageType: $($workItem.fields['Custom.PackageType'])"
Write-Host ""
if ($inRelease)
{
Write-Host "Marking item [$($workItem.id)]$($workItem.fields['System.Title']) as '$state' for '$releaseType'"
$updatedWI = UpdatePackageWorkItemReleaseState -id $workItem.id -state "In Release" -releaseType $releaseType -outputCommand $false
}
$updatedWI = UpdatePackageVersions $workItem -plannedVersions $plannedVersions

Write-Host "Release tracking item is at https://dev.azure.com/azure-sdk/Release/_workitems/edit/$($updatedWI.id)/"
return $true
}
25 changes: 13 additions & 12 deletions eng/common/scripts/Prepare-Release.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ Set-StrictMode -Version 3

. ${PSScriptRoot}\common.ps1
. ${PSScriptRoot}\Helpers\ApiView-Helpers.ps1
. ${PSScriptRoot}\Helpers\DevOps-WorkItem-Helpers.ps1

function Get-ReleaseDay($baseDate)
{
Expand Down Expand Up @@ -141,18 +142,18 @@ if ($null -eq $newVersionParsed)
exit 1
}

&$EngCommonScriptsDir/Update-DevOps-Release-WorkItem.ps1 `
-language $LanguageDisplayName `
-packageName $packageProperties.Name `
-version $newVersion `
-plannedDate $releaseDateString `
-packageRepoPath $packageProperties.serviceDirectory `
-packageType $packageProperties.SDKType `
-packageNewLibrary $packageProperties.IsNewSDK

if ($LASTEXITCODE -ne 0) {
Write-Error "Updating of the Devops Release WorkItem failed."
exit 1
$result = Update-DevOpsReleaseWorkItem -language $LanguageDisplayName `
-packageName $packageProperties.Name `
-version $newVersion `
-plannedDate $releaseDateString `
-packageRepoPath $packageProperties.serviceDirectory `
-packageType $packageProperties.SDKType `
-packageNewLibrary $packageProperties.IsNewSDK

if (-not $result)
{
Write-Error "Update of the Devops Release WorkItem failed."
exit 1
}

# Check API status
Expand Down
Loading