Skip to content

Commit 622c020

Browse files
Create release pipeline as a yaml pipeline (#13394)
1 parent c20433a commit 622c020

12 files changed

Lines changed: 798 additions & 1 deletion
Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
1+
trigger: none
2+
3+
# needed to disable CI trigger and allow manual trigger
4+
# when the branch is same as pipline source, the latest build from the source is used.
5+
# all environment used are for manual tasks and approvals.
6+
7+
resources:
8+
pipelines:
9+
- pipeline: releasePipeline
10+
source: 'Coordinated Packages'
11+
trigger:
12+
branches:
13+
- release/*
14+
15+
variables:
16+
runCodesignValidationInjection: false
17+
18+
stages:
19+
- stage: ValidateSDK
20+
displayName: Validate SDK
21+
dependsOn: []
22+
jobs:
23+
- template: templates/release-SDKTests.yml
24+
parameters:
25+
jobName: WinSDK
26+
displayName: Windows SDK Test
27+
imageName: windows-latest
28+
29+
- template: templates/release-SDKTests.yml
30+
parameters:
31+
jobName: LinuxSDK
32+
displayName: Linux SDK Test
33+
imageName: ubuntu-latest
34+
35+
- template: templates/release-SDKTests.yml
36+
parameters:
37+
jobName: macOSSDK
38+
displayName: macOS SDK Test
39+
imageName: macOS-latest
40+
41+
- stage: PRCreation
42+
displayName: Create PR in GH Master
43+
dependsOn: []
44+
jobs:
45+
- deployment: CreatePRInMaster
46+
displayName: Update README.md and metadata.json
47+
pool: server
48+
environment: PSReleaseCreatePR
49+
50+
- stage: ValidateGlobalTool
51+
displayName: Validate Global Tool
52+
dependsOn: []
53+
jobs:
54+
- template: templates/release-GlobalToolTest.yml
55+
parameters:
56+
jobName: WinGblTool
57+
displayName: Global Tool Test Windows
58+
imageName: windows-latest
59+
globalToolExeName: 'pwsh.exe'
60+
globalToolPackageName: 'PowerShell.Windows.x64'
61+
62+
- template: templates/release-GlobalToolTest.yml
63+
parameters:
64+
jobName: LinuxWinGblTool
65+
displayName: Global Tool Test Linux
66+
imageName: ubuntu-latest
67+
globalToolExeName: 'pwsh'
68+
globalToolPackageName: 'PowerShell.Linux.x64'
69+
70+
- stage: ValidatePkgNames
71+
dependsOn: []
72+
displayName: Package Names validation
73+
jobs:
74+
- job: ValidatePkgNames
75+
pool:
76+
vmImage: windows-latest
77+
variables:
78+
- group: 'Azure Blob variable group'
79+
steps:
80+
- template: templates/release-ValidatePackageNames.yml
81+
82+
- stage: StartDocker
83+
dependsOn: []
84+
displayName: Kick Off Docker Staging build
85+
jobs:
86+
- deployment: PSDockerKickOff
87+
displayName: Start Docker build
88+
pool: server
89+
environment: PSReleaseDockerKickOff
90+
91+
- stage: ManualValidation
92+
dependsOn: []
93+
displayName: Manual Validation
94+
jobs:
95+
- deployment: ValidateWinPkg
96+
displayName: Validate Windows Packages
97+
pool: server
98+
environment: PSReleaseWinPkgValidate
99+
100+
- deployment: ValidateLinuxPkg
101+
displayName: Validate Linux Packages
102+
pool: server
103+
environment: PSReleaseLinuxPkgValidate
104+
105+
- stage: ReleaseAutomation
106+
displayName: Release Automation
107+
dependsOn: []
108+
jobs:
109+
- deployment: ReleaseAutomationKickOff
110+
displayName: Kick off release ReleaseAutomation
111+
pool: server
112+
environment: PSReleaseAutomationKickOff
113+
114+
- stage: GitHubDraftRelease
115+
displayName: Create GitHub draft release
116+
# do not include stages that are likely to fail in dependency as there is no way to force deploy.
117+
dependsOn:
118+
- ValidateSDK
119+
- PRCreation
120+
- ValidatePkgNames
121+
- StartDocker
122+
- ManualValidation
123+
- ReleaseAutomation
124+
125+
# The environment here is used for approval.
126+
jobs:
127+
- deployment: AzureBlobPublic
128+
displayName: Make Azure Blob Public
129+
pool:
130+
vmImage: windows-latest
131+
variables:
132+
- group: 'ACR'
133+
environment: PSReleaseAzureBlobPublic
134+
strategy:
135+
runOnce:
136+
deploy:
137+
steps:
138+
- template: templates/release-MakeContainerPublic.yml
139+
140+
- job: GitHubDraft
141+
displayName: Create GitHub Draft release
142+
pool:
143+
vmImage: windows-latest
144+
variables:
145+
- group: 'Azure Blob variable group'
146+
- group: 'AzDevOpsArtifacts'
147+
dependsOn: AzureBlobPublic
148+
steps:
149+
- template: templates/release-CreateGitHubDraft.yml
150+
151+
- stage: GitHubManualTasks
152+
displayName: GitHub manual tasks
153+
dependsOn: GitHubDraftRelease
154+
jobs:
155+
- deployment: UpdateChangeLog
156+
displayName: Update Change Log
157+
pool : server
158+
environment: PSReleaseUpdateChangeLog
159+
160+
- deployment: PushTag
161+
displayName: Push Git Tag
162+
pool : server
163+
environment: PSReleasePushTag
164+
165+
- deployment: MakeDraftPublic
166+
displayName: Make GitHub Draft public
167+
pool : server
168+
environment: PSReleaseDraftPublic
169+
170+
- stage: PublishPackages
171+
displayName: Publish packages
172+
dependsOn: GitHubManualTasks
173+
jobs:
174+
- job: PublishNuget
175+
pool:
176+
vmImage: windows-latest
177+
steps:
178+
- template: templates/release-ReleaseToNuGet.yml
179+
180+
- job: PublishPkgsMsftCom
181+
pool:
182+
vmImage: ubuntu-latest
183+
variables:
184+
- group: 'AzDevOpsArtifacts'
185+
- group: 'packages.microsoft.com'
186+
steps:
187+
- template: templates/release-PublishPackageMsftCom.yml
188+
189+
- stage: ChangesToMaster
190+
displayName: Ensure changes are in GH master
191+
dependsOn: PublishPackages
192+
jobs:
193+
- deployment: MergeToMaster
194+
displayName: Make sure changes are in master
195+
pool: server
196+
environment: PSReleaseChangesToMaster
197+
198+
- stage: ReleaseDocker
199+
displayName: Release Docker
200+
dependsOn:
201+
- StartDocker
202+
jobs:
203+
- deployment: ReleaseDocker
204+
displayName: Release Docker
205+
pool: server
206+
environment: PSReleaseDockerRelease
207+
208+
- stage: ReleaseSnap
209+
displayName: Release Snap
210+
dependsOn:
211+
- PublishPackages
212+
- ChangesToMaster
213+
jobs:
214+
- deployment: ReleaseSnap
215+
displayName: Release Snap
216+
pool: server
217+
environment: PSReleaseSnapRelease
218+
219+
- stage: UpdateDotnetDocker
220+
dependsOn: GitHubManualTasks
221+
displayName: Update DotNet SDK Docker images
222+
jobs:
223+
- deployment: DotnetSDkDocker
224+
displayName: Update .NET SDK docker images
225+
pool: server
226+
environment: PSReleaseUpdateDotnetDocker
227+
228+
- stage: BuildInfoJson
229+
dependsOn: GitHubManualTasks
230+
displayName: Upload BuildInfoJson
231+
jobs:
232+
- job: UploadJson
233+
pool:
234+
vmImage: windows-latest
235+
variables:
236+
- group: 'Azure Blob variable group'
237+
steps:
238+
- template: templates/release-BuildJson.yml
239+
240+
- stage: ReleaseVPack
241+
dependsOn: GitHubManualTasks
242+
displayName: Release VPack
243+
jobs:
244+
- deployment: ReleaseVPackManual
245+
displayName: Release VPack
246+
pool: server
247+
environment: PSReleaseVpack
248+
249+
- stage: ReleaseDeps
250+
dependsOn: GitHubManualTasks
251+
displayName: Update pwsh.deps.json links
252+
jobs:
253+
- template: templates/release-UpdateDepsJson.yml
254+
255+
- stage: ReleaseClose
256+
displayName: Finish Release
257+
dependsOn:
258+
- ReleaseVPack
259+
- BuildInfoJson
260+
- UpdateDotnetDocker
261+
- ReleaseDocker
262+
- ReleaseSnap
263+
- ChangesToMaster
264+
- ReleaseDeps
265+
jobs:
266+
- deployment: RetainBuild
267+
displayName: Retain Build
268+
pool: server
269+
environment: PSReleaseRetainBuild
270+
271+
- deployment: DeleteBranch
272+
displayName: Delete release branch
273+
pool: server
274+
environment: PSReleaseDeleteBranch

tools/releaseBuild/azureDevOps/templates/nuget.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,18 @@ jobs:
137137
binVersionOverride: $(SigningVersionOverride)
138138
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
139139

140+
- pwsh: |
141+
if (-not (Test-Path '$(System.ArtifactsDirectory)\signed\')) { $null = New-Item -ItemType Directory -Path '$(System.ArtifactsDirectory)\signed\' }
142+
Copy-Item -Path '$(PackagePath)\*.nupkg' -Destination '$(System.ArtifactsDirectory)\signed\' -Verbose -Force
143+
Copy-Item -Path '$(PackagePath)\globaltool\*.nupkg' -Destination '$(System.ArtifactsDirectory)\signed\' -Verbose -Force
144+
displayName: Fake copy when not signing
145+
condition: eq(variables['SHOULD_SIGN'], 'false')
146+
140147
- powershell: |
141148
Import-Module $(Build.SourcesDirectory)\build.psm1 -Force
142149
Get-ChildItem -Recurse "$(System.ArtifactsDirectory)\signed\*.nupkg" -Verbose | ForEach-Object { Start-NativeExecution -sb { nuget.exe verify -All $_.FullName } }
143150
displayName: Verify all packages are signed
151+
condition: eq(variables['SHOULD_SIGN'], 'true')
144152
145153
- task: securedevelopmentteam.vss-secure-development-tools.build-task-antimalware.AntiMalware@3
146154
displayName: 'Run MpCmdRun.exe'
@@ -156,7 +164,11 @@ jobs:
156164
artifactPath: '$(System.ArtifactsDirectory)\signed'
157165

158166
- powershell: |
159-
$null = New-Item -Path "$(System.ArtifactsDirectory)\signed\globaltool" -ItemType Directory
167+
if (-not (Test-Path "$(System.ArtifactsDirectory)\signed"))
168+
{
169+
$null = New-Item -Path "$(System.ArtifactsDirectory)\signed\globaltool" -ItemType Directory
170+
}
171+
160172
Move-Item -Path "$(System.ArtifactsDirectory)\signed\PowerShell.*" -Destination "$(System.ArtifactsDirectory)\signed\globaltool" -Force
161173
Get-ChildItem "$(System.ArtifactsDirectory)\signed\globaltool" -Recurse
162174
displayName: Move global tool packages to subfolder and capture
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
steps:
2+
- download: releasePipeline
3+
artifact: BuildInfoJson
4+
5+
- pwsh: |
6+
$jsonFile = Get-Item "$ENV:PIPELINE_WORKSPACE/releasePipeline/BuildInfoJson/*.json"
7+
$fileName = Split-Path $jsonFile -Leaf
8+
9+
$dateTime = [datetime]::UtcNow
10+
$dateTime = [datetime]::new($dateTime.Ticks - ($dateTime.Ticks % [timespan]::TicksPerSecond), $dateTime.Kind)
11+
12+
$buildInfo = Get-Content $jsonFile | ConvertFrom-Json
13+
$buildInfo.ReleaseDate = $dateTime
14+
15+
$targetFile = "$ENV:PIPELINE_WORKSPACE/$fileName"
16+
ConvertTo-Json -InputObject $buildInfo | Out-File $targetFile -Encoding ascii
17+
18+
$vstsCommandString = "vso[task.setvariable variable=BuildInfoJsonFile]$targetFile"
19+
Write-Host "sending " + $vstsCommandString
20+
Write-Host "##$vstsCommandString"
21+
22+
23+
## Create 'lts.json' if it's the latest stable and also a LTS release.
24+
25+
$vstsCommandCopyLTSBuildInfo = "vso[task.setvariable variable=CopyLTSBuildInfo]NO"
26+
27+
if ($fileName -eq "stable.json")
28+
{
29+
$releaseTag = $buildInfo.ReleaseTag
30+
$version = $releaseTag -replace '^v'
31+
$semVersion = [System.Management.Automation.SemanticVersion] $version
32+
33+
if ($semVersion.PreReleaseLabel -eq $null -and $semVersion.Minor % 2 -eq 0 -and $semVersion.Major -ge 7)
34+
{
35+
$ltsFile = "$ENV:PIPELINE_WORKSPACE/lts.json"
36+
Copy-Item -Path $targetFile -Destination $ltsFile -Force
37+
$vstsCommandLtsJsonFile = "vso[task.setvariable variable=LtsBuildInfoJsonFile]$ltsFile"
38+
$vstsCommandCopyLTSBuildInfo = "vso[task.setvariable variable=CopyLTSBuildInfo]YES"
39+
}
40+
}
41+
42+
Write-Host "sending " + $vstsCommandCopyLTSBuildInfo
43+
Write-Host "##$vstsCommandCopyLTSBuildInfo"
44+
45+
if ($vstsCommandLtsJsonFile)
46+
{
47+
Write-Host "sending " + $vstsCommandLtsJsonFile
48+
Write-Host "##$vstsCommandLtsJsonFile"
49+
}
50+
displayName: Download and Capture NuPkgs
51+
52+
- task: AzureFileCopy@2
53+
displayName: 'AzureBlob build info JSON file Copy'
54+
inputs:
55+
SourcePath: '$(BuildInfoJsonFile)'
56+
azureSubscription: '$(AzureFileCopySubscription)'
57+
Destination: AzureBlob
58+
storage: '$(StorageAccount)'
59+
ContainerName: BuildInfo
60+
61+
- task: AzureFileCopy@2
62+
displayName: 'AzureBlob build info ''lts.json'' Copy when needed'
63+
inputs:
64+
SourcePath: '$(LtsBuildInfoJsonFile)'
65+
azureSubscription: '$(AzureFileCopySubscription)'
66+
Destination: AzureBlob
67+
storage: '$(StorageAccount)'
68+
ContainerName: BuildInfo
69+
condition: and(succeeded(), eq(variables['CopyLTSBuildInfo'], 'YES'))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
steps:
2+
- download: none
3+
4+
- template: release-SetReleaseTagAndContainerName.yml
5+
6+
- pwsh: |
7+
$azcopy = "C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe"
8+
& $azcopy /Source:https://$(StorageAccount).blob.core.windows.net/$(AzureVersion) /Dest:$(System.ArtifactsDirectory) /S /SourceKey:$(StorageAccountKey)
9+
displayName: Download Azure Artifacts
10+
11+
- pwsh: |
12+
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse | Select-Object -ExpandProperty Name
13+
displayName: Capture downloaded artifacts
14+
15+
- pwsh: |
16+
git clone https://$(AzureDevOpsPat)@mscodehub.visualstudio.com/PowerShellCore/_git/Internal-PowerShellTeam-Tools '$(Pipeline.Workspace)/tools'
17+
displayName: Clone Internal-Tools repository
18+
19+
- pwsh: |
20+
Import-module '$(Pipeline.Workspace)/tools/Scripts/GitHubRelease.psm1'
21+
Publish-ReleaseDraft -Tag '$(ReleaseTag)' -Name '$(ReleaseTag) Release of PowerShell' -Description '<-- Update Me -->' -User PowerShell -Repository PowerShell -PackageFolder $(System.ArtifactsDirectory) -Token $(GitHubReleasePat)
22+
displayName: Publish Release Draft

0 commit comments

Comments
 (0)