Files

680 lines
20 KiB
YAML

trigger: none
# needed to disable CI trigger and allow manual trigger
# when the branch is same as pipeline source, the latest build from the source is used.
# all environment used are for manual tasks and approvals.
parameters:
- name: skipPackagesMsftComPublish
displayName: Skip actual publishing to Packages.microsoft.com, AFTER we upload it. Used to test the publishing script.
default: false
type: boolean
- name: skipNugetPublish
displayName: Skip nuget publishing. Used in testing publishing stage.
default: false
type: boolean
- name: InternalSDKBlobURL
displayName: URL to the blob having internal .NET SDK
type: string
default: ' '
resources:
pipelines:
- pipeline: releasePipeline
source: 'Coordinated Packages'
trigger:
branches:
- release/*
repositories:
- repository: Internal-PowerShellTeam-Tools
type: git
trigger: none
name: Internal-PowerShellTeam-Tools
ref: main-mirror
- repository: ComplianceRepo
type: github
endpoint: ComplianceGHRepo
name: PowerShell/compliance
ref: master
variables:
- name: runCodesignValidationInjection
value : false
- name: nugetMultiFeedWarnLevel
value: none
- name: NugetSecurityAnalysisWarningLevel
value: none
- name: skipComponentGovernanceDetection
value: true
- name: BUILDSECMON_OPT_IN
value: true
- group: ReleasePipelineSecrets
- group: PipelineExecutionPats
- name: __DOTNET_RUNTIME_FEED
value: ${{ parameters.InternalSDKBlobURL }}
stages:
- stage: MSIXBundle
displayName: Create MSIX Bundle package
dependsOn: []
jobs:
- template: templates/release-MsixBundle.yml
- stage: ValidateSDK
displayName: Validate SDK
dependsOn: []
jobs:
- template: templates/release-SDKTests.yml
parameters:
jobName: WinSDK
displayName: Windows SDK Test
imageName: windows-latest
- template: templates/release-SDKTests.yml
parameters:
jobName: LinuxSDK
displayName: Linux SDK Test
imageName: ubuntu-latest
- template: templates/release-SDKTests.yml
parameters:
jobName: macOSSDK
displayName: macOS SDK Test
imageName: macOS-latest
- stage: PRCreation
displayName: Create PR in GH Master
dependsOn: []
jobs:
- deployment: CreatePRInMaster
displayName: Update README.md and metadata.json
pool: server
environment: PSReleaseCreatePR
- stage: ValidateGlobalTool
displayName: Validate Global Tool
dependsOn: []
jobs:
- template: templates/release-GlobalToolTest.yml
parameters:
jobName: WinGblTool
displayName: Global Tool Test Windows
imageName: windows-latest
globalToolExeName: 'pwsh.exe'
globalToolPackageName: 'PowerShell.Windows.x64'
- template: templates/release-GlobalToolTest.yml
parameters:
jobName: LinuxWinGblTool
displayName: Global Tool Test Linux
imageName: ubuntu-latest
globalToolExeName: 'pwsh'
globalToolPackageName: 'PowerShell.Linux.x64'
- stage: ValidateFxdPackage
displayName: Validate Fxd Package
dependsOn: []
jobs:
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: WinFxdPackage
displayName: Fxd Package Test Win
imageName: windows-latest
packageNamePattern: '**/*win-fxdependent.zip'
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: FxdPackageWindDesktop
displayName: Fxd Package Test WinDesktop
imageName: windows-latest
packageNamePattern: '**/*win-fxdependentWinDesktop.zip'
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: FxdPackageLinux
displayName: Fxd Package Test Linux
imageName: ubuntu-latest
packageNamePattern: '**/*linux-x64-fxdependent.tar.gz'
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: FxdPackageLinuxonARM
displayName: Fxd Package Test Linux ARM64
imageName: 'PSMMSUbuntu20.04-ARM64-secure'
packageNamePattern: '**/*linux-x64-fxdependent.tar.gz'
use1ES: true
- stage: StaticPkgValidation
dependsOn: []
displayName: Static package validation
jobs:
- job: ValidatePkgNames
displayName: Validate Package Names
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Azure Blob variable group'
steps:
- template: templates/release-ValidatePackageNames.yml
- job: ValidatePkgBOM
displayName: Validate Package BOM
pool:
# testing
vmImage: ubuntu-latest
steps:
- template: templates/release-ValidatePackageBOM.yml
- stage: StartDocker
dependsOn: []
displayName: Kick Off Docker Staging build
jobs:
- deployment: PSDockerKickOff
displayName: Start Docker build
pool: server
environment: PSReleaseDockerKickOff
- stage: ManualValidation
dependsOn: []
displayName: Manual Validation
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Validate Windows Packages
jobName: ValidateWinPkg
instructions: |
Validate zip and msipackages on Windows Server 2012 R2
- template: templates/release/approvalJob.yml
parameters:
displayName: Validate OSX Packages
jobName: ValidateOsxPkg
instructions: |
Validate tar.gz package on osx-arm64
- stage: ReleaseAutomation
displayName: Release Automation
dependsOn: []
jobs:
- job: KickOffRA
displayName: Kickoff Release Automation
timeoutInMinutes: 240
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Get-ChildItem -Path $(Build.SourcesDirectory)
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName Release-Automation
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$packageBuildID = $(resources.pipeline.releasePipeline.runID)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$buildInvocationInfo = Start-AzDOBuild -BuildDefinitionId 10 -BuildArguments @{ POWERSHELL_PACKAGE_BUILD_BUILDID = $packageBuildID } -Tag $metadata.ReleaseVersion, 'InProgress' -PassThru
Write-Verbose -Verbose "Kicked off release automation:`n$($buildInvocationInfo | Out-String)"
$status = $buildInvocationInfo | Wait-AzDOBuildStatus -Status Completed -timeoutMinutes 240
if ($status.result -ne 'Succeeded') {
Write-Verbose "There are errors in release automation tests. Please triage failures."
}
- template: templates/release/approvalJob.yml
parameters:
displayName: Triage Release Automation Results
jobName: TriageRA
dependsOnJob: KickOffRA
instructions: |
Validate all the test failures and continue when signed off
- job: MarkRASignOff
displayName: Mark release automation signoff
dependsOn: TriageRA
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName Release-Automation
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$azDOBuild = Get-AzDOBuild -buildDefinitionId 10 -MaximumResult 100 | Where-Object { $_.tags -in $metadata.ReleaseVersion }
$azDoBuild | Remove-AzDOBuildTag -tag 'InProgress' -Pass | Add-AzDOBuildTag -tag 'SignedOff'
displayName: Signoff Release-Automation run
- stage: UpdateChangeLog
displayName: Update the changelog
# do not include stages that are likely to fail in dependency as there is no way to force deploy.
dependsOn:
- MSIXBundle
- ValidateSDK
- PRCreation
- StaticPkgValidation
- StartDocker
- ManualValidation
- ValidateFxdPackage
- ValidateGlobalTool
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Make sure the changelog is updated
jobName: MergeChangeLog
instructions: |
Update and merge the changelog for the release.
This step is required for creating GitHub draft release.
- stage: BlobPublic
displayName: Make Blob Public
# do not include stages that are likely to fail in dependency as there is no way to force deploy.
dependsOn: UpdateChangeLog
# The environment here is used for approval.
jobs:
- deployment: AzureBlobPublic
displayName: Make Azure Blob Public
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Staging_ACR'
environment: PSReleaseAzureBlobPublic
strategy:
runOnce:
deploy:
steps:
- template: templates/release-MakeContainerPublic.yml
- template: templates/release/approvalJob.yml
parameters:
displayName: Copy Global tool packages to PSInfra storage
jobName: CopyBlobApproval
instructions: |
Approval for Copy global tool packages to PSInfra storage
- job: PSInfraBlobPublic
displayName: Copy global tools to PSInfra storage
dependsOn: CopyBlobApproval
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'PSInfraStorage'
steps:
- template: templates/release-CopyGlobalTools.yml
parameters:
sourceContainerName: 'tool-private'
destinationContainerName: 'tool'
sourceStorageAccountName: '$(GlobalToolStorageAccount)'
destinationStorageAccountName: '$(PSInfraStorageAccount)'
blobPrefix: '$(Version)'
- stage: GitHubTasks
displayName: GitHub tasks
dependsOn: BlobPublic
jobs:
- job: GitHubDraft
displayName: Create GitHub Draft release
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Azure Blob variable group'
- group: mscodehub-feed-read-general
- group: mscodehub-feed-read-akv
- group: ReleasePipelineSecrets
steps:
- template: templates/release-CreateGitHubDraft.yml
- deployment: PushTag
dependsOn: GitHubDraft
displayName: Push Git Tag
pool : server
environment: PSReleasePushTag
- deployment: MakeDraftPublic
dependsOn: PushTag
displayName: Make GitHub Draft public
pool : server
environment: PSReleaseDraftPublic
- stage: PublishPackages
displayName: Publish packages
dependsOn: GitHubTasks
jobs:
- job: PublishNuget
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- template: templates/release-ReleaseToNuGet.yml
parameters:
skipPublish: ${{ parameters.skipNugetPublish }}
- job: PublishPkgsMsftCom
timeoutInMinutes: 120
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMSUbuntu20.04-Secure
variables:
- group: mscodehub-feed-read-general
- group: mscodehub-feed-read-akv
- group: 'packages.microsoft.com'
- group: 'mscodehub-code-read-akv'
steps:
- template: templates/release-PublishPackageMsftCom.yml
parameters:
skipPublish: ${{ parameters.skipPackagesMsftComPublish }}
- stage: PublishSymbols
displayName: Publish symbols
dependsOn: PublishPackages
jobs:
- job: PublishSymbol
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- template: templates/release-PublishSymbols.yml
- stage: ChangesToMaster
displayName: Ensure changes are in GH master
dependsOn: PublishPackages
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Make sure changes are in master
jobName: MergeToMaster
instructions: |
Make sure that changes README.md and metadata.json are merged into master on GitHub.
- stage: ReleaseDocker
displayName: Release Docker
dependsOn:
- GitHubTasks
jobs:
- deployment: ReleaseDocker
displayName: Release Docker
pool: server
environment: PSReleaseDockerRelease
- stage: ReleaseSnap
displayName: Release Snap
dependsOn:
- PublishPackages
- ChangesToMaster
variables:
# adds newPwshOrgName (exists in new and old org)
- group: PowerShellRelease
jobs:
- job: KickoffSnap
displayName: Kickoff Snap build
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName PowerShell
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$buildInvocationInfo = Start-AzDOBuild -BuildDefinitionId 49 -Tag $metadata.ReleaseVersion, 'InProgress' -PassThru
Write-Verbose -Verbose "Kicked off snap build: $($buildInvocationInfo.WebUrl)"
$status = $buildInvocationInfo | Wait-AzDOBuildStatus -Status Completed -timeoutMinutes 60
if ($status.result -ne 'Succeeded') {
throw "There are errors in snap build!!"
}
- template: templates/release/approvalJob.yml
parameters:
displayName: Approve the release
jobName: SnapEnd
dependsOnJob: KickoffSnap
instructions: |
Once the build is finished, approve the release of all channels.
- job: MarkSnapSignOff
displayName: Mark release automation signoff
dependsOn: SnapEnd
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName PowerShell
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$azDOBuild = Get-AzDOBuild -buildDefinitionId 49 -MaximumResult 100 | Where-Object { $_.tags -in $metadata.ReleaseVersion }
$azDoBuild | Remove-AzDOBuildTag -tag 'InProgress' -Pass | Add-AzDOBuildTag -tag 'SignedOff'
displayName: Signoff Release-Automation run
- stage: ReleaseToMU
displayName: Release to MU
dependsOn:
- PublishPackages
- ChangesToMaster
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Release to MU
instructions: |
Notify the PM team to start the process of releasing to MU.
- stage: UpdateDotnetDocker
dependsOn: GitHubTasks
displayName: Update DotNet SDK Docker images
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Update .NET SDK docker images
jobName: DotnetDocker
instructions: |
Create PR for updating dotnet-docker images to use latest PowerShell version.
1. Fork and clone https://github.com/dotnet/dotnet-docker.git
2. git checkout upstream/nightly -b updatePS
3. dotnet run --project .\eng\update-dependencies\ -- <dotnetversion> --product-version powershell=<powershellversion> --compute-shas
4. create PR targeting nightly branch
- stage: UpdateWinGet
dependsOn: GitHubTasks
displayName: Add manifest entry to winget
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Add manifest entry to winget
jobName: UpdateWinGet
instructions: |
This is typically done by the community 1-2 days after the release.
- stage: PublishMsix
dependsOn: GitHubTasks
displayName: Publish MSIX to store
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Publish the MSIX Bundle package to store
jobName: PublishMsix
instructions: |
Ask Steve to release MSIX bundle package to Store
- stage: BuildInfoJson
dependsOn: GitHubTasks
displayName: Upload BuildInfoJson
jobs:
- deployment: UploadJson
displayName: Upload BuildInfoJson
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Azure Blob variable group'
environment: PSReleaseBuildInfoJson
strategy:
runOnce:
deploy:
steps:
- template: templates/release-BuildJson.yml
- stage: ReleaseVPack
dependsOn: GitHubTasks
displayName: Release VPack
jobs:
- job: KickoffvPack
displayName: Kickoff vPack build
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner mscodehub -ProjectName PowerShellCore
Set-AzDoAuthToken -Token $(mscodehubBuildExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$releaseVersion = $metadata.ReleaseVersion -replace '^v',''
$semanticVersion = [System.Management.Automation.SemanticVersion]$releaseVersion
$isPreview = $semanticVersion.PreReleaseLabel -ne $null
if (-not $isPreview) {
$buildInvocationInfo = Start-AzDOBuild -BuildDefinitionId 1238 -Branch '$(Build.SourceBranch)' -Tag $metadata.ReleaseVersion, 'InProgress' -PassThru
Write-Verbose -Verbose "Kicked off vPack build: $($buildInvocationInfo.WebUrl)"
$status = $buildInvocationInfo | Wait-AzDOBuildStatus -Status Completed -timeoutMinutes 60
if ($status.result -ne 'Succeeded') {
throw "There are errors in snap build!!"
}
else {
$buildInvocationInfo | Remove-AzDOBuildTag -tag 'InProgress' -Pass | Add-AzDOBuildTag -tag 'SignedOff'
}
}
else {
Write-Verbose -Verbose "This is a preview release with version: $semanticVersion skipping releasing vPack"
}
- stage: ReleaseDeps
dependsOn: GitHubTasks
displayName: Update pwsh.deps.json links
jobs:
- template: templates/release-UpdateDepsJson.yml
- stage: ReleaseClose
displayName: Finish Release
dependsOn:
- ReleaseVPack
- BuildInfoJson
- UpdateDotnetDocker
- ReleaseDocker
- ReleaseSnap
- ChangesToMaster
- ReleaseDeps
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Retain Build
jobName: RetainBuild
instructions: |
Retain the build
- template: templates/release/approvalJob.yml
parameters:
displayName: Delete release branch
jobName: DeleteBranch
instructions: |
Delete release