diff --git a/eng/pipelines/templates/steps/analyze.yml b/eng/pipelines/templates/steps/analyze.yml index 1df98e02393a..522113abeb87 100644 --- a/eng/pipelines/templates/steps/analyze.yml +++ b/eng/pipelines/templates/steps/analyze.yml @@ -140,7 +140,7 @@ steps: TestMarkArgument: ${{ parameters.TestMarkArgument }} AdditionalTestArgs: ${{parameters.AdditionalTestArgs}} - - template: /eng/pipelines/templates/steps/create-apireview.yml + - template: /eng/common/pipelines/templates/steps/create-apireview.yml parameters: Artifacts: ${{ parameters.Artifacts }} GenerateApiReviewForManualOnly: ${{ parameters.GenerateApiReviewForManualOnly }} diff --git a/eng/pipelines/templates/steps/create-apireview.yml b/eng/pipelines/templates/steps/create-apireview.yml deleted file mode 100644 index c8715cd50d56..000000000000 --- a/eng/pipelines/templates/steps/create-apireview.yml +++ /dev/null @@ -1,43 +0,0 @@ -parameters: - ArtifactPath: $(Build.ArtifactStagingDirectory) - Artifacts: [] - ConfigFileDir: $(Build.ArtifactStagingDirectory)/PackageInfo - Language: 'Python' - APIViewUri: 'https://apiview.dev/AutoReview/CreateApiReview' - GenerateApiReviewForManualOnly: false - ArtifactName: 'packages_extended' - -steps: - # ideally this should be done as initial step of a job in caller template - # We can remove this step later once it is added in caller - - template: /eng/common/pipelines/templates/steps/set-default-branch.yml - - # Automatic API review is generated for a package when pipeline runs irrespective of how pipeline gets triggered. - # Below condition ensures that API review is generated only for manual pipeline runs when flag GenerateApiReviewForManualOnly is set to true. - - ${{ if or(ne(parameters.GenerateApiReviewForManualOnly, true), eq(variables['Build.Reason'], 'Manual')) }}: - - task: Powershell@2 - inputs: - filePath: $(Build.SourcesDirectory)/eng/scripts/Create-ApiReview.ps1 - arguments: > - -ArtifactList ('${{ convertToJson(parameters.Artifacts) }}' | ConvertFrom-Json | Select-Object Name) - -ArtifactPath ${{ parameters.ArtifactPath }} - -APIViewUri ${{ parameters.APIViewUri }} - -APIKey $(azuresdk-apiview-apikey) - -SourceBranch $(Build.SourceBranchName) - -DefaultBranch $(DefaultBranch) - -ConfigFileDir '${{ parameters.ConfigFileDir }}' - -BuildId $(Build.BuildId) - -RepoName $(Build.Repository.Name) - -Language ${{ parameters.Language }} - -ArtifactName ${{ parameters.ArtifactName }} - pwsh: true - workingDirectory: $(Pipeline.Workspace) - displayName: Create Automatic API Review - condition: >- - and( - succeededOrFailed(), - ne(variables['Skip.CreateApiReview'], 'true'), - ne(variables['Build.Reason'],'PullRequest'), - eq(variables['System.TeamProject'], 'internal'), - not(endsWith(variables['Build.Repository.Name'], '-pr')) - ) diff --git a/eng/scripts/Create-ApiReview.ps1 b/eng/scripts/Create-ApiReview.ps1 deleted file mode 100644 index bd1f2a102ba1..000000000000 --- a/eng/scripts/Create-ApiReview.ps1 +++ /dev/null @@ -1,196 +0,0 @@ -[CmdletBinding()] -Param ( - [Parameter(Mandatory=$True)] - [array] $ArtifactList, - [Parameter(Mandatory=$True)] - [string] $ArtifactPath, - [Parameter(Mandatory=$True)] - [string] $APIViewUri, - [Parameter(Mandatory=$True)] - [string] $APIKey, - [Parameter(Mandatory=$True)] - [string] $SourceBranch, - [Parameter(Mandatory=$True)] - [string] $DefaultBranch, - [Parameter(Mandatory=$True)] - [string] $ConfigFileDir, - [Parameter(Mandatory=$True)] - [string] $buildId, - [Parameter(Mandatory=$True)] - [string] $repoName, - [Parameter(Mandatory=$True)] - [string] $Language, - [Parameter(Mandatory=$False)] - [string] $ArtifactName = "packages" -) - -Set-StrictMode -Version 3 -. (Join-Path $PSScriptRoot ".." common scripts common.ps1) - -# Submit API review request and return status whether current revision is approved or pending or failed to create review -function Submit-APIReview($packageArtifactname, $apiLabel, $releaseStatus, $reviewFileName, $packageVersion) -{ - $params = "buildId=$buildId&artifactName=$ArtifactName&originalFilePath=$packageArtifactname&reviewFilePath=$reviewFileName" - $params += "&label=$apiLabel&repoName=$repoName&packageName=$PackageName&project=internal&packageVersion=$packageVersion" - $uri = "$($APIViewUri)?$params" - - Write-Host $uri - if ($releaseStatus -and ($releaseStatus -ne "Unreleased")) - { - $uri += "&compareAllRevisions=true" - } - - $headers = @{ - "ApiKey" = $APIKey; - } - - try - { - $Response = Invoke-WebRequest -Method 'GET' -Uri $uri -Headers $headers - Write-Host "API Review URL: $($Response.Content)" - $StatusCode = $Response.StatusCode - } - catch - { - Write-Host "Exception details: $($_.Exception)" - $StatusCode = $_.Exception.Response.StatusCode - } - - return $StatusCode -} - -function ProcessPackage($PackageName) -{ - Write-Host "Artifact path: $($ArtifactPath)" - Write-Host "Package Name: $($PackageName)" - Write-Host "Source branch: $($SourceBranch)" - Write-Host "Config File directory: $($ConfigFileDir)" - - $reviewFileName = "$($PackageName)_$($Language).json" - - $packages = @{} - if ($FindArtifactForApiReviewFn -and (Test-Path "Function:$FindArtifactForApiReviewFn")) - { - $packages = &$FindArtifactForApiReviewFn $ArtifactPath $PackageName - } - else - { - Write-Host "The function for 'FindArtifactForApiReviewFn' was not found.` - Make sure it is present in eng/scripts/Language-Settings.ps1 and referenced in eng/common/scripts/common.ps1.` - See https://github.com/Azure/azure-sdk-tools/blob/main/doc/common/common_engsys.md#code-structure" - return 1 - } - - if ($packages) - { - foreach($pkgPath in $packages.Values) - { - $pkg = Split-Path -Leaf $pkgPath - $pkgPropPath = Join-Path -Path $ConfigFileDir "$PackageName.json" - if (-Not (Test-Path $pkgPropPath)) - { - Write-Host " Package property file path $($pkgPropPath) is invalid." - continue - } - # Get package info from json file created before updating version to daily dev - $pkgInfo = Get-Content $pkgPropPath | ConvertFrom-Json - $version = [AzureEngSemanticVersion]::ParseVersionString($pkgInfo.Version) - if ($version -eq $null) - { - Write-Host "Version info is not available for package $PackageName, because version '$(pkgInfo.Version)' is invalid. Please check if the version follows Azure SDK package versioning guidelines." - return 1 - } - - $revisionLabel = "Source Branch:${SourceBranch}" - Write-Host "Version: $($version)" - Write-Host "SDK Type: $($pkgInfo.SdkType)" - Write-Host "Release Status: $($pkgInfo.ReleaseStatus)" - Write-Host "Label: $($revisionLabel)" - - # Run create review step only if build is triggered from main branch or if version is GA. - # This is to avoid invalidating review status by a build triggered from feature branch - if ( ($SourceBranch -eq $DefaultBranch) -or (-not $version.IsPrerelease)) - { - Write-Host "Submitting API Review for package $($pkg)" - $respCode = Submit-APIReview -reviewFileName $reviewFileName -packageArtifactname $pkg -apiLabel $revisionLabel -releaseStatus $pkgInfo.ReleaseStatus -packageVersion $pkgInfo.Version - Write-Host "HTTP Response code: $($respCode)" - # HTTP status 200 means API is in approved status - if ($respCode -eq '200') - { - Write-Host "API review is in approved status." - } - elseif ($version.IsPrerelease) - { - # Check if package name is approved. Preview version cannot be released without package name approval - if ($respCode -eq '202' -and $pkgInfo.ReleaseStatus -and $pkgInfo.ReleaseStatus -ne "Unreleased") - { - Write-Error "Package '$PackageName' is not yet approved on APIView for preview release. Package approval for beta relase must be completed by an API approver if it was never released as a stable version." - Write-Error "You can check http://aka.ms/azsdk/engsys/apireview/faq for more details on package name approval." - exit 1 - } - # Ignore API review status for prerelease version - Write-Host "Package version is not GA. Ignoring API view approval status" - } - elseif (!$pkgInfo.ReleaseStatus -or $pkgInfo.ReleaseStatus -eq "Unreleased") - { - Write-Host "Release date is not set for current version in change log file for package. Ignoring API review approval status since package is not yet ready for release." - } - else - { - # Return error code if status code is 201 for new data plane package - # Temporarily enable API review for spring SDK types. Ideally this should be done be using 'IsReviewRequired' method in language side - # to override default check of SDK type client - if (($pkgInfo.SdkType -eq "client" -or $pkgInfo.SdkType -eq "spring") -and $pkgInfo.IsNewSdk) - { - if ($respCode -eq '201') - { - Write-Host "Package version $($version) is GA and automatic API Review is not yet approved for package $($PackageName)." - Write-Host "Build and release is not allowed for GA package without API review approval." - Write-Host "You will need to queue another build to proceed further after API review is approved" - Write-Host "You can check http://aka.ms/azsdk/engsys/apireview/faq for more details on API Approval." - } - else - { - Write-Host "Failed to create API Review for package $($PackageName). Please reach out to Azure SDK engineering systems on teams channel and share this build details." - } - return 1 - } - else { - Write-Host "API review is not approved for package $($PackageName), however it is not required for this package type so it can still be released without API review approval." - } - } - } - else { - Write-Host "Build is triggered from $($SourceBranch) with prerelease version. Skipping API review status check." - } - } - } - else { - Write-Host "No package is found in artifact path to submit review request" - } - return 0 -} - -$responses = @{} -# Check if package config file is present. This file has package version, SDK type etc info. -if (-not $ConfigFileDir) -{ - $ConfigFileDir = Join-Path -Path $ArtifactPath "PackageInfo" -} -foreach ($artifact in $ArtifactList) -{ - Write-Host "Processing $($artifact.name)" - $result = ProcessPackage -PackageName $artifact.name - $responses[$artifact.name] = $result -} - -$exitCode = 0 -foreach($pkg in $responses.keys) -{ - if ($responses[$pkg] -eq 1) - { - Write-Host "API changes are not approved for $($pkg)" - $exitCode = 1 - } -} -exit $exitCode \ No newline at end of file