diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index f17c610e28..a2eede8f23 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -44,7 +44,7 @@ stages: - job: TagRepository displayName: "Create release tag" - condition: ne(variables['Skip.TagRepository'], 'true') + condition: and(ne(variables['Skip.TagRepository'], 'true'), ne(variables['PublishToVcpkgPartnerFeed'], 'true')) dependsOn: - ReleaseGate @@ -97,7 +97,7 @@ stages: - ${{if ne(artifact.skipPublishDocGithubIo, 'true')}}: - job: PublishDocs displayName: Publish Docs to GitHub pages - condition: and(succeeded(), ne(variables['Skip.PublishDocs'], 'true'), ne(variables['Build.Repository.Name'], 'Azure/azure-sdk-for-cpp-pr')) + condition: and(succeeded(), ne(variables['Skip.PublishDocs'], 'true'), ne(variables['Build.Repository.Name'], 'Azure/azure-sdk-for-cpp-pr'), ne(variables['PublishToVcpkgPartnerFeed'], 'true')) # Release tag must exist for link substitution to work dependsOn: - TagRepository @@ -130,7 +130,7 @@ stages: - job: PublishDocsMs displayName: Docs.MS Release - condition: and(succeeded(), ne(variables['Skip.PublishDocs'], 'true'), ne(variables['Build.Repository.Name'], 'Azure/azure-sdk-for-cpp-pr')) + condition: and(succeeded(), ne(variables['Skip.PublishDocs'], 'true'), ne(variables['Build.Repository.Name'], 'Azure/azure-sdk-for-cpp-pr'), ne(variables['PublishToVcpkgPartnerFeed'], 'true')) # C++ learn docs are generated from hosted doxygen docs so this # can only run after the static docs have been published. @@ -165,7 +165,7 @@ stages: - ${{ if ne(artifact.skipPublishVcpkg, 'true') }}: - job: PublishVcpkg displayName: Publish to vcpkg - condition: and(succeeded(), ne(variables['Skip.PublishVcpkg'], 'true')) + condition: and(succeeded(), ne(variables['Skip.PublishVcpkg'], 'true'), ne(variables['PublishToVcpkgPartnerFeed'], 'true')) # This step requires the tag step dependsOn: - TagRepository @@ -312,6 +312,73 @@ stages: condition: and(succeeded(), eq(variables['PublishToVcpkg'], 'true')) displayName: Comment notification to PR + - job: PublishVcpkgPartnerFeed + displayName: Publish to vcpkg-partner-feed + condition: and(succeeded(), eq(variables['PublishToVcpkgPartnerFeed'], 'true')) + dependsOn: + - ReleaseGate + pool: + name: $(WINDOWSPOOL) + image: $(WINDOWSVMIMAGE) + os: windows + + templateContext: + inputs: + - input: pipelineArtifact + artifactName: packages + targetPath: $(Pipeline.Workspace)/packages + + steps: + - checkout: self + + - pwsh: | + $packageSpec = Get-Content -Raw -Path "$(Pipeline.Workspace)/packages/${{artifact.Name}}/package-info.json" | ConvertFrom-Json + $version = $packageSpec.version + Write-Host "##vso[task.setvariable variable=PackageVersion]$version" + displayName: Set PackageVersion variable + + # There are potential race conditions if this script runs + # in parallel against the same branch name. Release only + # one package at a time. + # Clone main vcpkg repo + - template: /eng/pipelines/templates/steps/vcpkg-clone.yml + parameters: + RepoOwner: azure-sdk + + - template: /eng/common/pipelines/templates/steps/login-to-github.yml + parameters: + TokenOwners: + - Azure + + # Clone Vcpkg partner feed + - template: /eng/pipelines/templates/steps/vcpkg-clone.yml + parameters: + RepoOwner: Azure + RepoName: azure-sdk-vcpkg-partner-feed + SetVcpkgRoot: false + AuthToken: $(GH_TOKEN) + + - template: /eng/pipelines/templates/steps/vcpkg-publish.yml + parameters: + ArtifactName: ${{ artifact.Name }} + VcpkgPortName: ${{ artifact.VcpkgPortName }} + UpdateVcpkgBeta: false + PartnerRelease: true + PartnerReleaseRef: $(Build.SourceVersion) + + - template: /eng/common/pipelines/templates/steps/set-default-branch.yml + parameters: + WorkingDirectory: $(Pipeline.Workspace)/azure-sdk-vcpkg-partner-feed + + # Push changes to vcpkg partner feed + - template: /eng/common/pipelines/templates/steps/git-push-changes.yml + parameters: + WorkingDirectory: $(Pipeline.Workspace)/azure-sdk-vcpkg-partner-feed + TargetRepoName: azure-sdk-vcpkg-partner-feed + BaseRepoOwner: Azure + CommitMsg: Update vcpkg-configuration.json + BaseRepoBranch: $(DefaultBranch) + - ${{if ne(artifact.skipUpdatePackageVersion, 'true')}}: - job: UpdatePackageVersion displayName: "Update Package Version" diff --git a/eng/pipelines/templates/steps/vcpkg-clone.yml b/eng/pipelines/templates/steps/vcpkg-clone.yml index eb0f1dc8ab..2c77daf7a8 100644 --- a/eng/pipelines/templates/steps/vcpkg-clone.yml +++ b/eng/pipelines/templates/steps/vcpkg-clone.yml @@ -4,16 +4,31 @@ parameters: RepoName: vcpkg PRBranchName: not-set SetVcpkgRoot: true + AuthToken: '' steps: - - pwsh: | - Write-Host "git clone https://github.com/${{ parameters.RepoOwner }}/${{ parameters.RepoName }} ${{ parameters.Workspace }}/${{ parameters.RepoName }}" - git clone https://github.com/${{ parameters.RepoOwner }}/${{ parameters.RepoName }} ${{ parameters.Workspace }}/${{ parameters.RepoName }} - if ($LASTEXITCODE -ne 0) { - Write-Error "Unable to check out vcpkg fork repo" - exit $LASTEXITCODE - } - displayName: Clone vcpkg (${{ parameters.RepoOwner }}/${{ parameters.RepoName }}) + - ${{ if ne(parameters.AuthToken, '') }}: + - pwsh: | + $tokenLength = "${{ parameters.AuthToken }}".Length + $startsWithGhp = "${{ parameters.AuthToken }}".Substring(0, 4) -eq "ghp_" + + Write-Host "git clone https://github.com/${{ parameters.RepoOwner }}/${{ parameters.RepoName }} ${{ parameters.Workspace }}/${{ parameters.RepoName }}" + Write-Host "Using GitHub token for authentication (Token length: $tokenLength, Starts with 'ghp_': $startsWithGhp)." + + git clone https://azure-sdk:${{ parameters.AuthToken }}@github.com/${{ parameters.RepoOwner }}/${{ parameters.RepoName }} ${{ parameters.Workspace }}/${{ parameters.RepoName }} + if ($LASTEXITCODE -ne 0) { + Write-Error "Unable to check out vcpkg fork repo" + exit $LASTEXITCODE + } + displayName: Clone vcpkg (${{ parameters.RepoOwner }}/${{ parameters.RepoName }}) + - ${{ else }}: + - pwsh: | + git clone https://github.com/${{ parameters.RepoOwner }}/${{ parameters.RepoName }} ${{ parameters.Workspace }}/${{ parameters.RepoName }} + if ($LASTEXITCODE -ne 0) { + Write-Error "Unable to check out vcpkg fork repo" + exit $LASTEXITCODE + } + displayName: Clone vcpkg (${{ parameters.RepoOwner }}/${{ parameters.RepoName }}) - ${{ if eq(parameters.SetVcpkgRoot, true) }}: - pwsh: | diff --git a/eng/pipelines/templates/steps/vcpkg-publish.yml b/eng/pipelines/templates/steps/vcpkg-publish.yml index 4159a8637c..1e23357153 100644 --- a/eng/pipelines/templates/steps/vcpkg-publish.yml +++ b/eng/pipelines/templates/steps/vcpkg-publish.yml @@ -5,8 +5,10 @@ parameters: VcpkgPortName: not-set DisplayNameExtension: DailyReleaseRef: + PartnerReleaseRef: DailyRelease: false UpdateVcpkgBeta: true + PartnerRelease: false steps: - task: Powershell@2 @@ -17,6 +19,7 @@ steps: -PackageSpecPath ${{ parameters.Workspace }}/packages/${{ parameters.ArtifactName }}/package-info.json -SourceDirectory ${{ parameters.Workspace }}/packages/${{ parameters.ArtifactName }}/vcpkg -DailyReleaseRef '${{ parameters.DailyReleaseRef }}' + -PartnerReleaseRef '${{ parameters.PartnerReleaseRef }}' -Verbose pwsh: true displayName: Initialize vcpkg release ${{ parameters.DisplayNameExtension }} @@ -33,6 +36,7 @@ steps: -VcpkgFolder ${{ parameters.Workspace }}/vcpkg -VcpkgPortName '${{ parameters.VcpkgPortName }}' -DailyRelease:$${{ parameters.DailyRelease }} + -PartnerRelease:$${{ parameters.PartnerRelease }} displayName: Check whether to release to vcpkg - task: Powershell@2 @@ -46,6 +50,7 @@ steps: -VcpkgPortName '${{ parameters.VcpkgPortName }}' -GitCommitParameters '-c user.name="azure-sdk" -c user.email="azuresdk@microsoft.com"' -DailyRelease:$${{ parameters.DailyRelease }} + -PartnerRelease:$${{ parameters.PartnerRelease }} workingDirectory: ${{ parameters.Workspace }}/vcpkg condition: and(succeeded(), eq(variables['PublishToVcpkg'], 'true')) displayName: Update vcpkg port ${{ parameters.DisplayNameExtension }} @@ -64,3 +69,17 @@ steps: -VcpkgPortName '${{ parameters.VcpkgPortName }}' -GitCommitParameters '-c user.name="azure-sdk" -c user.email="azuresdk@microsoft.com"' displayName: Update Vcpkg Betas port ${{ parameters.DisplayNameExtension }} + + - ${{ if eq(parameters.PartnerRelease, 'true') }}: + - task: Powershell@2 + inputs: + pwsh: true + targetType: filePath + filePath: eng/scripts/Update-VcpkgBeta.ps1 + arguments: >- + -VcpkgBetaFolder ${{ parameters.Workspace }}/azure-sdk-vcpkg-partner-feed + -VcpkgFolder ${{ parameters.Workspace }}/vcpkg + -ReleaseArtifactSourceDirectory "${{ parameters.Workspace }}/packages/${{ parameters.ArtifactName }}" + -VcpkgPortName '${{ parameters.VcpkgPortName }}' + -GitCommitParameters '-c user.name="azure-sdk" -c user.email="azuresdk@microsoft.com"' + displayName: Update Vcpkg Partner Feed port ${{ parameters.DisplayNameExtension }} diff --git a/eng/scripts/Initialize-VcpkgRelease.ps1 b/eng/scripts/Initialize-VcpkgRelease.ps1 index eda05c796e..abd3698345 100644 --- a/eng/scripts/Initialize-VcpkgRelease.ps1 +++ b/eng/scripts/Initialize-VcpkgRelease.ps1 @@ -16,6 +16,10 @@ Name of the GitHub repo (of the form Azure/azure-sdk-for-cpp) If supplied update the portfile.cmake file's REF and SHA512 with values associated with the given ref. +.PARAMETER PartnerReleaseRef +If supplied update the portfile.cmake file's REF and SHA512 with values +associated with the given ref. + #> [CmdletBinding()] param ( @@ -31,7 +35,9 @@ param ( [ValidateNotNullOrEmpty()] [string] $GitHubRepo, - [string] $DailyReleaseRef + [string] $DailyReleaseRef, + + [string] $PartnerReleaseRef ) # If there's nothing in the "port" folder to upload set SkipVcpkgUpdate to true @@ -50,6 +56,11 @@ if ($DailyReleaseRef) { $tarGzUri = "https://github.com/$GitHubRepo/archive/$DailyReleaseRef.tar.gz" } +if ($PartnerReleaseRef) { + Write-Verbose "Initializing Partner Release" + $tarGzUri = "https://github.com/$GitHubRepo/archive/$PartnerReleaseRef.tar.gz" +} + Write-Host "Downloading tarball to compute hash from $tarGzUri" $localTarGzPath = New-TemporaryFile Invoke-WebRequest -Uri $tarGzUri -OutFile $localTarGzPath @@ -72,5 +83,10 @@ if ($DailyReleaseRef) { $newContent = $newContent -replace '(?m)^(\s+)REF .+$', "`${1}REF $DailyReleaseRef" } +if ($PartnerReleaseRef) { + Write-Verbose "Overriding REF with partner release ref: $PartnerReleaseRef" + $newContent = $newContent -replace '(?m)^(\s+)REF .+$', "`${1}REF $PartnerReleaseRef" +} + $newContent = $newContent.Replace("`r`n", "`n") $newContent | Set-Content $portfileLocation -NoNewLine diff --git a/eng/scripts/Test-ShouldReleaseToVcpkg.ps1 b/eng/scripts/Test-ShouldReleaseToVcpkg.ps1 index a1831e5890..c22e384c6c 100644 --- a/eng/scripts/Test-ShouldReleaseToVcpkg.ps1 +++ b/eng/scripts/Test-ShouldReleaseToVcpkg.ps1 @@ -2,7 +2,8 @@ param( [string] $ReleaseArtifactSourceDirectory, [string] $VcpkgFolder, [string] $VcpkgPortName, - [switch] $DailyRelease + [switch] $DailyRelease, + [switch] $PartnerRelease ) ."$PSScriptRoot/../common/scripts/common.ps1" @@ -15,6 +16,12 @@ if ($DailyRelease) { exit 0 } +if ($PartnerRelease) { + Write-Host "Partner release, publish to vcpkg" + Write-Host "##vso[task.setvariable variable=PublishToVcpkg]true" + exit 0 +} + $packageJsonContents = Get-Content ` -Path "$ReleaseArtifactSourceDirectory/package-info.json" ` -Raw diff --git a/eng/scripts/Update-VcpkgPort.ps1 b/eng/scripts/Update-VcpkgPort.ps1 index 453a97fa4c..4c2c288bfc 100644 --- a/eng/scripts/Update-VcpkgPort.ps1 +++ b/eng/scripts/Update-VcpkgPort.ps1 @@ -13,7 +13,9 @@ param ( [string] $GitCommitParameters, - [switch] $DailyRelease + [switch] $DailyRelease, + + [switch] $PartnerRelease ) ."$PSScriptRoot/../common/scripts/common.ps1" @@ -105,7 +107,7 @@ Write-Host "git reset HEAD^" git reset HEAD^ # Only perform the final commit if this is not a test release -if (!$DailyRelease) { +if (!$DailyRelease -and !$PartnerRelease) { # Grab content needed for commit message and place in a temporary file $packageVersion = (Get-Content $ReleaseArtifactSourceDirectory/package-info.json -Raw | ConvertFrom-Json).version $commitMessageFile = New-TemporaryFile @@ -174,4 +176,8 @@ In the case of a test release set this to ensure that the x-add-version step includes `--overwrite-version` to ensure daily packages are properly updated in the vcpkg repo. +.PARAMETER PartnerRelease +In the case of a partner release set this so that the release gets created +according to the partner release process. + #>